Answer in brief
CVE-2026-81638 records a Low severity (CVSS 2.1) vulnerability in Non-canonical ULID spellings are accepted and alias to the same record in ash_double_entry. The current sources do not mark it as known exploited. The current feed maps ash-project/ash_double_entry (generic), ash-project/ash_double_entry (generic), ash-project/ash-project/ash_double_entry (generic). Check affected ranges and fixed versions before updating.
Analysis pending evidence review
HOL Guard separates source facts from reviewed analysis. See the methodology.
CVSS is 2.1. The current sources do not mark it as known exploited. Treat this as a source-backed prioritization signal, not a statement about your environment.
Analysis status
Analysis pending evidence review
Factual feed record only; HOL analysis is not approved for indexing. Read the methodology.
The current feed maps ash-project/ash_double_entry (generic), ash-project/ash_double_entry (generic), ash-project/ash-project/ash_double_entry (generic). Check affected ranges and fixed versions before updating.
| Package | Affected range | Fixed version |
|---|---|---|
| ash-project/ash_double_entrygeneric | >=1e5f7ce8ff25f519c904731a29eb1258324e561a <d3e688d300a581ae214b3ca7d95ef4de63fbb050 | d3e688d300a581ae214b3ca7d95ef4de63fbb050 |
| ash-project/ash_double_entrygeneric | >=0.1.0 <1.0.19 | 1.0.19 |
| ash-project/ash-project/ash_double_entrygeneric | >=1e5f7ce8ff25f519c904731a29eb1258324e561a <d3e688d300a581ae214b3ca7d95ef4de63fbb050 | d3e688d300a581ae214b3ca7d95ef4de63fbb050 |
Published upstream
Sep 7, 2026
Evidence: source:cvelist:source_dates:source-dates:recordSource modified
Sep 8, 2026
Evidence: source:cvelist:source_dates:source-dates:recordFirst seen by HOL
Sep 7, 2026
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.
Quoted source text, attributed separately from HOL analysis.