{"id":"TECH-202610-nuxt-image-s-default-ipx-route-lets-one-crafted-image-crash-","kind":"technique","aliases":[],"related":[],"title":"Nuxt Image's default /_ipx route lets one crafted image crash the server and possibly run code (ipx multi-page decode overflow, no CVE yet)","description":null,"summary":"Nuxt published GHSA-p5vf-pjf5-ggj3 (@nuxt/image) and GHSA-qf89-6xm4-66wm (ipx) on 2026-10-30, rated CVSS 8.1 with no CVE yet. ipx has an integer overflow when it decodes multi-page images (TIFF, GIF, WebP, AVIF). @nuxt/image registers the unauthenticated /_ipx route by default on server deployments. If an attacker can get their own image bytes in as an IPX source (an upload under a public path, a user-content host in image.domains, or arbitrary remote hosts allowed), a single request with no modifier needed reliably crashes the process. The memory corruption may also allow remote code execution with that process's privileges; in the reporter's reproduction it ran as root in a stock container. Affected versions: @nuxt/image 2.0.0 to <2.2.1, 1.0.0 to <1.11.2, and 0.6.x (end of life, no fix); ipx <2.1.2, 3.0.0 to <3.1.3, 4.0.0 to <4.1.0. Not affected: Vercel, Netlify and AWS Amplify image providers (unless image.ipx is set), Cloudflare Workers and other edge runtimes, and static nuxt generate builds unless the build reads attacker images. Cloudflare shipped an emergency WAF rule (disabled by default, partial coverage) on 2026-10-30. No in-the-wild exploitation reported.","severity":"high","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"@nuxt/image","fixed":["2.2.1"],"affected":">= 2.0.0, < 2.2.1","ecosystem":"npm"},{"name":"@nuxt/image","fixed":["1.11.2"],"affected":">= 1.0.0, < 1.11.2","ecosystem":"npm"},{"name":"@nuxt/image","fixed":[],"affected":">= 0.6.0, < 1.0.0","ecosystem":"npm"},{"name":"ipx","fixed":["2.1.2","3.1.3","4.1.0"],"affected":"< 2.1.2, >= 3.0.0 < 3.1.3, >= 4.0.0-0 < 4.1.0","ecosystem":"npm"}],"ecosystems":[],"tags":["early-warning","ipx","nuxt","self-hosted","sharp","technique"],"not_affected_if":[],"how_to_check":"Run npm ls @nuxt/image ipx and compare against the affected ranges. Check whether the app runs as a Node server or container with the default ipx provider (or image.provider: 'ipx'). If so, check whether GET /_ipx/... answers publicly. Check whether users can upload images into served public paths, or whether image.domains lists hosts other people can write to. Repeated process crashes on /_ipx requests are a possible sign of probing.","fix":"Upgrade @nuxt/image to 2.2.1 or 1.11.2 and confirm npm ls ipx resolves to 4.1.0, 3.1.3 or 2.1.2 (ipx is an optional dependency, so upgrade it directly if you also depend on it). Move off 0.x. On 2.2.1, consider image.ipx.restrictDecoders if any source is untrusted. Until patched: register your own /_ipx handler returning 404, or block /_ipx/** at the reverse proxy; keep uploads out of served paths and restrict image.domains to hosts you control. Restricting modifiers does not help. Cloudflare users can enable Managed Ruleset rule ...5b82bffe ('Nuxt Image / IPX - Explicit GIF or Animation Modifier Exposure'), but it is only partial coverage.","status":"open","published_at":"2026-10-30T00:00:00+00:00","first_seen_at":"2026-10-31T22:38:35+00:00","triaged_at":"2026-10-31T22:38:35+00:00","updated_at":"2026-10-31T22:38:35+00:00","category":"package","confidence":null,"triage":null,"analyst_status":"done","analyst_note":null,"search":"'-10':72B,246B '-202610':28A '-30':73B,247B '/_ipx':5A,101B '0.6':188B '1.0.0':184B '1.11.2':186B '2.0.0':181B '2.1.2':196B '2.2.1':183B '2026':71B,245B '3.0.0':197B '3.1.3':199B '4.0.0':200B '4.1.0':202B '66wm':68B '6xm4':67B '8.1':76B 'affect':178B,204B 'allow':139B,156B 'also':155B 'amplifi':209B 'arbitrari':136B 'attack':110B,231B 'avif':96B 'aw':208B 'build':226B,229B 'byte':116B 'cloudflar':216B,233B 'code':17A,158B 'contain':177B 'content':131B 'corrupt':153B 'coverag':243B 'craft':9A 'crafted':38A 'crash':11A,40A,148B 'cve':25A,79B 'cvss':75B 'decod':22A,88B 'default':4A,33A,104B,241B 'deploy':107B 'disabl':239B 'earli':46B 'early-warn':45B 'edg':220B 'emerg':236B 'end':190B 'execut':159B 'exploit':253B 'fix':194B 'generat':225B 'get':112B 'ggj3':61B 'ghsa':58B,65B 'ghsa-p5vf-pjf5-ggj3':57B 'ghsa-qf89-6xm4-66wm':64B 'gif':94B 'host':52B,132B,138B 'imag':2A,10A,92B,115B,210B,232B 'image':31A,39A 'image.domains':134B 'image.ipx':213B 'in-the-wild':249B 'integ':84B 'ipx':18A,34A,44A,48B,69B,81B,120B,195B 'let':7A 'lets':36A 'life':192B 'may':154B 'memori':152B 'modifi':145B 'multi':20A,90B 'multi-pag':19A,89B 'need':146B 'netlifi':206B 'nuxt':1A,30A,49B,55B,224B 'nuxt-image-s-default-ipx-route-lets-one-crafted-image-crash':29A 'nuxt/image':41A,42A,43A,62B,97B,180B 'one':8A,37A 'overflow':23A,85B 'p5vf':59B 'page':21A,91B 'partial':242B 'path':127B 'pjf5':60B 'possibl':15A 'privileg':164B 'process':150B,162B 'provid':211B 'public':126B 'publish':56B 'qf89':66B 'ran':171B 'rate':74B 'read':230B 'regist':98B 'reliabl':147B 'remot':137B,157B 'report':167B,254B 'reproduct':169B 'request':142B 'root':173B 'rout':6A,102B 'route':35A 'rule':238B 'run':16A 'runtim':221B 's':32A 'self':51B 'self-host':50B 'server':13A,106B 'set':215B 'sharp':53B 'ship':234B 'singl':141B 'sourc':121B 'static':223B 'stock':176B 'tech':27A 'techniqu':54B 'tiff':93B 'unauthent':100B 'unless':212B,227B 'upload':123B 'user':130B 'user-cont':129B 'vercel':205B 'version':179B 'waf':237B 'warn':47B 'webp':95B 'wild':252B 'worker':217B 'x':189B 'yet':26A,80B","nicknames":[],"mitigations":[],"who_affected":null,"tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":null,"audience":null,"plain_action":null,"first_public_at":"2026-10-30T00:00:00+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"analyst","external_id":"TECH-202610-nuxt-image-s-default-ipx-route-lets-one-crafted-image-crash-","url":null,"severity":null,"published_at":"2026-10-30T00:00:00+00:00","modified_at":null,"first_seen_at":"2026-10-31T22:38:35+00:00","fetched_at":"2026-10-31T22:38:35+00:00","note":null}],"documents":[{"id":35224,"url":"https://x.com/CFchangelog/status/2116659277838385262","title":"@CFchangelog: Emergency WAF release adds a detection rule for the Nuxt Image and IPX vulnerabi","kind":"post","source":"x","publisher":null,"text":"Emergency WAF release adds a detection rule for the Nuxt Image and IPX vulnerability. Enable the new rule in your Managed Ruleset to mitigate exposure.\n\nhttps://t.co/TDqOL8gh0r\n\nlikes 8 reposts 1","published_at":"2026-10-31T22:31:12+00:00","relation":"describes","confidence":null,"note":null},{"id":35328,"url":"https://github.com/nuxt/image/security/advisories/GHSA-p5vf-pjf5-ggj3","title":"@nuxt/image GHSA-p5vf-pjf5-ggj3: unauthenticated command execution through the default /_ipx route","kind":"advisory","source":"analyst","publisher":null,"text":"@nuxt/image registers /_ipx by default on server deployments; ipx integer overflow decoding multi-page images (GHSA-qf89-6xm4-66wm) lets one unauthenticated request with attacker-controlled source image crash the server and possibly run code. Affected >=2.0.0 <2.2.1, >=1.0.0 <1.11.2, >=0.6.0 <1.0.0 (0.x EOL, no fix). Fixed 2.2.1 (needs ipx 4.1.0) and 1.11.2 (needs ipx 2.1.2). Not affected: Vercel/Netlify/AWS Amplify providers, edge/worker runtimes, static builds unless build reads attacker images. Workarounds: own handler on /_ipx returning 404, block /_ipx/** at proxy, keep uploads out of public paths, restrict image.domains. allowedModifiers does not help. CVSS 8.1, no CVE.","published_at":"2026-10-30T00:00:00+00:00","relation":"describes","confidence":null,"note":null},{"id":35329,"url":"https://github.com/unjs/ipx/security/advisories/GHSA-qf89-6xm4-66wm","title":"ipx GHSA-qf89-6xm4-66wm: integer overflow in multi-page image decoding","kind":"advisory","source":"analyst","publisher":null,"text":"Crafted multi-page image (TIFF, GIF, WebP, AVIF) corrupts memory in ipx decode; single unauthenticated request crashes process, may allow RCE. Requires attacker control of source bytes (uploads in storage dir, writable http.domains host, allowAllDomains). Affected <2.1.2, >=3.0.0 <3.1.3, >=4.0.0-0 <4.1.0. Fixed 2.1.2, 3.1.3, 4.1.0 (rejects total height >= 100,000,000 with 400 IPX_INVALID_IMAGE). Workaround: trusted sources only; sharpOptions { animated: false } and no pages. CVSS 8.1, no CVE.","published_at":"2026-10-30T00:00:00+00:00","relation":"describes","confidence":null,"note":null}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}