CVE-2025-14762
Medium · 5.3CVSS
5.3
EPSS
0.2%
Published
Dec 17, 2025
CISA due date
—
Cloudanix analysis
Someone who can already write to certain encrypted cloud storage files may be able to tamper with how they decrypt, causing applications to trust altered data.
- Exploitation
- Remote Authenticated
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Data Tampering
- Component
- Library
- Class
- Cryptographic Weakness
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
This is a cryptographic integrity weakness in AWS SDK for Ruby client-side S3 encryption when encrypted data keys are stored in separate S3 instruction files rather than in object metadata. Because the encrypted data key is not cryptographically bound strongly enough to the encrypted object, a principal that can write to the same S3 bucket may be able to alter or introduce an additional encrypted data key entry so that decryption succeeds but yields attacker-influenced or different plaintext than the application expects. The primary impact is data integrity compromise during decryption; confidentiality and availability are not the main impacts based on the provided assessment. Exploitation requires existing write access to the bucket and use of the affected instruction-file encryption mode.
Why it matters to the business
Applications relying on affected AWS SDK for Ruby client-side encryption may process tampered S3 data as if it were legitimate, which can lead to incorrect business decisions, corrupted records, unsafe automation, or loss of trust in stored encrypted content. The issue is not currently listed in CISA KEV, is not marked as ransomware-associated, has very low EPSS, and requires prior bucket write permission, so broad opportunistic exploitation is less likely; however, the risk is higher for systems where multiple users, services, partners, or automation roles can write to buckets containing encrypted objects. If the listed Debian package context is applicable to an environment, use the vendor fixed version as well, but the described vulnerable component is AWS SDK for Ruby.
How an attack unfolds
An attacker first needs valid credentials or another path that gives write access to an S3 bucket containing objects encrypted by the affected AWS SDK for Ruby client-side encryption workflow. The attacker identifies objects that use separate instruction files for encryption metadata, commonly represented as companion S3 objects associated with the encrypted payload. Instead of needing to break encryption, the attacker manipulates the instruction file content or adds an alternate encrypted data key structure that the vulnerable client may accept during decryption. When an application later retrieves and decrypts the object using the vulnerable SDK, the SDK can accept the modified key material path and produce different plaintext than the legitimate object should yield. If threat activity attributed to Invisible Salamanders is relevant to monitoring, treat unusual S3 write activity against instruction files and encryption metadata as higher priority, especially when performed by identities that do not normally manage encrypted object metadata.
How to fix it
Upgrade AWS SDK for Ruby to version 1.208.0 or later wherever the SDK is used for S3 client-side encryption. Inventory Ruby applications, container images, serverless functions, build artifacts, and dependency lockfiles for aws-sdk-ruby or related AWS SDK gems and rebuild/redeploy after upgrading. If Debian 13 package guidance is relevant in a given distribution context, apply the listed fixed package version linux 6.12.15-1, but prioritize the SDK upgrade because the described flaw is in AWS SDK for Ruby behavior. Where immediate upgrade is not possible, reduce risk by disabling or migrating away from instruction-file-based encryption metadata, preferring fixed SDK behavior and metadata formats with proper key commitment; restrict S3 write permissions to only trusted services; prevent untrusted principals from writing companion instruction files; enable S3 versioning and Object Lock where appropriate; and add bucket policies or application controls that deny unexpected writes to instruction-file objects.
How to confirm the fix worked
Confirm all deployed Ruby applications use AWS SDK for Ruby version 1.208.0 or later by checking Gemfile.lock, gem inventory, container SBOMs, CI dependency reports, and runtime package listings. Search application code and configuration for S3 client-side encryption usage and specifically for instruction-file storage of encryption metadata. Validate S3 bucket policies and IAM policies to ensure only expected principals can write encrypted objects and their companion instruction files. Review representative S3 objects to determine whether instruction files are present and whether version history shows unexpected changes. After remediation, run integration tests that encrypt and decrypt S3 objects with the upgraded SDK and verify tamper attempts against instruction-file metadata are rejected or fail safely.
Typical attack path
- Obtain or abuse credentials for an IAM user, role, workload identity, or service with write permission to the target S3 bucket.
- Enumerate bucket contents or observe application behavior to identify objects encrypted with AWS SDK for Ruby client-side encryption using separate instruction files.
- Locate companion instruction files or encryption metadata associated with encrypted S3 objects.
- Modify an existing instruction file or introduce a new encrypted data key entry that is accepted by vulnerable SDK versions.
- Wait for a legitimate application, batch job, or user workflow to retrieve and decrypt the affected object.
- Cause the application to consume altered plaintext while treating it as valid decrypted content.
How to detect it
Detection should focus on evidence of tampering with S3 instruction files and encryption metadata, because exploitation requires prior write access to the bucket. Review CloudTrail S3 data events, S3 server access logs, object version history, IAM Access Analyzer findings, AWS Config changes, application decryption errors, and application integrity-check failures. Look for PutObject, CopyObject, DeleteObject, DeleteObjectVersion, CompleteMultipartUpload, or RestoreObject events against instruction-file companion objects, especially object keys ending in .instruction or containing JSON encryption metadata fields. Compare object and instruction-file version timestamps: suspicious cases include instruction files modified without a corresponding encrypted object update, modified by a different principal than the application normally uses, written from unusual source IPs or user agents, or changed shortly before downstream data integrity issues. Inspect S3 object versions for changes to encryption fields such as encrypted data key, wrapping algorithm, content encryption algorithm, IV, material description, or tag length. Application logs may show decryption failures, unexpected plaintext validation failures, parsing errors after successful S3 retrieval, or sudden data mismatches. If Invisible Salamanders is a tracked threat actor in the organization’s intelligence sources, correlate suspicious S3 metadata writes with actor-associated credentials, infrastructure, user agents, and time windows. Absence of a public KEV listing and low EPSS reduce likelihood of broad exploitation, but do not rule out targeted abuse by an insider or compromised cloud identity.
- .instruction
- eventName=PutObject
- eventName=CopyObject
- eventName=DeleteObject
- eventName=DeleteObjectVersion
- eventName=CompleteMultipartUpload
- x-amz-key
- x-amz-key-v2
- x-amz-iv
- x-amz-matdesc
- x-amz-wrap-alg
- x-amz-cek-alg
- x-amz-tag-len
- x-amz-unencrypted-content-length
- x-amz-meta-x-amz-key
- x-amz-meta-x-amz-key-v2
- x-amz-meta-x-amz-iv
- x-amz-meta-x-amz-matdesc
- x-amz-meta-x-amz-wrap-alg
- x-amz-meta-x-amz-cek-alg
What your security team should do
- Prioritize upgrading AWS SDK for Ruby to 1.208.0 or later in applications that perform client-side S3 encryption and use instruction files.
- Identify buckets containing instruction-file-based encrypted objects and enable S3 data event logging for read/write operations on those buckets if not already enabled.
- Review IAM and bucket policies to remove broad s3:PutObject, s3:DeleteObject, s3:PutObjectAcl, and copy/write permissions from identities that do not explicitly need them.
- Enable S3 Versioning, and where operationally suitable, Object Lock or retention controls for buckets holding high-integrity encrypted data.
- Create detections for writes, deletes, or copies involving instruction-file objects, especially from new principals, unusual source IPs, automation roles outside their normal schedule, or identities linked to recent credential exposure.
- Hunt historical CloudTrail S3 data events for instruction-file modifications before application data anomalies or decryption discrepancies.
- If threat intelligence for Invisible Salamanders is applicable, enrich S3 write-event investigations with known infrastructure, credential-use patterns, and identity anomalies associated with that activity.
- Document and migrate legacy client-side encryption patterns toward supported SDK versions and encryption modes with key commitment.
The record
Missing cryptographic key commitment in the AWS SDK for Ruby may allow a user with write access to the S3 bucket to introduce a new EDK that decrypts to different plaintext when the encrypted data key is stored in an "instruction file" instead of S3's metadata record. To mitigate this issue, upgrade AWS SDK for Ruby to version 1.208.0 or later.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| RubyGems | aws-sdk-s3 | 0 | 1.208.0 |
| Chainguard | gitlab-rails-ce-assets-18.1 | 0 | 18.1.6-r2 |
| Chainguard | gitlab-rails-ce-assets-18.2 | 0 | 18.2.8-r3 |
| Chainguard | gitlab-rails-ce-assets-18.3 | 0 | 18.3.6-r1 |
| Chainguard | gitlab-rails-ce-assets-18.4 | 0 | 18.4.6-r0 |
| Chainguard | gitlab-rails-ce-assets-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-rails-ce-assets-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-rails-ce-assets-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-rails-ce-assets-fips-18.1 | 0 | 18.1.6-r4 |
| Chainguard | gitlab-rails-ce-assets-fips-18.2 | 0 | 18.2.8-r3 |
| Chainguard | gitlab-rails-ce-assets-fips-18.3 | 0 | 18.3.6-r1 |
| Chainguard | gitlab-rails-ce-assets-fips-18.4 | 0 | 18.4.6-r0 |
| Chainguard | gitlab-rails-ce-assets-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-rails-ce-assets-fips-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-rails-ce-assets-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-rails-ce-doc-18.1 | 0 | 18.1.6-r2 |
| Chainguard | gitlab-rails-ce-doc-18.2 | 0 | 18.2.8-r3 |
| Chainguard | gitlab-rails-ce-doc-18.3 | 0 | 18.3.6-r1 |
| Chainguard | gitlab-rails-ce-doc-18.4 | 0 | 18.4.6-r0 |
| Chainguard | gitlab-rails-ce-doc-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-rails-ce-doc-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-rails-ce-doc-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-rails-ce-doc-fips-18.1 | 0 | 18.1.6-r4 |
| Chainguard | gitlab-rails-ce-doc-fips-18.2 | 0 | 18.2.8-r3 |
| Chainguard | gitlab-rails-ce-doc-fips-18.3 | 0 | 18.3.6-r1 |
| Chainguard | gitlab-rails-ce-doc-fips-18.4 | 0 | 18.4.6-r0 |
| Chainguard | gitlab-rails-ce-doc-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-rails-ce-doc-fips-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-rails-ce-doc-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | kube-fluentd-operator | 0 | 1.18.2-r54 |
| Chainguard | kube-fluentd-operator-compat | 0 | 1.18.2-r54 |
| Chainguard | kube-fluentd-operator-default-config | 0 | 1.18.2-r54 |
| Chainguard | kube-fluentd-operator-oci-entrypoint | 0 | 1.18.2-r54 |
| Chainguard | logstash-8.17 | 0 | 8.17.10-r7 |
| Chainguard | logstash-8.17-bitnami-compat | 0 | 8.17.10-r7 |
| Chainguard | logstash-8.17-compat | 0 | 8.17.10-r7 |
| Chainguard | logstash-8.17-env2yaml | 0 | 8.17.10-r7 |
| Chainguard | logstash-8.17-iamguarded-compat | 0 | 8.17.10-r7 |
| Chainguard | logstash-8.17-with-output-opensearch | 0 | 8.17.10-r7 |
| Chainguard | logstash-8.18 | 0 | 8.18.8-r5 |
| Chainguard | logstash-8.18-bitnami-compat | 0 | 8.18.8-r5 |
| Chainguard | logstash-8.18-compat | 0 | 8.18.8-r5 |
| Chainguard | logstash-8.18-env2yaml | 0 | 8.18.8-r5 |
| Chainguard | logstash-8.18-iamguarded-compat | 0 | 8.18.8-r5 |
| Chainguard | logstash-8.18-with-output-opensearch | 0 | 8.18.8-r5 |
| Chainguard | logstash-8.19 | 0 | 8.19.9-r1 |
| Chainguard | logstash-8.19-compat | 0 | 8.19.9-r1 |
| Chainguard | logstash-8.19-env2yaml | 0 | 8.19.9-r1 |
| Chainguard | logstash-8.19-iamguarded-compat | 0 | 8.19.9-r1 |
| Chainguard | logstash-8.19-with-output-opensearch | 0 | 8.19.9-r1 |
| Chainguard | logstash-9.0 | 0 | 9.0.8-r6 |
| Chainguard | logstash-9.0-bitnami-compat | 0 | 9.0.8-r6 |
| Chainguard | logstash-9.0-compat | 0 | 9.0.8-r6 |
| Chainguard | logstash-9.0-env2yaml | 0 | 9.0.8-r6 |
| Chainguard | logstash-9.0-iamguarded-compat | 0 | 9.0.8-r6 |
| Chainguard | logstash-9.0-with-output-opensearch | 0 | 9.0.8-r6 |
| Chainguard | logstash-9.1 | 0 | 9.1.8-r2 |
| Chainguard | logstash-9.1-bitnami-compat | 0 | 9.1.8-r2 |
| Chainguard | logstash-9.1-compat | 0 | 9.1.8-r2 |
| Chainguard | logstash-9.1-env2yaml | 0 | 9.1.8-r2 |
| Chainguard | logstash-9.1-iamguarded-compat | 0 | 9.1.8-r2 |
| Chainguard | logstash-9.1-with-output-opensearch | 0 | 9.1.8-r2 |
| Chainguard | logstash-9.2 | 0 | 9.2.3-r0 |
| Chainguard | logstash-9.2-bitnami-compat | 0 | 9.2.2-r2 |
| Chainguard | logstash-9.2-compat | 0 | 9.2.2-r2 |
| Chainguard | logstash-9.2-env2yaml | 0 | 9.2.2-r2 |
| Chainguard | logstash-9.2-iamguarded-compat | 0 | 9.2.2-r2 |
| Chainguard | logstash-9.2-with-output-opensearch | 0 | 9.2.3-r0 |
| Chainguard | ruby3.2-aws-sdk-s3 | 0 | 1.209.0-r0 |
| Chainguard | ruby3.3-aws-sdk-s3 | 0 | 1.217.0-r0 |
| Chainguard | ruby3.4-aws-sdk-s3 | 0 | 1.217.0-r0 |
| Chainguard | ruby4.0-aws-sdk-s3 | 0 | 1.217.0-r0 |
| Wolfi | kube-fluentd-operator | 0 | 1.18.2-r54 |
| Wolfi | kube-fluentd-operator-compat | 0 | 1.18.2-r54 |
| Wolfi | kube-fluentd-operator-default-config | 0 | 1.18.2-r54 |
| Wolfi | kube-fluentd-operator-oci-entrypoint | 0 | 1.18.2-r54 |
| Wolfi | logstash-9.1 | 0 | 9.1.8-r2 |
| Wolfi | logstash-9.1-bitnami-compat | 0 | 9.1.8-r2 |
| Wolfi | logstash-9.1-compat | 0 | 9.1.8-r2 |
| Wolfi | logstash-9.1-env2yaml | 0 | 9.1.8-r2 |
| Wolfi | logstash-9.1-iamguarded-compat | 0 | 9.1.8-r2 |
| Wolfi | logstash-9.1-with-output-opensearch | 0 | 9.1.8-r2 |
| Wolfi | logstash-9.2 | 0 | 9.2.3-r0 |
| Wolfi | logstash-9.2-bitnami-compat | 0 | 9.2.2-r2 |
| Wolfi | logstash-9.2-compat | 0 | 9.2.2-r2 |
| Wolfi | logstash-9.2-env2yaml | 0 | 9.2.2-r2 |
| Wolfi | logstash-9.2-iamguarded-compat | 0 | 9.2.2-r2 |
| Wolfi | logstash-9.2-with-output-opensearch | 0 | 9.2.3-r0 |
| Wolfi | ruby3.2-aws-sdk-s3 | 0 | 1.209.0-r0 |
| Wolfi | ruby3.3-aws-sdk-s3 | 0 | 1.217.0-r0 |
| Wolfi | ruby3.4-aws-sdk-s3 | 0 | 1.217.0-r0 |
| Wolfi | ruby4.0-aws-sdk-s3 | 0 | 1.217.0-r0 |
Related vulnerabilities
- CVE-2026-1182 GitLab has remediated an issue in GitLab CE/EE affecting all versions from 8.14 before… Also affects gitlab-rails-ce-assets-18.1
- CVE-2026-1458 GitLab has remediated an issue in GitLab CE/EE affecting all versions from 8.0 before… Also affects gitlab-rails-ce-assets-18.1
- CVE-2026-0595 GitLab has remediated an issue in GitLab CE/EE affecting all versions from 13.9 before… Also affects gitlab-rails-ce-assets-18.1
- CVE-2025-24293 # Active Storage allowed transformation methods potentially unsafe Active Storage… Also affects gitlab-rails-ce-assets-18.1
- GHSA-3966-f6p6-2qr9 Duplicate Advisory: npm cli Uncontrolled Search Path Element Local Privilege Escalation… Also affects gitlab-rails-ce-assets-18.1
- CVE-2026-0775 npm cli Incorrect Permission Assignment Local Privilege Escalation Vulnerability. Also affects gitlab-rails-ce-assets-18.1
- CVE-2025-3950 Exposure of Private Personal Information to an Unauthorized Actor in GitLab Also affects gitlab-rails-ce-assets-18.1
- CVE-2025-10569 Allocation of Resources Without Limits or Throttling in GitLab Also affects gitlab-rails-ce-assets-18.1