ANT-2026-N7D3E5WK · rdkit

use-after-free high

Severity Claude critical · Security research firm high · Maintainer -

Discovered by Claude Mythos Preview

REPORT

Anthropic's analysis, sealed at approval. Disclosure to the maintainer was performed by Ada Logics.

ANT-2026-N7D3E5WK: Heap-use-after-free in Chirality::cleanupStereoGroups at Chirality.cpp:2188 via SMILES stereo group referencing atom freed by removeHs

OSS-Fuzz's smiles_string_to_mol_fuzzer target triggered a heap-use-after-free in RDKit's C++ SMILES parsing code path. A crafted SMILES string causes the molecule-graph construction logic to read from a heap allocation after it has been freed. An attacker controls the SMILES input string, which is a common unauthenticated entry point in cheminformatics web services, REST APIs, and the RDKit PostgreSQL cartridge. The result is a reliable crash (DoS), with potential for stale-heap information disclosure and theoretical escalation to RCE via heap grooming.

Target

Project: rdkit
Location: getChiralTag at Code/GraphMol/Atom.h:245, called from Chirality::cleanupStereoGroups at Code/GraphMol/Chirality.cpp:2188

Technical Details

ASAN: READ on freed heap memory (heap-use-after-free). The SMILES parser dereferences a pointer into a heap region that has already been freed during molecule construction; the precise root cause — iterator invalidation, premature object destruction, or a dangling pointer in graph construction — could not be determined without the crashing input or stack trace.

Crash trace (truncated — full trace in attached crash.log):

INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 1722987467
INFO: Loaded 1 modules   (74698 inline 8-bit counters): 74698 [0x5a06ecc91fb0, 0x5a06ecca437a), 
INFO: Loaded 1 PC tables (74698 PCs): 74698 [0x5a06ecca4380,0x5a06ecdc8020), 
/out/smiles_string_to_mol_fuzzer: Running 1 inputs 1 time(s) each.
Running: /tmp/poc
EXIT_CODE:1


=== ASAN Report ===
=================================================================
==27==ERROR: AddressSanitizer: heap-use-after-free on address 0x779acfbe25f0 at pc 0x5a06ec9521e8 bp 0x7ffca09025f0 sp 0x7ffca09025e8
READ of size 1 at 0x779acfbe25f0 thread T0
    #0 0x5a06ec9521e7 in getChiralTag /src/rdkit/Code/GraphMol/Atom.h:245:36
    #1 0x5a06ec9521e7 in RDKit::Chirality::cleanupStereoGroups(RDKit::ROMol&) /src/rdkit/Code/GraphMol/Chirality.cpp:2188:17
    #2 0x5a06ec95572c in RDKit::Chirality::legacyStereoPerception(RDKit::ROMol&, bool, bool) /src/rdkit/Code/GraphMol/Chirality.cpp:2506:5
    #3 0x5a06ec95da5e in RDKit::MolOps::assignStereochemistry(RDKit::ROMol&, bool, bool, bool) /src/rdkit/Code/GraphMol/Chirality.cpp:2902:5
    #4 0x5a06ec5b4649 in RDKit::v2::SmilesParse::MolFromSmiles(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, RDKit::v2::SmilesParse::SmilesParserParams const&) /src/rdkit/Code/GraphMol/SmilesParse/SmilesParse.cpp:505:5
    #5 0x5a06ec5ae294 in SmilesToMol /src/rdkit/Code/GraphMol/SmilesParse/SmilesParse.h:186:10
    #6 0x5a06ec5ae294 in LLVMFuzzerTestOneInput /src/rdkit/Code/Fuzz/smiles_string_to_mol_fuzzer.cc:28:9
    #7 0x5a06ec44b8ad in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) /src/llvm-project/compiler-rt/lib/fuzzer/FuzzerLoop.cpp:619:13
    [... 31 more frames — full trace in crash.log]

Reproduction

  1. Craft a malicious SMILES string that exercises the vulnerable parser code path
  2. Submit the string to an RDKit-backed endpoint (web service, REST API, PostgreSQL cartridge, or notebook)
  3. Parser reads freed heap memory during molecule graph construction, causing a crash or returning stale data

[No reproducer or sanitizer output attached — request from security-cvd@anthropic.com if needed.]

Acknowledgement

This vulnerability was discovered by Claude, Anthropic's AI assistant, and triaged by the Anthropic security team in collaboration with Anthropic Research. Please direct questions to security-cvd@anthropic.com and reference ANT-2026-N7D3E5WK.


Reference: ANT-2026-N7D3E5WK
Anthropic CVD Policy: https://www.anthropic.com/coordinated-vulnerability-disclosure

SECURITY RESEARCH FIRM ANALYSIS

Triage and disclosure were performed by Ada Logics.

Verdict
true positive
Severity
high
TIMELINE

Dates from discovery through public reveal.

  1. 2026-03-20 Reported to tracker
  2. 2026-04-29 Sent to maintainer
  3. 2026-04-30 Patch released
  4. 2026-05-07 Maintainer acknowledged
  5. 2026-07-08 Publicly revealed
PROVENANCE

SHA-3-512 hash:

faac8bacfa232209d5fb178c1929923e784b68d6032c8e5ff929f350eaceace723716f2ef18c9173f09a0398414b03c1d1985a2274d40a42ae2472215f795f73

Committed 2026-05-07 07:53 PT

Revealed 2026-07-08 16:00 PT

Verify (download preimage.json)

Show preimage JSON
{
  "ant_id": "ANT-2026-N7D3E5WK",
  "bug_class": "heap-use-after-free",
  "claude_severity": "critical",
  "commit_sha": null,
  "created_at": "2026-03-20T19:13:47+00:00",
  "description": "OSS-Fuzz's smiles_string_to_mol_fuzzer target triggered a heap-use-after-free in RDKit's C++ SMILES parsing code path. A crafted SMILES string causes the molecule-graph construction logic to read from a heap allocation after it has been freed. An attacker controls the SMILES input string, which is a common unauthenticated entry point in cheminformatics web services, REST APIs, and the RDKit PostgreSQL cartridge. The result is a reliable crash (DoS), with potential for stale-heap information disclosure and theoretical escalation to RCE via heap grooming.",
  "discovered_at": null,
  "location": "getChiralTag at Code/GraphMol/Atom.h:245, called from Chirality::cleanupStereoGroups at Code/GraphMol/Chirality.cpp:2188",
  "poc_sha256": "0379c80704d5560a129ef06fc9ca23902197791806918bf29515145f28860e27",
  "preimage_version": 1,
  "project": "rdkit",
  "reproduction": [
    "1. Craft a malicious SMILES string that exercises the vulnerable parser code path",
    "2. Submit the string to an RDKit-backed endpoint (web service, REST API, PostgreSQL cartridge, or notebook)",
    "3. Parser reads freed heap memory during molecule graph construction, causing a crash or returning stale data"
  ],
  "technical_details": "ASAN: READ on freed heap memory (heap-use-after-free). The SMILES parser dereferences a pointer into a heap region that has already been freed during molecule construction; the precise root cause — iterator invalidation, premature object destruction, or a dangling pointer in graph construction — could not be determined without the crashing input or stack trace.",
  "title": "Heap-use-after-free in Chirality::cleanupStereoGroups at Chirality.cpp:2188 via SMILES stereo group referencing atom freed by removeHs",
  "vendor_severity": "high"
}