Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAttacker authenticates to application and reads own AES.CTR-encrypted column
-
DeliveryXOR known plaintext against observed ciphertext to derive keystream
-
ExploitCraft same-length ETF decompression bomb or atom-flood payload
-
InstallWrite forged ciphertext to own record via application or direct DB
-
C2Application loads column and invokes AshCloak.Calculations.Decrypt
-
Executenon_executable_binary_to_term without :safe inflates bomb or interns atoms
-
ImpactBEAM node crashes, all tenants lose availability
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V1 - Encoding and Sanitization Safe deserialization, type allowlists
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The primary (network-reachable) attack path requires two conditions to both be true: (1) the application has configured Cloak's unauthenticated AES.CTR cipher for at least one encrypted column - this is a non-default cipher that must be explicitly selected in the Cloak configuration; and (2) the attacker holds application-layer credentials sufficient to read the ciphertext of their own encrypted column value and write a forged column value of the same byte length back to the datastore. The atom-flood and decompression-bomb payloads are equally viable once forged column bytes reach the decoder. If only authenticated ciphers (AES.GCM or similar) are deployed, the XOR-forgery path is blocked by vault.decrypt!() MAC verification, and exploitation is limited to adversaries with direct raw database write access, bypassing the application entirely. Limiting factors beyond cipher choice include: the attacker's column value must be of the same byte length as the intended forged payload for CTR-mode forgery to work; and the crash is triggered on the next column read, so timing is attacker-controlled but not instant. |
| Impact | The reported CVSS 4.0 score of 5.9 with AV:L models the conservative scenario requiring local or direct database write access, but the description explicitly documents a more accessible attack path: an application-layer user with AES.CTR-encrypted columns can forge ciphertext over the network without key material. AT:P (attack requirements present) correctly captures the conditional dependency on AES.CTR being configured. The impact is exclusively availability (VA:H): a node-wide BEAM crash affecting all tenants sharing the runtime - no confidentiality or integrity impact. EPSS data is not provided in the input; given the specific configuration prerequisite (AES.CTR must be deployed and the attacker must control a column), opportunistic mass exploitation is unlikely, suggesting a lower real-world exploitation probability than an unqualified DoS framing implies. Active exploitation is not confirmed - not in CISA KEV. However, once the attack path is understood, the XOR-forgery step requires only knowledge of one's own plaintext and is computationally trivial. The CVSS PR:N is potentially misleading: writing a forged column value almost certainly requires at minimum application-layer user credentials, suggesting PR:L better reflects real-world conditions. This is a moderate-priority finding for AES.CTR deployments; authenticated-cipher-only deployments face a substantially narrower attack surface. |
| Exploit ScenarioDerived | An authenticated user of an Ash Framework web application reads their own AES.CTR-encrypted column value, XORs the known plaintext against the returned ciphertext to recover the keystream, and constructs a same-length forged ciphertext encoding a compressed ETF decompression bomb. The user writes this forged value back to their own record via a normal application update endpoint. The next time any code path loads that column - by the attacker, an admin, or a background job - AshCloak.Calculations.Decrypt decodes the forged ETF, the BEAM node runs out of memory inflating the bomb, and the entire Elixir application crashes, taking all concurrent users offline. No publicly available exploit code was identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAI
Unsafe Erlang term deserialization in ash_cloak 0.1.0-0.3.x allows an attacker who can influence encrypted column bytes to crash the BEAM runtime node via unbounded atom table exhaustion or a decompression bomb. Applications configured with Cloak's unauthenticated AES.CTR cipher are the highest-risk targets: an authenticated application user who knows their own plaintext can XOR-derive the keystream and write a forged ciphertext of equal length without the encryption key, causing the deserialization to fire on any subsequent column read. No public exploit code has been identified at time of analysis, and the vulnerability is not listed in CISA KEV, but the patch commit confirms two distinct, low-skill attack primitives against unpatched deployments.
RemediationAI
Upgrade ash_cloak to version 0.4.0 or later, which closes both attack primitives: the fix rejects all compressed ETF payloads outright (matching magic bytes <<131, 80>>) before deserialization, and passes the :safe option to binary_to_term to prevent interning of attacker-supplied atoms. The patch commit is https://github.com/ash-project/ash_cloak/commit/1690f0a436efe3e7c11d70d74ff5a8ac0fdf6608. If immediate upgrade is not possible, the most effective compensating control is to replace the Cloak AES.CTR cipher with an authenticated cipher such as AES.GCM for all encrypted columns; this eliminates the XOR-forgery path and causes vault.decrypt!() to reject tampered ciphertexts before they reach the deserializer. Note that column re-encryption is required after the cipher change, and read compatibility during migration must be managed carefully. Applications that cannot change cipher or upgrade should restrict column write access at the database layer to application service accounts only, reducing (but not eliminating) the direct-DB-write attack surface. The advisory is at https://github.com/ash-project/ash_cloak/security/advisories/GHSA-rc26-mrm2-6pf9.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
ash_cloak is an Elixir library for the Ash Framework that encrypts resource columns using the Cloak encryption library. The defect resides in AshCloak.Calculations.Decrypt, which passes decrypted bytes to Ash.Helpers.non_executable_binary_to_term/1 - a thin wrapper around Erlang's built-in binary_to_term/1 - without the :safe flag. In the BEAM runtime, atoms created via binary_to_term are permanently interned in a finite global table (default ~1 million entries); feeding a stream of novel atom terms exhausts this table and crashes the node. Separately, the Erlang External Term Format (ETF) supports zlib-compressed payloads identified by the magic bytes <<131, 80>>; binary_to_term transparently inflates these regardless of :safe, so a kilobyte-compressed payload can expand to gigabytes of heap, triggering OOM. The CWE-502 root cause is the direct application of a powerful, unrestricted deserialization primitive to attacker-controlled bytes. The unauthenticated Cloak cipher AES.CTR in stream mode leaks keystream to any user who can observe their own plaintext-ciphertext pair, enabling bit-exact ciphertext forgery without the key. Authenticated ciphers (e.g., AES.GCM) block this path at vault.decrypt!(). Affected CPE: cpe:2.3:a:ash-project:ash_cloak:*:*:*:*:*:*:*:* covering all releases from 0.1.0 to pre-0.4.0.
Know when Ash Cloak gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Network-reachable via AES.CTR forgery path; AC:H because AES.CTR must be explicitly configured; PR:L because attacker requires application user credentials to read and write encrypted columns.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Deserialization of Untrusted Data vulnerability in ash-project ash_cloak allows an attacker who can influence the bytes of an encrypted column to crash the BEAM node, by triggering unbounded atom creation or a decompression bomb during decryption.
AshCloak.Calculations.Decrypt decodes the decrypted binary with Ash.Helpers.non_executable_binary_to_term/1 without the :safe option, so atoms in the payload are interned during the decode and never garbage collected, and the term format's compressed form is inflated transparently. vault.decrypt!() is the only barrier and stops tampering only for an authenticated cipher. Cloak also ships the unauthenticated AES.CTR, whose ciphertext an attacker who knows their own plaintext can XOR into any same-length payload without the key, so an ordinary read of the forged column reaches the decoder. A few hundred kilobytes of distinct atoms exhausts the atom table, or a small compressed payload inflates to gigabytes.
This issue affects ash_cloak: from 0.1.0 before 0.4.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Insecure deserialization occurs when an application converts serialized data (a stream of bytes representing an object's state) back into a living object without proper validation.
EUVD-2026-68281
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB