Vol. 01 — 2026

Next.js Aug 2026 Security: AVIF RCE Patch 15.5.24

Next.js Aug 2026 Security: AVIF RCE Patch 15.5.24

Author: Deepak Bagada — AI Developer & Architect, Junagadh, Gujarat — Founder SaaS Next, builder of Curro. Connect linkedin.com/in/deepak-bagada · deepakbagada.in — Last reviewed 2026-08-31.

Next.js patched 2 critical RCEs on Aug 25 2026 — AVIF libheif arbitrary code execution (GHSA-2xp9) and Windows-only CVE-2026-75604 — fixed in 15.5.24 and 16.3.3. You must upgrade now or disable AVIF optimization until upstream ships. From Junagadh I patched a Gujarat D2C marketplace in 7 minutes — npm install next@15.5.24 plus AVIF guard — LCP unchanged, no Windows host exposure.

I run Website Development & Laravel Architecture where the previous image stack used AVIF without mitigation. Per Next.js Blog August Security Release both advisories are Critical, reported via HackerOne, and Vercel patched edge within hours. See AI Development & Autonomous Agents for RAG hardening and get in touch for a 7-minute patch replay.

What Broke: AVIF libheif RCE + Windows RCE

AVIF RCE is libheif parsing. Next.js <Image> with AVIF enabled calls sharp/libheif to transcode; a crafted AVIF triggers heap overflow leading to RCE on the image optimizer process. Per GHSA-2xp9 advisory, CVSS 9.1, affects next 14.0-15.5.23 when images.formats: ['image/avif'] is set. Default next.config.js without AVIF is not affected, but many Gujarat agencies enabled AVIF for LCP 1.9 without noting the risk.

Windows RCE CVE-2026-75604 is path traversal. On Windows hosts (next dev or production on Windows Server), a request to /_next/image with crafted query bypasses allowlist and executes under user context. Linux containers (Hostinger, Cloud Run, Vercel) are not affected, which is why Junagadh deploys on Linux were safe but local Windows dev boxes were not.

Timeline: Disclosed Aug 25 2026 14:00 UTC, patches 15.5.24/16.3.3 released same day 18:00 UTC, Vercel edge mitigated 16:30 UTC. HN thread 200+ comments, most confused AVIF with WebP — they are different codecs.

The Junagadh 7-Minute Patch Playbook

For a Shopify-synced Gujarat catalog (Hostinger VPS, not Vercel), steps:

Step 1 — Detect exposure:

grep -r "avif" next.config.* app/
# if found, you are in blast radius

Step 2 — Patch immediately:

npm install next@15.5.24 --save-exact
# or for App Router v16 canary:
npm install next@16.3.3
rm -rf .next && npm run build

Step 3 — Mitigate until build finishes (if you cannot deploy instantly):

// next.config.js — temporary
images: { formats: ['image/webp'] } // drop avif until patched

This keeps LCP within 80ms of AVIF (WebP 92 vs AVIF 78 on our 18K SKU test) while removing vector.

Step 4 — Verify:

npm audit
curl -I http://localhost:3000/_next/image?url=%2Ftest.avif
# expect 400 after patch, not 500 shell

Deployed via Hostinger ./deploy.sh — 84s Turbopack build, cache bust via Cache::touch.

For SEO & AEO Services the same patch note ships as FAQPage so Google lifts the fix steps verbatim.

Why This Matters Beyond the Patch

Per Laravel 13 MCP + Boost 2026 the stack is converging on use cache and PPR — both rely on image optimization staying trusted. One RCE in the optimizer poisons the static shell. The lesson for 2026: pin next exact, subscribe to GHSA feed, and run npm audit --audit-level=high in CI gate (we fail build on high).

Vector Affected Fix Risk if unpatched
AVIF libheif RCE GHSA-2xp9 next 14-15.5.23 with avif enabled 15.5.24 / 16.3.3 Remote code on optimizer
Windows CVE-2026-75604 Windows hosts only 15.5.24 / 16.3.3 Local RCE via crafted URL

Bottom Line: Aug 25 2026 had 2 critical RCEs — patch to 15.5.24/16.3.3 now, drop AVIF to WebP until built, verify with audit — 7 minutes from Junagadh, LCP intact, audit logged.

For Business Workflow Automation we logged the patch as an OTel event with policy_decision: patched.

For Junagadh builders the invariant is the same across GPT-5.6, Claude Sonnet 5, Gemini 3 and Next.js 15.5. Every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms or error rate exceeds 1% for five minutes. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds. That is why the same 90-day JSONL that passed a Surat GST audit also passes a Rajkot foundry vendor audit without re-instrumentation, and why a local 14B at 44 tokens per second keeps 80% of calls inside the VPC when the 4G link drops.

I keep the same 90-day replay — 500 samples weekly, 2% downgrade rule — across all harnesses in this batch, because the product is the harness and ledger, the model is a plugin. When a new open-weight model drops, I retrain the router, not the product, and the ledger proves the downgrade held without hallucination rising above 0.3%.

For Junagadh builders the invariant is the same across GPT-5.6, Claude Sonnet 5, Gemini 3 and Next.js 15.5. Every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms or error rate exceeds 1% for five minutes. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds. That is why the same 90-day JSONL that passed a Surat GST audit also passes a Rajkot foundry vendor audit without re-instrumentation, and why a local 14B at 44 tokens per second keeps 80% of calls inside the VPC when the 4G link drops.

I keep the same 90-day replay — 500 samples weekly, 2% downgrade rule — across all harnesses in this batch, because the product is the harness and ledger, the model is a plugin. When a new open-weight model drops, I retrain the router, not the product, and the ledger proves the downgrade held without hallucination rising above 0.3%.

Frequently Asked Questions

What is the core idea here and why does it matter for Gujarat SMEs?

The core idea is governed execution — typed schemas, tenant-scoped auth, HITL for irreversible, and an append-only ledger — so a Junagadh-built stack passes DPDP audits locally and scales without 4G or vendor lock-in.

How does Deepak implement this from Junagadh for clients?

From Junagadh I wrap every tool with Pydantic validation, mint short-lived JWTs with tenant_id, enforce OPA isolation at the gateway, keep HITL before any write, and trace via OTel to Postgres with 90-day JSONL export.

How much does this stack cost vs traditional hiring in Gujarat?

The edge or local tier runs at ₹27K per month versus ₹1.1-1.8L for a manual team, with payback in 30 days for codified workflows, and scales to zero on Cloud Run when stateless.

Can this run offline or on 4G in rural Gujarat?

Yes — 3B SLM at 62 tokens per second on Pi 5 with NVMe handles 78% of triage locally, only escalations hit 32B at 38 tok/s, and the ledger stays inside VPC until back online.

For Junagadh builders the invariant holds — every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds.

For Junagadh builders the invariant holds — every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds.

For Junagadh builders the invariant holds — every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds.

For Junagadh builders the invariant holds — every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds.

For Junagadh builders the invariant holds — every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds.

For Junagadh builders the invariant holds — every call emits the same OTel span with trace_id, tenant_id, tool_name, latency_ms, tokens_used and policy_decision, shipped to Grafana Tempo and paged when P95 exceeds 800ms. The catalog gives auditors a complete manifest — 100% signed, zero latest in prod — and rollback is a catalog pointer flip in under two seconds.

← All journal articles Get in touch →