GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

CVE-2026-81638 (GCVE-0-2026-81638)

Vulnerability from cvelistv5 – Published: 2026-09-07 22:33 – Updated: 2026-09-08 14:44
VLAI
Title
Non-canonical ULID spellings are accepted and alias to the same record in ash_double_entry
Summary
Improper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier. AshDoubleEntry.ULID renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are 0 to 7. decode/1 in lib/ulid.ex masks the first character to its low 3 bits and valid?/1 accepts all 32 characters in that position, so 0..., 8..., G... and R... decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID. This issue affects ash_double_entry: from 0.1.0 before 1.0.19.
SSVC
Exploitation: none Automatable: no Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-08 14:44 UTC
CWE
  • CWE-173 - Improper Handling of Alternate Encoding
Assigner
Impacted products
Vendor Product Version CPE status
ash-project ash_double_entry Affected: 0.1.0 , < 1.0.19 (semver)
    cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*
Create a notification for this product.
ash-project ash_double_entry Affected: 1e5f7ce8ff25f519c904731a29eb1258324e561a , < d3e688d300a581ae214b3ca7d95ef4de63fbb050 (git)
    cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "adp": [
      {
        "metrics": [
          {
            "other": {
              "content": {
                "id": "CVE-2026-81638",
                "options": [
                  {
                    "Exploitation": "none"
                  },
                  {
                    "Automatable": "no"
                  },
                  {
                    "Technical Impact": "partial"
                  }
                ],
                "role": "CISA Coordinator",
                "timestamp": "2026-09-08T14:44:11.859893Z",
                "version": "2.0.3"
              },
              "type": "ssvc"
            }
          }
        ],
        "providerMetadata": {
          "dateUpdated": "2026-09-08T14:44:19.138Z",
          "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
          "shortName": "CISA-ADP"
        },
        "title": "CISA ADP Vulnrichment"
      }
    ],
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshDoubleEntry.ULID\u0027"
          ],
          "packageName": "ash_double_entry",
          "packageURL": "pkg:hex/ash_double_entry",
          "product": "ash_double_entry",
          "programFiles": [
            "lib/ulid.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshDoubleEntry.ULID\u0027:cast_input/2"
            },
            {
              "name": "\u0027Elixir.AshDoubleEntry.ULID\u0027:dump_to_native/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash_double_entry",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.0.19",
              "status": "affected",
              "version": "0.1.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshDoubleEntry.ULID\u0027"
          ],
          "packageName": "ash-project/ash_double_entry",
          "packageURL": "pkg:github/ash-project/ash_double_entry",
          "product": "ash_double_entry",
          "programFiles": [
            "lib/ulid.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshDoubleEntry.ULID\u0027:cast_input/2"
            },
            {
              "name": "\u0027Elixir.AshDoubleEntry.ULID\u0027:dump_to_native/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash_double_entry",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "d3e688d300a581ae214b3ca7d95ef4de63fbb050",
              "status": "affected",
              "version": "1e5f7ce8ff25f519c904731a29eb1258324e561a",
              "versionType": "git"
            }
          ]
        }
      ],
      "configurations": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eReachable only when an application exposes \u003ccode\u003eAshDoubleEntry.ULID\u003c/code\u003e as a public identifier over an HTTP or API boundary and performs string-level checks on the submitted ID (idempotency or deduplication keys, deny-lists, audit correlation, or signatures) rather than treating the value as opaque.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Reachable only when an application exposes `AshDoubleEntry.ULID` as a public identifier over an HTTP or API boundary and performs string-level checks on the submitted ID (idempotency or deduplication keys, deny-lists, audit correlation, or signatures) rather than treating the value as opaque."
            }
          ],
          "value": "Reachable only when an application exposes AshDoubleEntry.ULID as a public identifier over an HTTP or API boundary and performs string-level checks on the submitted ID (idempotency or deduplication keys, deny-lists, audit correlation, or signatures) rather than treating the value as opaque."
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.0.19",
                  "versionStartIncluding": "0.1.0",
                  "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": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eImproper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAshDoubleEntry.ULID\u003c/code\u003e renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are \u003ccode\u003e0\u003c/code\u003e to \u003ccode\u003e7\u003c/code\u003e. \u003ccode\u003edecode/1\u003c/code\u003e in \u003ccode\u003elib/ulid.ex\u003c/code\u003e masks the first character to its low 3 bits and \u003ccode\u003evalid?/1\u003c/code\u003e accepts all 32 characters in that position, so \u003ccode\u003e0...\u003c/code\u003e, \u003ccode\u003e8...\u003c/code\u003e, \u003ccode\u003eG...\u003c/code\u003e and \u003ccode\u003eR...\u003c/code\u003e decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_double_entry: from 0.1.0 before 1.0.19.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Improper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\n\n`AshDoubleEntry.ULID` renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are `0` to `7`. `decode/1` in `lib/ulid.ex` masks the first character to its low 3 bits and `valid?/1` accepts all 32 characters in that position, so `0...`, `8...`, `G...` and `R...` decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\n\nThis issue affects ash_double_entry: from 0.1.0 before 1.0.19."
            }
          ],
          "value": "Improper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\n\nAshDoubleEntry.ULID renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are 0 to 7. decode/1 in lib/ulid.ex masks the first character to its low 3 bits and valid?/1 accepts all 32 characters in that position, so 0..., 8..., G... and R... decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\n\nThis issue affects ash_double_entry: from 0.1.0 before 1.0.19."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-267",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-267 Leverage Alternate Encoding"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "PRESENT",
            "attackVector": "LOCAL",
            "baseScore": 2.1,
            "baseSeverity": "LOW",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "LOW",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "NONE",
            "vulnIntegrityImpact": "LOW",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-173",
              "description": "CWE-173 Improper Handling of Alternate Encoding",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-07T22:33:29.297Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_double_entry/security/advisories/GHSA-qxp2-vgp9-268q"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-81638.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-81638"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_double_entry/commit/d3e688d300a581ae214b3ca7d95ef4de63fbb050"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Non-canonical ULID spellings are accepted and alias to the same record in ash_double_entry"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-81638",
    "datePublished": "2026-09-07T22:33:29.297Z",
    "dateReserved": "2026-09-07T19:30:01.624Z",
    "dateUpdated": "2026-09-08T14:44:19.138Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-81638",
      "date": "2026-09-17",
      "epss": "0.00133",
      "percentile": "0.03186"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-81638\",\"sourceIdentifier\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\",\"published\":\"2026-09-07T23:16:51.757\",\"lastModified\":\"2026-09-08T15:18:49.077\",\"vulnStatus\":\"Deferred\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"Improper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\\n\\nAshDoubleEntry.ULID renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are 0 to 7. decode/1 in lib/ulid.ex masks the first character to its low 3 bits and valid?/1 accepts all 32 characters in that position, so 0..., 8..., G... and R... decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\\n\\nThis issue affects ash_double_entry: from 0.1.0 before 1.0.19.\"}],\"affected\":[{\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\",\"affectedData\":[{\"vendor\":\"ash-project\",\"product\":\"ash_double_entry\",\"defaultStatus\":\"unaffected\",\"collectionURL\":\"https://repo.hex.pm\",\"packageName\":\"ash_double_entry\",\"cpes\":[\"cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*\"],\"modules\":[\"\u0027Elixir.AshDoubleEntry.ULID\u0027\"],\"programFiles\":[\"lib/ulid.ex\"],\"programRoutines\":[{\"name\":\"\u0027Elixir.AshDoubleEntry.ULID\u0027:cast_input/2\"},{\"name\":\"\u0027Elixir.AshDoubleEntry.ULID\u0027:dump_to_native/2\"}],\"repo\":\"https://github.com/ash-project/ash_double_entry\",\"packageURL\":\"pkg:hex/ash_double_entry\",\"versions\":[{\"version\":\"0.1.0\",\"lessThan\":\"1.0.19\",\"versionType\":\"semver\",\"status\":\"affected\"}]},{\"vendor\":\"ash-project\",\"product\":\"ash_double_entry\",\"defaultStatus\":\"unaffected\",\"collectionURL\":\"https://github.com\",\"packageName\":\"ash-project/ash_double_entry\",\"cpes\":[\"cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*\"],\"modules\":[\"\u0027Elixir.AshDoubleEntry.ULID\u0027\"],\"programFiles\":[\"lib/ulid.ex\"],\"programRoutines\":[{\"name\":\"\u0027Elixir.AshDoubleEntry.ULID\u0027:cast_input/2\"},{\"name\":\"\u0027Elixir.AshDoubleEntry.ULID\u0027:dump_to_native/2\"}],\"repo\":\"https://github.com/ash-project/ash_double_entry\",\"packageURL\":\"pkg:github/ash-project/ash_double_entry\",\"versions\":[{\"version\":\"1e5f7ce8ff25f519c904731a29eb1258324e561a\",\"lessThan\":\"d3e688d300a581ae214b3ca7d95ef4de63fbb050\",\"versionType\":\"git\",\"status\":\"affected\"}]}]}],\"metrics\":{\"cvssMetricV40\":[{\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"4.0\",\"vectorString\":\"CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/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\",\"baseScore\":2.1,\"baseSeverity\":\"LOW\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"attackRequirements\":\"PRESENT\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"vulnConfidentialityImpact\":\"NONE\",\"vulnIntegrityImpact\":\"LOW\",\"vulnAvailabilityImpact\":\"NONE\",\"subConfidentialityImpact\":\"NONE\",\"subIntegrityImpact\":\"LOW\",\"subAvailabilityImpact\":\"NONE\",\"exploitMaturity\":\"NOT_DEFINED\",\"confidentialityRequirement\":\"NOT_DEFINED\",\"integrityRequirement\":\"NOT_DEFINED\",\"availabilityRequirement\":\"NOT_DEFINED\",\"modifiedAttackVector\":\"NOT_DEFINED\",\"modifiedAttackComplexity\":\"NOT_DEFINED\",\"modifiedAttackRequirements\":\"NOT_DEFINED\",\"modifiedPrivilegesRequired\":\"NOT_DEFINED\",\"modifiedUserInteraction\":\"NOT_DEFINED\",\"modifiedVulnConfidentialityImpact\":\"NOT_DEFINED\",\"modifiedVulnIntegrityImpact\":\"NOT_DEFINED\",\"modifiedVulnAvailabilityImpact\":\"NOT_DEFINED\",\"modifiedSubConfidentialityImpact\":\"NOT_DEFINED\",\"modifiedSubIntegrityImpact\":\"NOT_DEFINED\",\"modifiedSubAvailabilityImpact\":\"NOT_DEFINED\",\"Safety\":\"NOT_DEFINED\",\"Automatable\":\"NOT_DEFINED\",\"Recovery\":\"NOT_DEFINED\",\"valueDensity\":\"NOT_DEFINED\",\"vulnerabilityResponseEffort\":\"NOT_DEFINED\",\"providerUrgency\":\"NOT_DEFINED\"}}],\"ssvcV203\":[{\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"ssvcData\":{\"timestamp\":\"2026-09-08T14:44:11.859893Z\",\"id\":\"CVE-2026-81638\",\"options\":[{\"exploitation\":\"none\"},{\"automatable\":\"no\"},{\"technicalImpact\":\"partial\"}],\"role\":\"CISA Coordinator\",\"version\":\"2.0.3\"}}]},\"weaknesses\":[{\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\",\"type\":\"Secondary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-173\"}]}],\"references\":[{\"url\":\"https://cna.erlef.org/cves/CVE-2026-81638.html\",\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\"},{\"url\":\"https://github.com/ash-project/ash_double_entry/commit/d3e688d300a581ae214b3ca7d95ef4de63fbb050\",\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\"},{\"url\":\"https://github.com/ash-project/ash_double_entry/security/advisories/GHSA-qxp2-vgp9-268q\",\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\"},{\"url\":\"https://osv.dev/vulnerability/EEF-CVE-2026-81638\",\"source\":\"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\"}]}}",
    "vulnrichment": {
      "containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-81638\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"partial\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-09-08T14:44:11.859893Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-09-08T14:44:16.332Z\"}}], \"cna\": {\"title\": \"Non-canonical ULID spellings are accepted and alias to the same record in ash_double_entry\", \"source\": {\"discovery\": \"EXTERNAL\"}, \"credits\": [{\"lang\": \"en\", \"type\": \"finder\", \"value\": \"Peter Ullrich\"}, {\"lang\": \"en\", \"type\": \"reporter\", \"value\": \"Peter Ullrich\"}, {\"lang\": \"en\", \"type\": \"remediation developer\", \"value\": \"Zach Daniel / Ash Project\"}, {\"lang\": \"en\", \"type\": \"coordinator\", \"value\": \"Jonatan M\\u00e4nnchen / EEF\"}], \"impacts\": [{\"capecId\": \"CAPEC-267\", \"descriptions\": [{\"lang\": \"en\", \"value\": \"CAPEC-267 Leverage Alternate Encoding\"}]}], \"metrics\": [{\"format\": \"CVSS\", \"cvssV4_0\": {\"Safety\": \"NOT_DEFINED\", \"version\": \"4.0\", \"Recovery\": \"NOT_DEFINED\", \"baseScore\": 2.1, \"Automatable\": \"NOT_DEFINED\", \"attackVector\": \"LOCAL\", \"baseSeverity\": \"LOW\", \"valueDensity\": \"NOT_DEFINED\", \"vectorString\": \"CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N\", \"providerUrgency\": \"NOT_DEFINED\", \"userInteraction\": \"NONE\", \"attackComplexity\": \"LOW\", \"attackRequirements\": \"PRESENT\", \"privilegesRequired\": \"NONE\", \"subIntegrityImpact\": \"LOW\", \"vulnIntegrityImpact\": \"LOW\", \"subAvailabilityImpact\": \"NONE\", \"vulnAvailabilityImpact\": \"NONE\", \"subConfidentialityImpact\": \"NONE\", \"vulnConfidentialityImpact\": \"NONE\", \"vulnerabilityResponseEffort\": \"NOT_DEFINED\"}, \"scenarios\": [{\"lang\": \"en\", \"value\": \"GENERAL\"}]}], \"affected\": [{\"cpes\": [\"cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*\"], \"repo\": \"https://github.com/ash-project/ash_double_entry\", \"vendor\": \"ash-project\", \"modules\": [\"\u0027Elixir.AshDoubleEntry.ULID\u0027\"], \"product\": \"ash_double_entry\", \"versions\": [{\"status\": \"affected\", \"version\": \"0.1.0\", \"lessThan\": \"1.0.19\", \"versionType\": \"semver\"}], \"packageURL\": \"pkg:hex/ash_double_entry\", \"packageName\": \"ash_double_entry\", \"programFiles\": [\"lib/ulid.ex\"], \"collectionURL\": \"https://repo.hex.pm\", \"defaultStatus\": \"unaffected\", \"programRoutines\": [{\"name\": \"\u0027Elixir.AshDoubleEntry.ULID\u0027:cast_input/2\"}, {\"name\": \"\u0027Elixir.AshDoubleEntry.ULID\u0027:dump_to_native/2\"}]}, {\"cpes\": [\"cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*\"], \"repo\": \"https://github.com/ash-project/ash_double_entry\", \"vendor\": \"ash-project\", \"modules\": [\"\u0027Elixir.AshDoubleEntry.ULID\u0027\"], \"product\": \"ash_double_entry\", \"versions\": [{\"status\": \"affected\", \"version\": \"1e5f7ce8ff25f519c904731a29eb1258324e561a\", \"lessThan\": \"d3e688d300a581ae214b3ca7d95ef4de63fbb050\", \"versionType\": \"git\"}], \"packageURL\": \"pkg:github/ash-project/ash_double_entry\", \"packageName\": \"ash-project/ash_double_entry\", \"programFiles\": [\"lib/ulid.ex\"], \"collectionURL\": \"https://github.com\", \"defaultStatus\": \"unaffected\", \"programRoutines\": [{\"name\": \"\u0027Elixir.AshDoubleEntry.ULID\u0027:cast_input/2\"}, {\"name\": \"\u0027Elixir.AshDoubleEntry.ULID\u0027:dump_to_native/2\"}]}], \"references\": [{\"url\": \"https://github.com/ash-project/ash_double_entry/security/advisories/GHSA-qxp2-vgp9-268q\", \"tags\": [\"vendor-advisory\", \"related\"]}, {\"url\": \"https://cna.erlef.org/cves/CVE-2026-81638.html\", \"tags\": [\"related\"]}, {\"url\": \"https://osv.dev/vulnerability/EEF-CVE-2026-81638\", \"tags\": [\"related\"]}, {\"url\": \"https://github.com/ash-project/ash_double_entry/commit/d3e688d300a581ae214b3ca7d95ef4de63fbb050\", \"tags\": [\"patch\"]}], \"descriptions\": [{\"lang\": \"en\", \"value\": \"Improper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\\n\\nAshDoubleEntry.ULID renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are 0 to 7. decode/1 in lib/ulid.ex masks the first character to its low 3 bits and valid?/1 accepts all 32 characters in that position, so 0..., 8..., G... and R... decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\\n\\nThis issue affects ash_double_entry: from 0.1.0 before 1.0.19.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eImproper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\u003c/p\u003e\\n\u003cp\u003e\u003ccode\u003eAshDoubleEntry.ULID\u003c/code\u003e renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are \u003ccode\u003e0\u003c/code\u003e to \u003ccode\u003e7\u003c/code\u003e. \u003ccode\u003edecode/1\u003c/code\u003e in \u003ccode\u003elib/ulid.ex\u003c/code\u003e masks the first character to its low 3 bits and \u003ccode\u003evalid?/1\u003c/code\u003e accepts all 32 characters in that position, so \u003ccode\u003e0...\u003c/code\u003e, \u003ccode\u003e8...\u003c/code\u003e, \u003ccode\u003eG...\u003c/code\u003e and \u003ccode\u003eR...\u003c/code\u003e decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\u003c/p\u003e\\n\u003cp\u003eThis issue affects ash_double_entry: from 0.1.0 before 1.0.19.\u003c/p\u003e\", \"base64\": false}, {\"type\": \"text/markdown\", \"value\": \"Improper Handling of Alternate Encoding vulnerability in ash-project ash_double_entry allows an attacker to submit several distinct string spellings of the same identifier.\\n\\n`AshDoubleEntry.ULID` renders a 128-bit ULID as 26 Crockford base-32 characters, but the first character encodes only 3 bits, so canonical values are `0` to `7`. `decode/1` in `lib/ulid.ex` masks the first character to its low 3 bits and `valid?/1` accepts all 32 characters in that position, so `0...`, `8...`, `G...` and `R...` decode to the identical 16-byte value and resolve to the same row. When the type is exposed as a public ID over an HTTP or API boundary, an attacker-supplied ID can be spelled differently from the record it actually reads or writes, desynchronizing or bypassing string-level checks such as idempotency and deduplication keys, deny-lists, audit correlation, or signatures computed over the submitted ID.\\n\\nThis issue affects ash_double_entry: from 0.1.0 before 1.0.19.\", \"base64\": false}]}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-173\", \"description\": \"CWE-173 Improper Handling of Alternate Encoding\"}]}], \"configurations\": [{\"lang\": \"en\", \"value\": \"Reachable only when an application exposes AshDoubleEntry.ULID as a public identifier over an HTTP or API boundary and performs string-level checks on the submitted ID (idempotency or deduplication keys, deny-lists, audit correlation, or signatures) rather than treating the value as opaque.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eReachable only when an application exposes \u003ccode\u003eAshDoubleEntry.ULID\u003c/code\u003e as a public identifier over an HTTP or API boundary and performs string-level checks on the submitted ID (idempotency or deduplication keys, deny-lists, audit correlation, or signatures) rather than treating the value as opaque.\u003c/p\u003e\", \"base64\": false}, {\"type\": \"text/markdown\", \"value\": \"Reachable only when an application exposes `AshDoubleEntry.ULID` as a public identifier over an HTTP or API boundary and performs string-level checks on the submitted ID (idempotency or deduplication keys, deny-lists, audit correlation, or signatures) rather than treating the value as opaque.\", \"base64\": false}]}], \"cpeApplicability\": [{\"nodes\": [{\"negate\": false, \"cpeMatch\": [{\"criteria\": \"cpe:2.3:a:ash-project:ash_double_entry:*:*:*:*:*:*:*:*\", \"vulnerable\": true, \"versionEndExcluding\": \"1.0.19\", \"versionStartIncluding\": \"0.1.0\"}], \"operator\": \"OR\"}], \"operator\": \"AND\"}], \"providerMetadata\": {\"orgId\": \"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\", \"shortName\": \"EEF\", \"dateUpdated\": \"2026-09-07T22:33:29.297Z\"}}}",
      "cveMetadata": "{\"cveId\": \"CVE-2026-81638\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-09-08T14:44:19.138Z\", \"dateReserved\": \"2026-09-07T19:30:01.624Z\", \"assignerOrgId\": \"6b3ad84c-e1a6-4bf7-a703-f496b71e49db\", \"datePublished\": \"2026-09-07T22:33:29.297Z\", \"assignerShortName\": \"EEF\"}",
      "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…

Detection rules are retrieved from Rulezet.

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…