Lachesis blind CVE rediscovery benchmark

85.7% of known CVEs independently rediscovered.

Lachesis found 12 of 14 known vulnerabilities without being told the bug class, vulnerable file, or source location.

The only public blind CVE rediscovery benchmark of its kind. Hits, misses, and closed coverage gaps remain on the same board.

Read the methodology
Current certified runAug 24, 2026
85.7%Current rediscovery rate
Corpus
14
Hits
12
Misses
2
Open gaps
2

Current rate counts closed coverage gaps as hits. First-pass performance remains visible below.

The rules were fixed before the score.

Disclosed CVEs across C, Python, JavaScript, and TypeScript whose vulnerable revision is buildable and whose bug class falls within the reader's modeled sink taxonomy.

Each case was analyzed at component scope (the affected functions/module). Absolute rank across a full repository is reported only for repo-scope runs, which are not yet included.
Blind

The tool is never told the bug, its family, or its location.

Whole taxonomy

Enumeration runs over the entire candidate taxonomy, every family.

Region matched

A HIT requires the enumerator to surface, unprompted, a candidate whose file:line falls in the CVE's fixed region.

Reproducible

The reader is open-source; per-case candidate output is publishable and re-runnable.

One score. Every denominator visible.

Breakdowns use the same certified cases as the headline rate.

First pass85.7%
Current85.7%

0 coverage gaps have closed without erasing the original miss.

By language

c5/5
python5/5
typescript1/3
javascript1/1

By vulnerability class

injection4/5
memory-safety5/5
path-traversal3/3
dos0/1
Patched-revision control armpending

Patched-revision control arm not yet run.

For cases with a patched-revision arm: the sink should disappear or drop sharply once patched.

Every result stays on the board.

Hits link to their evidence path. Misses remain visible with the recorded reason they were not found.

1–8 of 14
CVEProjectLanguageClassVerdictCoverageWitnessed sinkDetails
CVE-2024-23334aiohttppythonPath traversal (CWE-22)HITDetected first passaiohttp/web_urldispatcher.py:659
component scopeCWE-22 · Path traversalOriginal advisory
Sink familyfilesystem.path.containment
Locationaiohttp/web_urldispatcher.py:659
Score0.7375
Guardnone-observed
View the full casefile
CVE-2025-59681djangopythonSQL injection via column alias (# inline-comment on MySQL/MariaDB)HITDetected first passdjango/db/models/query.py:1187
component scopeCWE-89 · SQL injection via column aliasOriginal advisory
Sink familyinjection.query.escaping
Locationdjango/db/models/query.py:1187
Guardnone-observed
View the full casefile
CVE-2025-59682djangopythonPartial directory traversal in archive.extract() (startswith prefix check)HITDetected first passdjango/utils/archive.py:231
component scopeCWE-22 · Partial directory traversal in archive.extractOriginal advisory
Sink familyfilesystem.path.containment
Locationdjango/utils/archive.py:231
Score0.7375
Guardnone-observed
View the full casefile
CVE-2025-64340fastmcppythonOS command injection via server name in subprocess-backed install commands (CWE-78)HITDetected first passsrc/fastmcp/cli/install/claude_code.py:141
component scopeCWE-78 · OS command injection via server name in subprocess-backed inOriginal advisory
Sink familyinjection.exec.escaping
Locationsrc/fastmcp/cli/install/claude_code.py:141
Score0.8125
Guardnone-observed
View the full casefile
CVE-2025-64718js-yamljavascriptjs-yaml: the merge key that reached the prototypeHITDetected first passlib/loader.js:301
component scopeCWE-1321 · prototype pollutionOriginal advisory
Sink familyobject-integrity.prototype
Locationlib/loader.js:301
Guardnone-observed
View the full casefile
CVE-2025-68664langchain-corepythonUnsafe deserialization: attacker-crafted JSON -> load()/loads() Reviver revives a {"lc":1,"type":"constructor"} node -> importlib.import_module on the deserialized namespace + reflective cls(**kwargs) instantiation, gated only by a namespace allowlist (CWE-502 -> CWE-94/95)HITDetected first passlibs/core/langchain_core/load/load.py:169
component scopeCWE-502 → CWE-94 → CWE-95 · Unsafe deserializationOriginal advisory
Sink familyinjection.exec.escaping
Locationlibs/core/langchain_core/load/load.py:169
Score0.625
Guardnone-observed
View the full casefile
CVE-2025-24928libxml2cStack buffer overflow via cumulative strcat with stale length checkHITDetected first passvalid.c:5024
component scopeCWE-787 → CWE-121 · Stack buffer overflow via cumulative strcat with stale lengtOriginal advisory
Sink familymemory.copy.capacity
Locationvalid.c:5024
Score0.92
Guardnone-observed
View the full casefile
CVE-2025-6021libxml2cxmlBuildQName: the length math that wrappedHITDetected first passtree.c:195
component scopeCWE-190 → CWE-787 → CWE-122 · integer overflow → heap/stack buffer overflowOriginal advisory
Sink familymemory.copy.capacity
Locationtree.c:195
Guardnone-observed
View the full casefile

The misses are part of the result.

Coverage gaps stay public when they open and after they close.

2 open0 closed

Open gaps

What Lachesis does not catch yet
Gap openCVE-2025-25285

sink shape not modeled

MISS (sink SHAPE not modeled -- the catalogued ReDoS sink is tainted-pattern-into-RegExp; this CVE is a STATIC catastrophic regex literal with an attacker-controlled SUBJECT string via String.match, which has no enumerable constructor)

Gap openCVE-2025-64495

sink shape not modeled

MISS (sink SHAPE not modeled -- the CVE sink is a DOM property-write `element.innerHTML = html`; the XSS catalogue models only method-call sinks, so the property-assignment sink has no enumerable constructor)

Closed gaps

What changed, and when

No closed gaps are recorded in this artifact.

What this shows.
And what it does not.

It shows
Whether blind enumeration surfaced a candidate inside each CVE's fixed region.
Scope varies
Each case was analyzed at component scope (the affected functions/module). Absolute rank across a full repository is reported only for repo-scope runs, which are not yet included.
The denominator
Sink classes the reader models. Temporal classes such as use-after-free and double-free are not represented as modeled sink families.
False positives
Patched-revision control arm not yet run.