ANT-2026-1FT5E1XF · lcms

stack-buffer-overflow low

Severity Claude high · Security research firm high · Maintainer low

Discovered by Claude Mythos Preview

REPORT

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

ANT-2026-1FT5E1XF: Stack-buffer-overflow in cmslut.c:1373

When creating a color transform that takes the BlackPreservingKPlaneIntents path, BlackPreservingSampler in cmscnvrt.c allocates a fixed 16-byte (4-float) stack array 'Outf' and passes it to cmsPipelineEvalFloat/_LUTevalFloat. _LUTevalFloat at cmslut.c:1373 memcpy's output based on the pipeline's declared output-channel count, which is derived from the attacker-supplied ICC profile and can reach 15 channels (60 bytes). The resulting 60-byte write overruns 'Outf' and corrupts adjacent stack objects and redzones. An attacker who can supply an ICC profile processed with a black-preserving intent can overwrite stack memory, potentially leading to control-flow hijack.

Target

Project: lcms
Location: cmslut.c:1373

Technical Details

ASAN: "WRITE of size 60 at 0x73d5a3bda750 ... stack-buffer-overflow ... in _LUTevalFloat /src/lcms/src/cmslut.c:1373". The destination is the 16-byte 'Outf' array ([64,80) in the frame) in BlackPreservingSampler, but the memcpy length is computed from the LUT/pipeline output-channel count taken from the profile rather than the caller's buffer size, so a profile declaring many output channels overflows the fixed 4-float stack buffer.

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

INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 4161537645
INFO: Loaded 1 modules   (8027 inline 8-bit counters): 8027 [0x5afb2e537230, 0x5afb2e53918b), 
INFO: Loaded 1 PC tables (8027 PCs): 8027 [0x5afb2e539190,0x5afb2e558740), 
/out/cms_transform_all_fuzzer: Running 1 inputs 1 time(s) each.
Running: /tmp/poc
EXIT_CODE:1


=== ASAN Report ===
=================================================================
==27==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x73d5a3bda750 at pc 0x5afb2e3ca54e bp 0x7ffef9234050 sp 0x7ffef9233810
WRITE of size 60 at 0x73d5a3bda750 thread T0
    #0 0x5afb2e3ca54d in __asan_memcpy /src/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:63:3
    #1 0x5afb2e4a4b57 in _LUTevalFloat /src/lcms/src/cmslut.c:1373:5
    #2 0x5afb2e47acb3 in BlackPreservingSampler /src/lcms/src/cmscnvrt.c:895:5
    #3 0x5afb2e4a0f26 in cmsStageSampleCLut16bit /src/lcms/src/cmslut.c:796:14
    #4 0x5afb2e47a485 in BlackPreservingKPlaneIntents /src/lcms/src/cmscnvrt.c:1069:5
    #5 0x5afb2e43af73 in cmsCreateExtendedTransform /src/lcms/src/cmsxform.c:1195:11
    #6 0x5afb2e43d9e0 in cmsCreateMultiprofileTransformTHR /src/lcms/src/cmsxform.c:1311:12
    #7 0x5afb2e43d9e0 in cmsCreateTransformTHR /src/lcms/src/cmsxform.c:1352:12
    [... 10 more frames — full trace in crash.log]

Reproduction

  1. Craft an ICC profile whose pipeline advertises a large output-channel count (e.g., 15)
  2. Arrange for the profile/intent combination to select the BlackPreservingKPlaneIntents code path
  3. Deliver the profile to the target (embedded in an image or as a standalone .icc) so cmsCreateTransform is invoked
  4. During CLUT sampling, BlackPreservingSampler calls _LUTevalFloat which memcpy's 60 bytes into the 16-byte 'Outf' stack array, smashing adjacent stack memory

[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-1FT5E1XF.


Reference: ANT-2026-1FT5E1XF
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-24 Reported to tracker
  2. 2026-05-31 Maintainer acknowledged
  3. 2026-06-01 Patch released
  4. 2026-06-06 Sent to maintainer
  5. 2026-08-17 Publicly revealed
PROVENANCE

SHA-3-512 hash:

8ace4605e88b369ec66d1d30d9ac433a227e6acf378abd00225300e6f5ffe6b9486a31a63fec380f49e2fc8ac237db5cebccbb400ae67622dcc27e33f4575d7a

Committed 2026-06-06 00:20 PT

Revealed 2026-08-17 10:47 PT

Verify (download preimage.json)

Show preimage JSON
{
  "ant_id": "ANT-2026-1FT5E1XF",
  "bug_class": "Stack-buffer-overflow",
  "claude_severity": "high",
  "commit_sha": null,
  "created_at": "2026-03-24T18:46:43+00:00",
  "description": "When creating a color transform that takes the BlackPreservingKPlaneIntents path, BlackPreservingSampler in cmscnvrt.c allocates a fixed 16-byte (4-float) stack array 'Outf' and passes it to cmsPipelineEvalFloat/_LUTevalFloat. _LUTevalFloat at cmslut.c:1373 memcpy's output based on the pipeline's declared output-channel count, which is derived from the attacker-supplied ICC profile and can reach 15 channels (60 bytes). The resulting 60-byte write overruns 'Outf' and corrupts adjacent stack objects and redzones. An attacker who can supply an ICC profile processed with a black-preserving intent can overwrite stack memory, potentially leading to control-flow hijack.",
  "discovered_at": null,
  "location": "cmslut.c:1373",
  "poc_sha256": null,
  "preimage_version": 1,
  "project": "lcms",
  "reproduction": [
    "1. Craft an ICC profile whose pipeline advertises a large output-channel count (e.g., 15)",
    "2. Arrange for the profile/intent combination to select the BlackPreservingKPlaneIntents code path",
    "3. Deliver the profile to the target (embedded in an image or as a standalone .icc) so cmsCreateTransform is invoked",
    "4. During CLUT sampling, BlackPreservingSampler calls _LUTevalFloat which memcpy's 60 bytes into the 16-byte 'Outf' stack array, smashing adjacent stack memory"
  ],
  "technical_details": "ASAN: \"WRITE of size 60 at 0x73d5a3bda750 ... stack-buffer-overflow ... in _LUTevalFloat /src/lcms/src/cmslut.c:1373\". The destination is the 16-byte 'Outf' array ([64,80) in the frame) in BlackPreservingSampler, but the memcpy length is computed from the LUT/pipeline output-channel count taken from the profile rather than the caller's buffer size, so a profile declaring many output channels overflows the fixed 4-float stack buffer.",
  "title": "Stack-buffer-overflow in cmslut.c:1373",
  "vendor_severity": "high"
}