CVE-2024-47606:gstreamer: Integer underflow
A reconstruction of the flaw, and the evidence path Lachesis follows to make it visible.
integer underflow -> oversized size -> heap OOB write: qtdemux_parse_theora_extension does size -= 8 on a small size, underflowing to a huge 64-bit value used as a copy.
That is the shape of the failure. The rest of this case file follows the evidence behind it.
What was known.
What Lachesis established.
Known before Lachesis ran
The CVE and vulnerable release were selected from public history. We are not claiming novel discovery.
- CVE
- CVE-2024-47606
- Vulnerable target
- 1.24.9 (last-vulnerable) · vulnerable
- Prior knowledge
- CVE-2024-47606 · 1.24.9 (last-vulnerable) is vulnerable
Guided historical reconstruction
The experiment graph was built around the last-vulnerable release (1.24.9), scoped to the isomp4 plugin (qtdemux), enriched (pass2 dataflow + atropos bind), then enumerated BLIND over the whole constructor registry (no family hard-coded, no target line seeded). Build 8s under the 300s pass cap, bounded memory. The census below is the enumerator's own verbatim output; the real-sink note is MY reading of the advisory, kept separate from tool output.
- Seeded inputs
- None
- Run timestamp
- 2026-09-03T00:00:00Z
- Evidence artifact
- cve-2024-47606.kuzu (built from gstreamer 1.24.9, scoped to the isomp4 plugin (qtdemux); graph + sidecars deleted after capture)
The commands and outputs below come from this recorded Lachesis run.
What Lachesis reconstructed.
One historical repository. Four captured queries. A complete source-to-sink argument.
Lachesis follows the same evidence path through unfamiliar repositories.
Here is how the path becomes visible.
These are the recorded questions Lachesis asked of the historical vulnerable code, followed by the raw result and source location each query returned.
Captured runA real replay of Lachesis over the graph we built for this case (build 8s under the pass cap, bounded memory). Every census value is verbatim captured tool output; the graph was released immediately after capture, so nothing accumulates.
The dangerous operation surfaces as a candidate
class-matched candidate surfaced in a sibling file, not in qtdemux.c
memory.copy.capacity candidate at properties.c:63 (id obl_16bf613231028e8f353f)A small line with a large consequence.
qtdemux_parse_theora_extension subtracts 8 from an attacker-controlled size without first checking size >= 8, so the unsigned size underflows to a huge value used as a length, causing a heap OOB write.
// see real_sink_note
// later GStreamer validates size >= 8 before the subtraction.
The original record.
Read the historical advisory and vulnerability record behind this reconstruction.