ANT-2026-B4Z27MGE · gpac
other high
Severity Claude high · Security research firm - · Maintainer -
Discovered by Claude Mythos Preview
Anthropic's analysis of this finding, sealed at approval.
ANT-2026-B4Z27MGE: gpac/fuzz_route/20251128_202533_unknown/
GPAC's DASH manifest handling extracts the printf-style specifier from segment templates such as $Number%05d$ and uses it directly as the format argument to sprintf when resolving segment URLs. The prior sanity check only verified that a 'd', 'i' or 'u' character appeared somewhere in the string, so specifiers like %n, %s or multiple conversions were accepted. The same untrusted-format pattern exists in gf_mpd_resolve_subnumber and in the ROUTE/ATSC3 STSID TOI-template parser. An attacker who serves a malicious MPD manifest or ROUTE STSID can therefore inject an arbitrary format string, leading to memory corruption or information disclosure when the template is expanded.
Target
Project: gpac
Location: src/media_tools/route_dmx.c:gf_route_service_setup_stsid (unvalidated printf format specifier from S-TSID TOI template; shared root cause also in src/media_tools/mpd.c:gf_mpd_resolve_url)
Discovery: static analysis — not yet dynamically reproduced
Technical Details
The root cause is that an attacker-controlled string is used as the format parameter of sprintf. The old guard if (!strchr(szPrintFormat,'d') && !strchr(szPrintFormat,'i') && !strchr(szPrintFormat,'u')) strcat(szPrintFormat,"d"); does not restrict the string to a single integer conversion, so payloads such as %n%d or %4919$s pass validation. In gf_mpd_resolve_subnumber the specifier was passed to sprintf with no validation at all.
Reproduction
This finding was identified by static analysis and has not yet been dynamically reproduced. The Technical Details section above describes the code path; a trigger input is not included.
[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-B4Z27MGE.
Reference: ANT-2026-B4Z27MGE
Anthropic CVD Policy: https://www.anthropic.com/coordinated-vulnerability-disclosure
https://github.com/gpac/gpac/commit/5db36afe0f20a02ea2344d42521e687820096cf4
Dates from discovery through public reveal.
- 2026-02-04 Patch released
- 2026-03-29 Reported to tracker
- 2026-05-08 Sent to maintainer
- 2026-05-08 Maintainer acknowledged
- 2026-07-20 Publicly revealed
SHA-3-512 hash:
3d38a652b5c09d79c4ee53e0357f95d9e120fb9ce3485948d6c4b12cca1f3d0c5e30b639ad887b2c072297749656bb2689666c2801c477804cb6a1ea50701897
Committed 2026-05-08 09:37 PT
Revealed 2026-07-20 22:14 PT
Verify (download preimage.json)
Show preimage JSON
{
"ant_id": "ANT-2026-B4Z27MGE",
"bug_class": null,
"claude_severity": "high",
"commit_sha": null,
"created_at": "2026-03-29T20:43:34+00:00",
"description": "GPAC's DASH manifest handling extracts the printf-style specifier from segment templates such as $Number%05d$ and uses it directly as the format argument to sprintf when resolving segment URLs. The prior sanity check only verified that a 'd', 'i' or 'u' character appeared somewhere in the string, so specifiers like %n, %s or multiple conversions were accepted. The same untrusted-format pattern exists in gf_mpd_resolve_subnumber and in the ROUTE/ATSC3 STSID TOI-template parser. An attacker who serves a malicious MPD manifest or ROUTE STSID can therefore inject an arbitrary format string, leading to memory corruption or information disclosure when the template is expanded.",
"discovered_at": "2025-11-28T00:00:00+00:00",
"location": null,
"poc_sha256": null,
"preimage_version": 1,
"project": "GPAC",
"reproduction": null,
"technical_details": "The root cause is that an attacker-controlled string is used as the format parameter of sprintf. The old guard `if (!strchr(szPrintFormat,'d') && !strchr(szPrintFormat,'i') && !strchr(szPrintFormat,'u')) strcat(szPrintFormat,\"d\");` does not restrict the string to a single integer conversion, so payloads such as `%n%d` or `%4919$s` pass validation. In gf_mpd_resolve_subnumber the specifier was passed to sprintf with no validation at all.",
"title": "gpac/fuzz_route/20251128_202533_unknown/",
"vendor_severity": null
}