CVE-2026-95105 (GCVE-0-2026-95105)

Vulnerability from cvelistv5 – Published: 2026-10-06 08:37 – Updated: 2026-10-06 11:40
VLAI
Title
Cloak AES-CTR cipher lacks ciphertext authentication, allowing chosen-plaintext forgery by bit flipping
Summary
Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping. Cloak.Ciphers.AES.CTR encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. decrypt/2 checks only the key tag and the minimum length before it returns the plaintext, and Cloak.Ciphers.Deprecated.AES.CTR decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error. This issue affects cloak: from 0.1.0-pre onward.
SSVC
Exploitation: poc Automatable: no Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-10-06 11:37 UTC
CWE
  • CWE-649 - Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking
Impacted products
Vendor Product Version CPE status
danielberkompas cloak Affected: 0.1.0-pre , < * (semver)
    cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*
Create a notification for this product.
danielberkompas cloak Affected: 2bd17019e285b55c5c218cc842537bf9280f24c3 , < * (git)
    cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "adp": [
      {
        "metrics": [
          {
            "other": {
              "content": {
                "id": "CVE-2026-95105",
                "options": [
                  {
                    "Exploitation": "poc"
                  },
                  {
                    "Automatable": "no"
                  },
                  {
                    "Technical Impact": "partial"
                  }
                ],
                "role": "CISA Coordinator",
                "timestamp": "2026-10-06T11:37:58.212117Z",
                "version": "2.0.3"
              },
              "type": "ssvc"
            }
          }
        ],
        "providerMetadata": {
          "dateUpdated": "2026-10-06T11:40:42.775Z",
          "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
          "shortName": "CISA-ADP"
        },
        "references": [
          {
            "tags": [
              "exploit"
            ],
            "url": "https://cna.erlef.org/cves/CVE-2026-95105.html"
          }
        ],
        "title": "CISA ADP Vulnrichment"
      }
    ],
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027",
            "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027"
          ],
          "packageName": "cloak",
          "packageURL": "pkg:hex/cloak",
          "product": "cloak",
          "programFiles": [
            "lib/cloak/ciphers/aes_ctr.ex",
            "lib/cloak/ciphers/deprecated/aes_ctr.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:encrypt/2"
            },
            {
              "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:decrypt/2"
            },
            {
              "name": "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027:decrypt/2"
            }
          ],
          "repo": "https://github.com/danielberkompas/cloak",
          "vendor": "danielberkompas",
          "versions": [
            {
              "lessThan": "*",
              "status": "affected",
              "version": "0.1.0-pre",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027",
            "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027"
          ],
          "packageName": "danielberkompas/cloak",
          "packageURL": "pkg:github/danielberkompas/cloak",
          "product": "cloak",
          "programFiles": [
            "lib/cloak/ciphers/aes_ctr.ex",
            "lib/cloak/ciphers/deprecated/aes_ctr.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:encrypt/2"
            },
            {
              "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:decrypt/2"
            },
            {
              "name": "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027:decrypt/2"
            }
          ],
          "repo": "https://github.com/danielberkompas/cloak",
          "vendor": "danielberkompas",
          "versions": [
            {
              "lessThan": "*",
              "status": "affected",
              "version": "2bd17019e285b55c5c218cc842537bf9280f24c3",
              "versionType": "git"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*",
                  "versionStartIncluding": "0.1.0-pre",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "dateAssigned": "2026-10-06T08:37:34.000Z",
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eReliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCloak.Ciphers.AES.CTR\u003c/code\u003e encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. \u003ccode\u003edecrypt/2\u003c/code\u003e checks only the key tag and the minimum length before it returns the plaintext, and \u003ccode\u003eCloak.Ciphers.Deprecated.AES.CTR\u003c/code\u003e decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\u003c/p\u003e\n\u003cp\u003eThis issue affects cloak: from 0.1.0-pre onward.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\n\n`Cloak.Ciphers.AES.CTR` encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. `decrypt/2` checks only the key tag and the minimum length before it returns the plaintext, and `Cloak.Ciphers.Deprecated.AES.CTR` decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\n\nThis issue affects cloak: from 0.1.0-pre onward."
            }
          ],
          "value": "Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\n\nCloak.Ciphers.AES.CTR encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. decrypt/2 checks only the key tag and the minimum length before it returns the plaintext, and Cloak.Ciphers.Deprecated.AES.CTR decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\n\nThis issue affects cloak: from 0.1.0-pre onward."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-39",
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAn attacker who can write to the encrypted store can set encrypted fields with known or guessable contents, such as roles, flags, or fixed-format records, to values of their choice without the key. The application decrypts and trusts the forged value.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "An attacker who can write to the encrypted store can set encrypted fields with known or guessable contents, such as roles, flags, or fixed-format records, to values of their choice without the key. The application decrypts and trusts the forged value."
                }
              ],
              "value": "An attacker who can write to the encrypted store can set encrypted fields with known or guessable contents, such as roles, flags, or fixed-format records, to values of their choice without the key. The application decrypts and trusts the forged value."
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "PRESENT",
            "attackVector": "NETWORK",
            "baseScore": 8.2,
            "baseSeverity": "HIGH",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "NONE",
            "vulnIntegrityImpact": "HIGH",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-649",
              "description": "CWE-649 Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-06T08:37:56.987Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "name": "EEF CNA record for CVE-2026-95105",
          "tags": [
            "related",
            "third-party-advisory"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-95105.html"
        },
        {
          "name": "OSV record EEF-CVE-2026-95105",
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-95105"
        },
        {
          "name": "Introducing commit 2bd1701 in danielberkompas/cloak",
          "tags": [
            "related"
          ],
          "url": "https://github.com/danielberkompas/cloak/commit/2bd17019e285b55c5c218cc842537bf9280f24c3"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Cloak AES-CTR cipher lacks ciphertext authentication, allowing chosen-plaintext forgery by bit flipping",
      "workarounds": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eConfigure the vault with \u003ccode\u003eCloak.Ciphers.AES.GCM\u003c/code\u003e as the default cipher and re-encrypt existing values, for example with the \u003ccode\u003ecloak.migrate.ecto\u003c/code\u003e task from cloak_ecto. Then remove \u003ccode\u003eCloak.Ciphers.AES.CTR\u003c/code\u003e and \u003ccode\u003eCloak.Ciphers.Deprecated.AES.CTR\u003c/code\u003e from the vault configuration, so that ciphertext in the CTR format is no longer decrypted. AES-GCM authenticates the ciphertext and rejects modified values.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Configure the vault with `Cloak.Ciphers.AES.GCM` as the default cipher and re-encrypt existing values, for example with the `cloak.migrate.ecto` task from cloak_ecto. Then remove `Cloak.Ciphers.AES.CTR` and `Cloak.Ciphers.Deprecated.AES.CTR` from the vault configuration, so that ciphertext in the CTR format is no longer decrypted. AES-GCM authenticates the ciphertext and rejects modified values."
            }
          ],
          "value": "Configure the vault with Cloak.Ciphers.AES.GCM as the default cipher and re-encrypt existing values, for example with the cloak.migrate.ecto task from cloak_ecto. Then remove Cloak.Ciphers.AES.CTR and Cloak.Ciphers.Deprecated.AES.CTR from the vault configuration, so that ciphertext in the CTR format is no longer decrypted. AES-GCM authenticates the ciphertext and rejects modified values."
        }
      ],
      "x_proofOfConcept": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003col\u003e\n\u003cli\u003eEncrypt \u003ccode\u003e\"role=user \"\u003c/code\u003e with \u003ccode\u003eCloak.Ciphers.AES.CTR.encrypt/2\u003c/code\u003e and a random 32-byte key.\u003c/li\u003e\n\u003cli\u003eWithout the key, XOR the last 10 bytes of the result (the ciphertext body) with \u003ccode\u003e:crypto.exor(\"role=user \", \"role=admin\")\u003c/code\u003e. Leave the key tag and the IV unchanged.\u003c/li\u003e\n\u003cli\u003eCall \u003ccode\u003eCloak.Ciphers.AES.CTR.decrypt/2\u003c/code\u003e on the modified value. It returns \u003ccode\u003e{:ok, \"role=admin\"}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "1. Encrypt `\"role=user \"` with `Cloak.Ciphers.AES.CTR.encrypt/2` and a random 32-byte key.\n2. Without the key, XOR the last 10 bytes of the result (the ciphertext body) with `:crypto.exor(\"role=user \", \"role=admin\")`. Leave the key tag and the IV unchanged.\n3. Call `Cloak.Ciphers.AES.CTR.decrypt/2` on the modified value. It returns `{:ok, \"role=admin\"}`."
            }
          ],
          "value": "* Encrypt \"role=user \" with Cloak.Ciphers.AES.CTR.encrypt/2 and a random 32-byte key.\n* Without the key, XOR the last 10 bytes of the result (the ciphertext body) with :crypto.exor(\"role=user \", \"role=admin\"). Leave the key tag and the IV unchanged.\n* Call Cloak.Ciphers.AES.CTR.decrypt/2 on the modified value. It returns {:ok, \"role=admin\"}."
        }
      ]
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-95105",
    "datePublished": "2026-10-06T08:37:56.987Z",
    "dateReserved": "2026-09-25T07:00:01.880Z",
    "dateUpdated": "2026-10-06T11:40:42.775Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-95105",
      "date": "2026-10-07",
      "epss": "0.00115",
      "percentile": "0.01411"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "collectionURL": "https://repo.hex.pm",
                "cpes": [
                  "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027",
                  "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027"
                ],
                "packageName": "cloak",
                "packageURL": "pkg:hex/cloak",
                "product": "cloak",
                "programFiles": [
                  "lib/cloak/ciphers/aes_ctr.ex",
                  "lib/cloak/ciphers/deprecated/aes_ctr.ex"
                ],
                "programRoutines": [
                  {
                    "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:encrypt/2"
                  },
                  {
                    "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:decrypt/2"
                  },
                  {
                    "name": "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027:decrypt/2"
                  }
                ],
                "repo": "https://github.com/danielberkompas/cloak",
                "vendor": "danielberkompas",
                "versions": [
                  {
                    "lessThan": "*",
                    "status": "affected",
                    "version": "0.1.0-pre",
                    "versionType": "semver"
                  }
                ]
              },
              {
                "collectionURL": "https://github.com",
                "cpes": [
                  "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*"
                ],
                "defaultStatus": "unaffected",
                "modules": [
                  "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027",
                  "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027"
                ],
                "packageName": "danielberkompas/cloak",
                "packageURL": "pkg:github/danielberkompas/cloak",
                "product": "cloak",
                "programFiles": [
                  "lib/cloak/ciphers/aes_ctr.ex",
                  "lib/cloak/ciphers/deprecated/aes_ctr.ex"
                ],
                "programRoutines": [
                  {
                    "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:encrypt/2"
                  },
                  {
                    "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:decrypt/2"
                  },
                  {
                    "name": "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027:decrypt/2"
                  }
                ],
                "repo": "https://github.com/danielberkompas/cloak",
                "vendor": "danielberkompas",
                "versions": [
                  {
                    "lessThan": "*",
                    "status": "affected",
                    "version": "2bd17019e285b55c5c218cc842537bf9280f24c3",
                    "versionType": "git"
                  }
                ]
              }
            ],
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\n\nCloak.Ciphers.AES.CTR encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. decrypt/2 checks only the key tag and the minimum length before it returns the plaintext, and Cloak.Ciphers.Deprecated.AES.CTR decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\n\nThis issue affects cloak: from 0.1.0-pre onward."
          }
        ],
        "id": "CVE-2026-95105",
        "lastModified": "2026-10-06T15:03:59.427",
        "metrics": {
          "cvssMetricV40": [
            {
              "cvssData": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "availabilityRequirement": "NOT_DEFINED",
                "baseScore": 8.2,
                "baseSeverity": "HIGH",
                "confidentialityRequirement": "NOT_DEFINED",
                "exploitMaturity": "NOT_DEFINED",
                "integrityRequirement": "NOT_DEFINED",
                "modifiedAttackComplexity": "NOT_DEFINED",
                "modifiedAttackRequirements": "NOT_DEFINED",
                "modifiedAttackVector": "NOT_DEFINED",
                "modifiedPrivilegesRequired": "NOT_DEFINED",
                "modifiedSubAvailabilityImpact": "NOT_DEFINED",
                "modifiedSubConfidentialityImpact": "NOT_DEFINED",
                "modifiedSubIntegrityImpact": "NOT_DEFINED",
                "modifiedUserInteraction": "NOT_DEFINED",
                "modifiedVulnAvailabilityImpact": "NOT_DEFINED",
                "modifiedVulnConfidentialityImpact": "NOT_DEFINED",
                "modifiedVulnIntegrityImpact": "NOT_DEFINED",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
              "type": "Secondary"
            }
          ],
          "ssvcV203": [
            {
              "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "ssvcData": {
                "id": "CVE-2026-95105",
                "options": [
                  {
                    "exploitation": "poc"
                  },
                  {
                    "automatable": "no"
                  },
                  {
                    "technicalImpact": "partial"
                  }
                ],
                "role": "CISA Coordinator",
                "timestamp": "2026-10-06T11:37:58.212117Z",
                "version": "2.0.3"
              }
            }
          ]
        },
        "published": "2026-10-06T09:17:57.200",
        "references": [
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://cna.erlef.org/cves/CVE-2026-95105.html"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://github.com/danielberkompas/cloak/commit/2bd17019e285b55c5c218cc842537bf9280f24c3"
          },
          {
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "url": "https://osv.dev/vulnerability/EEF-CVE-2026-95105"
          },
          {
            "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
            "url": "https://cna.erlef.org/cves/CVE-2026-95105.html"
          }
        ],
        "sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "vulnStatus": "Deferred",
        "weaknesses": [
          {
            "description": [
              {
                "lang": "en",
                "value": "CWE-649"
              }
            ],
            "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "type": "Secondary"
          }
        ]
      }
    },
    "vulnrichment": {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-95105",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-10-06T11:37:58.212117Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-10-06T11:40:24.528Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://cna.erlef.org/cves/CVE-2026-95105.html"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027",
                "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027"
              ],
              "packageName": "cloak",
              "packageURL": "pkg:hex/cloak",
              "product": "cloak",
              "programFiles": [
                "lib/cloak/ciphers/aes_ctr.ex",
                "lib/cloak/ciphers/deprecated/aes_ctr.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:encrypt/2"
                },
                {
                  "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:decrypt/2"
                },
                {
                  "name": "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027:decrypt/2"
                }
              ],
              "repo": "https://github.com/danielberkompas/cloak",
              "vendor": "danielberkompas",
              "versions": [
                {
                  "lessThan": "*",
                  "status": "affected",
                  "version": "0.1.0-pre",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027",
                "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027"
              ],
              "packageName": "danielberkompas/cloak",
              "packageURL": "pkg:github/danielberkompas/cloak",
              "product": "cloak",
              "programFiles": [
                "lib/cloak/ciphers/aes_ctr.ex",
                "lib/cloak/ciphers/deprecated/aes_ctr.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:encrypt/2"
                },
                {
                  "name": "\u0027Elixir.Cloak.Ciphers.AES.CTR\u0027:decrypt/2"
                },
                {
                  "name": "\u0027Elixir.Cloak.Ciphers.Deprecated.AES.CTR\u0027:decrypt/2"
                }
              ],
              "repo": "https://github.com/danielberkompas/cloak",
              "vendor": "danielberkompas",
              "versions": [
                {
                  "lessThan": "*",
                  "status": "affected",
                  "version": "2bd17019e285b55c5c218cc842537bf9280f24c3",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:danielberkompas:cloak:*:*:*:*:*:*:*:*",
                      "versionStartIncluding": "0.1.0-pre",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "dateAssigned": "2026-10-06T08:37:34.000Z",
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eReliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCloak.Ciphers.AES.CTR\u003c/code\u003e encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. \u003ccode\u003edecrypt/2\u003c/code\u003e checks only the key tag and the minimum length before it returns the plaintext, and \u003ccode\u003eCloak.Ciphers.Deprecated.AES.CTR\u003c/code\u003e decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\u003c/p\u003e\n\u003cp\u003eThis issue affects cloak: from 0.1.0-pre onward.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\n\n`Cloak.Ciphers.AES.CTR` encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. `decrypt/2` checks only the key tag and the minimum length before it returns the plaintext, and `Cloak.Ciphers.Deprecated.AES.CTR` decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\n\nThis issue affects cloak: from 0.1.0-pre onward."
                }
              ],
              "value": "Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking vulnerability in danielberkompas cloak allows an attacker with write access to stored ciphertext to make it decrypt to a chosen value via bit flipping.\n\nCloak.Ciphers.AES.CTR encrypts with AES-256 in CTR mode and stores the key tag, the IV and the ciphertext with no MAC. decrypt/2 checks only the key tag and the minimum length before it returns the plaintext, and Cloak.Ciphers.Deprecated.AES.CTR decrypts the legacy format the same way. CTR is a stream cipher, so a value XORed into the stored ciphertext is XORed into the plaintext at the same offset. An attacker who can write to the encrypted store (for example through SQL injection or a compromised replica) and who knows or can guess a stored plaintext can replace it with any value of the same length. The application receives that value with no error.\n\nThis issue affects cloak: from 0.1.0-pre onward."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-39",
              "descriptions": [
                {
                  "lang": "en",
                  "supportingMedia": [
                    {
                      "base64": false,
                      "type": "text/html",
                      "value": "\u003cp\u003eAn attacker who can write to the encrypted store can set encrypted fields with known or guessable contents, such as roles, flags, or fixed-format records, to values of their choice without the key. The application decrypts and trusts the forged value.\u003c/p\u003e"
                    },
                    {
                      "base64": false,
                      "type": "text/markdown",
                      "value": "An attacker who can write to the encrypted store can set encrypted fields with known or guessable contents, such as roles, flags, or fixed-format records, to values of their choice without the key. The application decrypts and trusts the forged value."
                    }
                  ],
                  "value": "An attacker who can write to the encrypted store can set encrypted fields with known or guessable contents, such as roles, flags, or fixed-format records, to values of their choice without the key. The application decrypts and trusts the forged value."
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 8.2,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-649",
                  "description": "CWE-649 Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-10-06T08:37:56.987Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "name": "EEF CNA record for CVE-2026-95105",
              "tags": [
                "related",
                "third-party-advisory"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-95105.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-95105",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-95105"
            },
            {
              "name": "Introducing commit 2bd1701 in danielberkompas/cloak",
              "tags": [
                "related"
              ],
              "url": "https://github.com/danielberkompas/cloak/commit/2bd17019e285b55c5c218cc842537bf9280f24c3"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Cloak AES-CTR cipher lacks ciphertext authentication, allowing chosen-plaintext forgery by bit flipping",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eConfigure the vault with \u003ccode\u003eCloak.Ciphers.AES.GCM\u003c/code\u003e as the default cipher and re-encrypt existing values, for example with the \u003ccode\u003ecloak.migrate.ecto\u003c/code\u003e task from cloak_ecto. Then remove \u003ccode\u003eCloak.Ciphers.AES.CTR\u003c/code\u003e and \u003ccode\u003eCloak.Ciphers.Deprecated.AES.CTR\u003c/code\u003e from the vault configuration, so that ciphertext in the CTR format is no longer decrypted. AES-GCM authenticates the ciphertext and rejects modified values.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Configure the vault with `Cloak.Ciphers.AES.GCM` as the default cipher and re-encrypt existing values, for example with the `cloak.migrate.ecto` task from cloak_ecto. Then remove `Cloak.Ciphers.AES.CTR` and `Cloak.Ciphers.Deprecated.AES.CTR` from the vault configuration, so that ciphertext in the CTR format is no longer decrypted. AES-GCM authenticates the ciphertext and rejects modified values."
                }
              ],
              "value": "Configure the vault with Cloak.Ciphers.AES.GCM as the default cipher and re-encrypt existing values, for example with the cloak.migrate.ecto task from cloak_ecto. Then remove Cloak.Ciphers.AES.CTR and Cloak.Ciphers.Deprecated.AES.CTR from the vault configuration, so that ciphertext in the CTR format is no longer decrypted. AES-GCM authenticates the ciphertext and rejects modified values."
            }
          ],
          "x_proofOfConcept": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003col\u003e\n\u003cli\u003eEncrypt \u003ccode\u003e\"role=user \"\u003c/code\u003e with \u003ccode\u003eCloak.Ciphers.AES.CTR.encrypt/2\u003c/code\u003e and a random 32-byte key.\u003c/li\u003e\n\u003cli\u003eWithout the key, XOR the last 10 bytes of the result (the ciphertext body) with \u003ccode\u003e:crypto.exor(\"role=user \", \"role=admin\")\u003c/code\u003e. Leave the key tag and the IV unchanged.\u003c/li\u003e\n\u003cli\u003eCall \u003ccode\u003eCloak.Ciphers.AES.CTR.decrypt/2\u003c/code\u003e on the modified value. It returns \u003ccode\u003e{:ok, \"role=admin\"}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "1. Encrypt `\"role=user \"` with `Cloak.Ciphers.AES.CTR.encrypt/2` and a random 32-byte key.\n2. Without the key, XOR the last 10 bytes of the result (the ciphertext body) with `:crypto.exor(\"role=user \", \"role=admin\")`. Leave the key tag and the IV unchanged.\n3. Call `Cloak.Ciphers.AES.CTR.decrypt/2` on the modified value. It returns `{:ok, \"role=admin\"}`."
                }
              ],
              "value": "* Encrypt \"role=user \" with Cloak.Ciphers.AES.CTR.encrypt/2 and a random 32-byte key.\n* Without the key, XOR the last 10 bytes of the result (the ciphertext body) with :crypto.exor(\"role=user \", \"role=admin\"). Leave the key tag and the IV unchanged.\n* Call Cloak.Ciphers.AES.CTR.decrypt/2 on the modified value. It returns {:ok, \"role=admin\"}."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-95105",
        "datePublished": "2026-10-06T08:37:56.987Z",
        "dateReserved": "2026-09-25T07:00:01.880Z",
        "dateUpdated": "2026-10-06T11:40:42.775Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…