CVE-2025-62594: ImageMagick CLAHE Denial of Service Vulnerability
MODERATECVE-2025-62594 is a MODERATE (CVSS 4.7) denial of service vulnerability (CWE-369: Divide By Zero) affecting ImageMagick CLAHE libraries in the NuGet ecosystem. The issue involves unsigned underflow and division-by-zero lead to oob pointer arithmetic and process crash (dos). Remediation is available in the latest vendor maintenance releases.
CVE-2025-62594 at a Glance
Security Impact
CVSS: 4.7
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:N/A:H).
How to Fix CVE-2025-62594
To remediate this vulnerability, upgrade all affected ImageMagick CLAHE dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade Magick.NET-Q8-OpenMP-arm64 to Latest secure release
Upgrade Magick.NET-Q16-x64 to Latest secure release
Upgrade Magick.NET-Q8-x64 to Latest secure release
Upgrade Magick.NET-Q16-HDRI-x64 to Latest secure release
Upgrade Magick.NET-Q8-OpenMP-x64 to Latest secure release
Upgrade Magick.NET-Q16-HDRI-OpenMP-x64 to Latest secure release
Upgrade Magick.NET-Q16-OpenMP-x64 to Latest secure release
Upgrade Magick.NET-Q8-arm64 to Latest secure release
Upgrade Magick.NET-Q16-arm64 to Latest secure release
Upgrade Magick.NET-Q16-OpenMP-arm64 to Latest secure release
Upgrade Magick.NET-Q16-HDRI-OpenMP-arm64 to Latest secure release
Upgrade Magick.NET-Q16-HDRI-arm64 to Latest secure release
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for Magick.NET-Q8-OpenMP-arm64
How to Check if You Are Affected
To determine whether your application is affected by CVE-2025-62594, inspect your project dependencies for ImageMagick CLAHE:
inspect dependencies for Magick.NET-Q8-OpenMP-arm64
Analyze the terminal output to locate any version of ImageMagick CLAHE in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than the patched release), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-369: Divide By Zero, where the product divides a value by zero. In ImageMagick CLAHE, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2025-62594 Affected ImageMagick CLAHE Versions
12 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
Magick.NET-Q8-OpenMP-arm64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-x64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q8-x64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-HDRI-x64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q8-OpenMP-x64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-HDRI-OpenMP-x64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-OpenMP-x64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q8-arm64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-arm64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-OpenMP-arm64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-HDRI-OpenMP-arm64
|
NuGet |
≤ 14.9.0
|
|
|
Magick.NET-Q16-HDRI-arm64
|
NuGet |
≤ 14.9.0
|
|
References
Frequently Asked Questions
What is CVE-2025-62594?
Which ImageMagick CLAHE versions are affected?
What version fixes CVE-2025-62594?
Is Magick.NET-Q8-OpenMP-arm64 affected?
Is Magick.NET-Q16-x64 affected?
What is the CVSS score of CVE-2025-62594?
What CWE is associated with CVE-2025-62594?
How can I check NuGet dependencies for CVE-2025-62594?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-wpp4-vqfq-v4hp",
"modified" : "2025-10-27T23:33:10Z",
"published" : "2025-10-27T23:33:10Z",
"aliases" : [ "CVE-2025-62594" ],
"summary" : "ImageMagick CLAHE : Unsigned underflow and division-by-zero lead to OOB pointer arithmetic and process crash (DoS)",
"details" : "## Summary\n\nA single root cause in the CLAHE implementation — tile width/height becoming zero — produces two distinct but related unsafe behaviors.\nVulnerabilities exists in the `CLAHEImage()` function of ImageMagick’s `MagickCore/enhance.c`.\n\n1. Unsigned integer underflow → out-of-bounds pointer arithmetic (OOB): when `tile_info.height == 0`, the expression `tile_info.height - 1` (unsigned) wraps to a very large value; using that value in pointer arithmetic yields a huge offset and OOB memory access (leading to memory corruption, SIGSEGV, or resource exhaustion).\n2. **Division/modulus by zero**: where code performs `... / tile_info.width` or `... % tile_info.height` without re-checking for zero, causing immediate division-by-zero crashes under sanitizers or `abort` at runtime.\n\nBoth behaviors are triggered by the same invalid tile condition (e.g., CLI exact `-clahe 0x0!` or automatic tile derivation `dim >> 3 == 0` for very small images). \n\n---\n\n## Details\n\n### **Unsigned underflow(can lea to OOB)**\n\n- Location: `MagickCore/enhance.c`, around line 609\n- Version tested: 7.1.2-8 (local ASan(undefined). /UBSan build)\n- Vulnerable code\n \n enhance.c: 609\n \n ```c\n p += (ptrdiff_t) clahe_info->width * (tile.height - 1);\n ```\n \n- Root Cause\n - If `tile.height == 0`, then `(tile.height - 1)` underflows to `UINT_MAX`.\n - Multiplication with `clahe_info->width` yields a huge value close to `SIZE_MAX`.\n - Adding this to `p` causes pointer arithmetic underflow.\n\n### **Division-by-zero**\n\n- File / Location: `MagickCore/enhance.c`, around line 669\n- Version tested: 7.1.2-8 (local ASan(undefined). /UBSan build)\n- vulnerable code\n \n enhance.c: 669-673\n \n ```c\n if ((image->columns % tile_info.width) != 0)\n tile_info.x=(ssize_t) (tile_info.width-(image->columns % tile_info.width));\n tile_info.y=0;\n if ((image->rows % tile_info.height) != 0)\n tile_info.y=(ssize_t) (tile_info.height-(image->rows % tile_info.height));\n ```\n \n- Root cause\n \n Missing input validation / bounds checks after computing default tile dimensions:\n \n If either `tile_info.width` or `tile_info.height` is 0, this triggers a division by zero. Zeros can reach this point through:\n \n 1. Exact tiles: CLI `clahe 0x0!` (the `!` forces zero to be used verbatim).\n 2. Auto tiles on tiny images: When a requested tile is `0` (no `!`), the code derives a default from the image size (e.g., `dim >> 3`). For images with `dim < 8`, this result is 0 unless clamped.\n\n---\n\n## Reproduction\n\n### **Unsigned underflow**\n\n**Environment**\n\nBuilt with AddressSanitizer and UndefinedBehaviorSanitizer enabled.\n\n```c\nexport UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1\nexport ASAN_OPTIONS=abort_on_error=1:allocator_may_return_null=1:detect_leaks=0\n```\n\n**Command**\n\n```bash\n./magick xc:black -clahe 0x0 null:\n```\n\n**Output**\n\n```\nMagickCore/enhance.c:609:6: runtime error: addition of unsigned offset overflowed\nSUMMARY: UndefinedBehaviorSanitizer: undefined-behavior MagickCore/enhance.c:609:6 in CLAHEImage\n```\n\n`./magick -size 10x10 xc:black -clahe 0x0 null:`\n\n<img width=\"1068\" height=\"64\" alt=\"image\" src=\"https://github.com/user-attachments/assets/cd9637ee-1d03-4066-834d-fda22410dd8b\" />\n\nmemory region corruption.\n\n`./magick -size 2000x2000 xc:black -clahe 0x0 null:`\n\n<img width=\"1069\" height=\"70\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ecbab79c-a3c2-4e8c-96c9-8e2aa8f0d2b2\" />\n\n→ Significant memory consumption and evidence of memory region corruption.\n\n`./magick -size 4000x4000 xc:black -clahe 0x0 null:`\n\n<img width=\"776\" height=\"49\" alt=\"image\" src=\"https://github.com/user-attachments/assets/63a7cec5-616b-4aa5-87f3-a546a87e6625\" />\n\n→ Much larger memory usage; process appears to be aggressively consuming cache and address space.\n\n`./magick -size 8000x8000 xc:black -clahe 0x0 null:`\n\n<img width=\"748\" height=\"46\" alt=\"image\" src=\"https://github.com/user-attachments/assets/48b3aac8-98b3-4fbb-a5ca-4e7936bca44b\" />\n\n→ Memory usage escalates further and begins exhausting available cache. If left running, the process is likely to crash (DoS) after sustained allocation attempts.\n\n### **Division-by-zero**\n\n**Environment:** ASan/UBSan-enabled build.\n\n```c\nexport UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1\nexport ASAN_OPTIONS=abort_on_error=1:allocator_may_return_null=1:detect_leaks=0\n```\n\n**Command**\n\n```bash\n./magick -size 16x2 gradient: -type TrueColor -depth 8 -clahe 0x0! null:\n```\n\n**Output**\n\n<img width=\"1915\" height=\"818\" alt=\"image\" src=\"https://github.com/user-attachments/assets/cfe44432-b429-49e4-8673-2ed55ba9a961\" />\n\n**Notes:** Without sanitizers, the process may terminate with just `Aborted` (still DoS).\n\n---\n\n## Impact\n\n- Primary: Denial-of-Service — crash or sustained resource exhaustion (memory/cache thrash) when processing crafted parameters or small images via CLI or API. Attackers can trivially trigger via `clahe 0x0!` or by uploading very small images to services using ImageMagick.\n- Secondary (theoretical): OOB memory accesses and memory corruption could potentially be combined with other vulnerabilities to achieve more severe outcomes; however, no reliable code execution was demonstrated from these PoCs alone.\n\n---\n\n## Suggested concrete patch snippets\n\nApply in `CLAHEImage()` after `tile_info` is computed but **before** any division/modulus/pointer arithmetic:\n\n```c\nif (exact_tiles_requested && (tile_info.width == 0 || tile_info.height == 0)) {\n ThrowMagickException(exception, GetMagickModule(), OptionError,\n \"CLAHEInvalidTile\", \"%lux%lu\",\n (unsigned long) tile_info.width,\n (unsigned long) tile_info.height);\n return (Image *) NULL;\n}\n\nif (!exact_tiles_requested) {\n tile_info.width = (tile_info.width == 0) ? MagickMax((size_t)1, image->columns >> 3) : tile_info.width;\n tile_info.height = (tile_info.height == 0) ? MagickMax((size_t)1, image->rows >> 3) : tile_info.height;\n}\n\nif (tile_info.width == 0 || tile_info.height == 0) {\n ThrowMagickException(exception, GetMagickModule(), OptionError,\n \"CLAHEInvalidTile\", \"%lux%lu\",\n (unsigned long) tile_info.width,\n (unsigned long) tile_info.height);\n return (Image *) NULL;\n}\n\nssize_t tile_h_minus1 = (ssize_t)tile_info.height - 1;\nif (tile_h_minus1 < 0) {\n ThrowMagickException(exception, GetMagickModule(), OptionError,\n \"CLAHEInvalidTile\", \"%lux%lu\",\n (unsigned long) tile_info.width,\n (unsigned long) tile_info.height);\n return (Image *) NULL;\n}\np += (ptrdiff_t) clahe_info->width * tile_h_minus1;\n```\n\nNotes about `exact_tiles_requested`: if the CLI/Wand parser already exposes whether `!` was present, use it. If not, add a parse-time flag so CLAHEImage can know whether `0` is literal or auto.\n\n---\n\n## Credit\n\n### Team Whys \n\n**Bug Hunting Master Program, HSpace/Findthegap**\n\n**Youngmin Kim** \nkunshim@naver.com\n\n**Woojin Park**\n\n[@jin-156](https://github.com/jin-156)\n[1203kids@gmail.com](mailto:1203kids@gmail.com)\n\n**Youngin Won**\n\n[@amethyst0225](https://github.com/amethyst0225)\n[youngin04@korea.ac.kr](mailto:youngin04@korea.ac.kr)\n\n**Siyeon Han**\n\n[@hanbunny](https://github.com/hanbunny)\n[kokosyeon@gmail.com](mailto:kokosyeon@gmail.com)\n\n**Shinyoung Won**\n\n[@yosiimich](yosimich123@gmail.com)\n[yosimich123@gmail.com](mailto:yosimich123@gmail.com)",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:N/A:H"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-x64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q8-x64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-HDRI-x64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q8-OpenMP-x64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-HDRI-OpenMP-x64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-OpenMP-x64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q8-arm64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-arm64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-OpenMP-arm64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q8-OpenMP-arm64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-HDRI-OpenMP-arm64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
}, {
"package" : {
"ecosystem" : "NuGet",
"name" : "Magick.NET-Q16-HDRI-arm64"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"last_affected" : "14.9.0"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-wpp4-vqfq-v4hp"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2025-62594"
}, {
"type" : "WEB",
"url" : "https://github.com/ImageMagick/ImageMagick/commit/7b47fe369eda90483402fcd3d78fa4167d3bb129"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/ImageMagick/ImageMagick"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-119", "CWE-191", "CWE-369" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2025-10-27T23:33:10Z",
"nvd_published_at" : "2025-10-27T20:15:54Z"
}
}