<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ssrf on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/tags/ssrf/</link><description>Recent content in Ssrf on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Fri, 08 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/tags/ssrf/index.xml" rel="self" type="application/rss+xml"/><item><title>Next.js v16.2.6 — One Release That Closes 13 Security Advisories at Once</title><link>https://ice-ice-bear.github.io/posts/2026-05-08-nextjs-16-2-6-security-patch/</link><pubDate>Fri, 08 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/posts/2026-05-08-nextjs-16-2-6-security-patch/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post Next.js v16.2.6 — One Release That Closes 13 Security Advisories at Once" /&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;On 2026-05-07, &lt;a class="link" href="https://github.com/vercel/next.js" target="_blank" rel="noopener"
 &gt;vercel/next.js&lt;/a&gt; shipped &lt;a class="link" href="https://github.com/vercel/next.js/releases/tag/v16.2.6" target="_blank" rel="noopener"
 &gt;v16.2.6&lt;/a&gt;, a single release that &lt;strong&gt;closes 13 security advisories at once&lt;/strong&gt; — 7 High, 4 Moderate, 2 Low. The most accurate one-line read came from the chat room itself: &lt;em&gt;&amp;ldquo;Looking at the patch notes, you&amp;rsquo;ll be in trouble if you don&amp;rsquo;t upgrade — extremely critical.&amp;rdquo;&lt;/em&gt; What stands out is not the count but the shape: &lt;strong&gt;three Middleware/Proxy bypasses across different surfaces&lt;/strong&gt;, one &lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r" target="_blank" rel="noopener"
 &gt;WebSocket SSRF&lt;/a&gt;, and &lt;strong&gt;three cache-poisoning advisories&lt;/strong&gt; — these aren&amp;rsquo;t isolated bugs, they&amp;rsquo;re a common pattern.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 Release["Next.js v16.2.6 &amp;lt;br/&amp;gt; 2026-05-07"] --&gt; Bypass["Middleware/Proxy &amp;lt;br/&amp;gt; Bypass × 3"]
 Release --&gt; SSRF["SSRF × 1"]
 Release --&gt; Cache["Cache poisoning × 3"]
 Release --&gt; XSS["XSS × 2"]
 Release --&gt; DoS["DoS × 3"]
 Release --&gt; Other["follow-up × 1"]

 Bypass --&gt; B1["GHSA-267c-6grr-h53f &amp;lt;br/&amp;gt; segment-prefetch"]
 Bypass --&gt; B2["GHSA-492v-c6pp-mqqv &amp;lt;br/&amp;gt; dynamic route param"]
 Bypass --&gt; B3["GHSA-36qx-fr4f-26g5 &amp;lt;br/&amp;gt; Pages Router i18n"]

 SSRF --&gt; S1["GHSA-c4j6-fc7j-m34r &amp;lt;br/&amp;gt; WebSocket upgrade"]

 Cache --&gt; C1["GHSA-wfc6-r584-vfw7 &amp;lt;br/&amp;gt; RSC response"]
 Cache --&gt; C2["GHSA-vfv6-92ff-j949 &amp;lt;br/&amp;gt; RSC cache-busting"]
 Cache --&gt; C3["GHSA-3g8h-86w9-wvmq &amp;lt;br/&amp;gt; redirect"]

 XSS --&gt; X1["GHSA-ffhc-5mcf-pf4q &amp;lt;br/&amp;gt; CSP nonce"]
 XSS --&gt; X2["GHSA-gx5p-jg67-6x7h &amp;lt;br/&amp;gt; beforeInteractive"]

 DoS --&gt; D1["GHSA-8h8q-6873-q5fj &amp;lt;br/&amp;gt; Server Components"]
 DoS --&gt; D2["GHSA-mg66-mrh9-m8jx &amp;lt;br/&amp;gt; Cache Components"]
 DoS --&gt; D3["GHSA-h64f-5h5j-jqjh &amp;lt;br/&amp;gt; Image API"]

 Other --&gt; O1["GHSA-26hh-7cqf-hhc6 &amp;lt;br/&amp;gt; incomplete fix"]&lt;/pre&gt;&lt;h2 id="1-middlewareproxy-bypass--3--the-most-dangerous-cluster"&gt;1. Middleware/Proxy Bypass × 3 — The Most Dangerous Cluster
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://nextjs.org/docs/app/building-your-application/routing/middleware" target="_blank" rel="noopener"
 &gt;Middleware/Proxy&lt;/a&gt; is the layer where authentication, authorization, and redirects run before a route is reached. &lt;strong&gt;If you can bypass that layer, your auth is meaningless.&lt;/strong&gt; v16.2.6 closes bypasses found in three different surfaces at once.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-267c-6grr-h53f" target="_blank" rel="noopener"
 &gt;GHSA-267c-6grr-h53f&lt;/a&gt; — middleware bypass via &lt;strong&gt;App Router segment-prefetch routes&lt;/strong&gt; (High)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-26hh-7cqf-hhc6" target="_blank" rel="noopener"
 &gt;GHSA-26hh-7cqf-hhc6&lt;/a&gt; — &lt;strong&gt;incomplete-fix follow-up&lt;/strong&gt; to the above (High)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-492v-c6pp-mqqv" target="_blank" rel="noopener"
 &gt;GHSA-492v-c6pp-mqqv&lt;/a&gt; — middleware bypass via &lt;strong&gt;dynamic route parameter injection&lt;/strong&gt; (High)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-36qx-fr4f-26g5" target="_blank" rel="noopener"
 &gt;GHSA-36qx-fr4f-26g5&lt;/a&gt; — middleware bypass via &lt;strong&gt;&lt;a class="link" href="https://nextjs.org/docs/pages/building-your-application/routing/internationalization" target="_blank" rel="noopener"
 &gt;Pages Router i18n routing&lt;/a&gt;&lt;/strong&gt; (High)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fact that the same class of bug appeared on three different surfaces (App Router segments, dynamic routes, Pages Router i18n) is itself the message. &lt;strong&gt;This is not a single bug — it&amp;rsquo;s a class of bugs where Middleware path matching and the actual router disagree on what a path means.&lt;/strong&gt; The fact that the team also bundled the incomplete-fix follow-up (&lt;code&gt;26hh-7cqf-hhc6&lt;/code&gt;) into the same release deserves credit — it minimizes the window in which a known-incomplete patch is exposed.&lt;/p&gt;
&lt;h2 id="2-ssrf--websocket-upgrades"&gt;2. SSRF — WebSocket Upgrades
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r" target="_blank" rel="noopener"
 &gt;GHSA-c4j6-fc7j-m34r&lt;/a&gt; — &lt;a class="link" href="https://owasp.org/www-community/attacks/Server_Side_Request_Forgery" target="_blank" rel="noopener"
 &gt;Server-Side Request Forgery&lt;/a&gt; via &lt;strong&gt;WebSocket upgrade handling&lt;/strong&gt; (High)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A WebSocket upgrade path could be coerced into making outbound requests, meaning an attacker could &lt;strong&gt;scan the internal network, hit cloud metadata endpoints, or call protected internal APIs&lt;/strong&gt; through the server. Apps with realtime/streaming features are squarely in the blast radius.&lt;/p&gt;
&lt;h2 id="3-cache-poisoning--3"&gt;3. Cache Poisoning × 3
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-wfc6-r584-vfw7" target="_blank" rel="noopener"
 &gt;GHSA-wfc6-r584-vfw7&lt;/a&gt; — cache poisoning of &lt;strong&gt;RSC responses&lt;/strong&gt; (Moderate)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-vfv6-92ff-j949" target="_blank" rel="noopener"
 &gt;GHSA-vfv6-92ff-j949&lt;/a&gt; — poisoning via &lt;strong&gt;RSC cache-busting collisions&lt;/strong&gt; (Low)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-3g8h-86w9-wvmq" target="_blank" rel="noopener"
 &gt;GHSA-3g8h-86w9-wvmq&lt;/a&gt; — &lt;strong&gt;Middleware/Proxy redirects&lt;/strong&gt; can be cache-poisoned (Low)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="https://nextjs.org/docs/app/building-your-application/rendering/server-components" target="_blank" rel="noopener"
 &gt;React Server Components&lt;/a&gt; responses are commonly cached at the CDN/Edge layer. Once those caches are poisoned, &lt;strong&gt;arbitrary users get the malicious response served to them.&lt;/strong&gt; Two of these are directly attacker-triggerable. The Moderate/Low labels can underplay the real impact depending on your edge cache topology.&lt;/p&gt;
&lt;h2 id="4-xss--2"&gt;4. XSS × 2
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-ffhc-5mcf-pf4q" target="_blank" rel="noopener"
 &gt;GHSA-ffhc-5mcf-pf4q&lt;/a&gt; — XSS via App Router &lt;strong&gt;CSP nonce&lt;/strong&gt; handling (Moderate)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-gx5p-jg67-6x7h" target="_blank" rel="noopener"
 &gt;GHSA-gx5p-jg67-6x7h&lt;/a&gt; — XSS when untrusted input reaches the &lt;strong&gt;&lt;a class="link" href="https://nextjs.org/docs/app/api-reference/components/script#beforeinteractive" target="_blank" rel="noopener"
 &gt;&lt;code&gt;beforeInteractive&lt;/code&gt; script strategy&lt;/a&gt;&lt;/strong&gt; (Moderate)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSP nonces are the last line of defense against XSS, and the bug being inside that mechanism is what makes it nasty. &lt;code&gt;beforeInteractive&lt;/code&gt; runs the earliest and most privileged scripts on the page — there isn&amp;rsquo;t a good way to recover from untrusted input at that stage.&lt;/p&gt;
&lt;h2 id="5-dos--3"&gt;5. DoS × 3
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj" target="_blank" rel="noopener"
 &gt;GHSA-8h8q-6873-q5fj&lt;/a&gt; — &lt;strong&gt;Server Components&lt;/strong&gt; DoS (High)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-mg66-mrh9-m8jx" target="_blank" rel="noopener"
 &gt;GHSA-mg66-mrh9-m8jx&lt;/a&gt; — &lt;strong&gt;&lt;a class="link" href="https://nextjs.org/docs/app/building-your-application/caching" target="_blank" rel="noopener"
 &gt;Cache Components&lt;/a&gt;&lt;/strong&gt; connection-exhaustion DoS (High)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-h64f-5h5j-jqjh" target="_blank" rel="noopener"
 &gt;GHSA-h64f-5h5j-jqjh&lt;/a&gt; — &lt;strong&gt;&lt;a class="link" href="https://nextjs.org/docs/app/api-reference/components/image#image-optimization-api" target="_blank" rel="noopener"
 &gt;Image Optimization API&lt;/a&gt;&lt;/strong&gt; DoS (Moderate)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three are remotely triggerable at low cost, which is why they earned High/Moderate. Cache Components exhausts connections; the Image API burns transform budget.&lt;/p&gt;
&lt;h2 id="what-to-do-right-now"&gt;What to Do Right Now
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install next@16.2.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add next@16.2.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add next@16.2.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bun add next@16.2.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Apps using App Router + Middleware for auth should upgrade immediately.&lt;/strong&gt; Combine the three bypass advisories and you can reach a state where authentication is effectively bypassed. While you roll out the fix, consider blocking suspicious segment-prefetch patterns and unusual query parameters at the WAF/CDN layer as a temporary buffer.&lt;/p&gt;
&lt;h2 id="insights"&gt;Insights
&lt;/h2&gt;&lt;p&gt;Triage priority is unambiguous — &lt;strong&gt;3 bypasses + 1 SSRF + 3 cache-poisoning advisories landing in one release is itself the loudest signal in this batch.&lt;/strong&gt; The fact that middleware bypass appeared on three different surfaces says it isn&amp;rsquo;t one bug; it&amp;rsquo;s a class of defect where &lt;strong&gt;the App Router&amp;rsquo;s matching logic and the router&amp;rsquo;s actual resolution disagree about what a path is.&lt;/strong&gt; Even adjusting for Next.js 16 being a relatively new major, 13 advisories in one release is unusual. Bundling the incomplete-fix follow-up into the same release is a good example of responsible disclosure — it shrinks the window when an unfinished patch is in the wild. The chat room&amp;rsquo;s instinct — &lt;em&gt;&amp;ldquo;extremely critical&amp;rdquo;&lt;/em&gt; — is right: this should be the &lt;strong&gt;highest-priority upgrade in your queue.&lt;/strong&gt; Zooming out, the release is a hint that &lt;strong&gt;the App Router routing model itself deserves more fuzzing and audit.&lt;/strong&gt; As long as middleware matching and the router are independent, the same class of bug is likely to surface again.&lt;/p&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Release&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js" target="_blank" rel="noopener"
 &gt;vercel/next.js&lt;/a&gt; · &lt;a class="link" href="https://github.com/vercel/next.js/releases/tag/v16.2.6" target="_blank" rel="noopener"
 &gt;v16.2.6 release notes&lt;/a&gt; (published 2026-05-07)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;High severity advisories&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj" target="_blank" rel="noopener"
 &gt;GHSA-8h8q-6873-q5fj&lt;/a&gt; — Server Components DoS&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-267c-6grr-h53f" target="_blank" rel="noopener"
 &gt;GHSA-267c-6grr-h53f&lt;/a&gt; — App Router segment-prefetch bypass&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-26hh-7cqf-hhc6" target="_blank" rel="noopener"
 &gt;GHSA-26hh-7cqf-hhc6&lt;/a&gt; — incomplete-fix follow-up&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-mg66-mrh9-m8jx" target="_blank" rel="noopener"
 &gt;GHSA-mg66-mrh9-m8jx&lt;/a&gt; — Cache Components DoS&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-492v-c6pp-mqqv" target="_blank" rel="noopener"
 &gt;GHSA-492v-c6pp-mqqv&lt;/a&gt; — dynamic-route bypass&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r" target="_blank" rel="noopener"
 &gt;GHSA-c4j6-fc7j-m34r&lt;/a&gt; — WebSocket SSRF&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-36qx-fr4f-26g5" target="_blank" rel="noopener"
 &gt;GHSA-36qx-fr4f-26g5&lt;/a&gt; — Pages Router i18n bypass&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Moderate / Low advisories&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-ffhc-5mcf-pf4q" target="_blank" rel="noopener"
 &gt;GHSA-ffhc-5mcf-pf4q&lt;/a&gt; — App Router CSP-nonce XSS (Moderate)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-gx5p-jg67-6x7h" target="_blank" rel="noopener"
 &gt;GHSA-gx5p-jg67-6x7h&lt;/a&gt; — beforeInteractive XSS (Moderate)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-h64f-5h5j-jqjh" target="_blank" rel="noopener"
 &gt;GHSA-h64f-5h5j-jqjh&lt;/a&gt; — Image Optimization DoS (Moderate)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-wfc6-r584-vfw7" target="_blank" rel="noopener"
 &gt;GHSA-wfc6-r584-vfw7&lt;/a&gt; — RSC cache poisoning (Moderate)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-vfv6-92ff-j949" target="_blank" rel="noopener"
 &gt;GHSA-vfv6-92ff-j949&lt;/a&gt; — RSC cache-busting collision (Low)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vercel/next.js/security/advisories/GHSA-3g8h-86w9-wvmq" target="_blank" rel="noopener"
 &gt;GHSA-3g8h-86w9-wvmq&lt;/a&gt; — Middleware redirect cache poisoning (Low)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Next.js docs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nextjs.org/docs/app" target="_blank" rel="noopener"
 &gt;App Router&lt;/a&gt; · &lt;a class="link" href="https://nextjs.org/docs/app/building-your-application/routing/middleware" target="_blank" rel="noopener"
 &gt;Middleware/Proxy&lt;/a&gt; · &lt;a class="link" href="https://nextjs.org/docs/app/building-your-application/caching" target="_blank" rel="noopener"
 &gt;Cache Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nextjs.org/docs/app/building-your-application/rendering/server-components" target="_blank" rel="noopener"
 &gt;Server Components&lt;/a&gt; · &lt;a class="link" href="https://nextjs.org/docs/app/api-reference/components/image#image-optimization-api" target="_blank" rel="noopener"
 &gt;Image Optimization API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nextjs.org/docs/pages/building-your-application/routing/internationalization" target="_blank" rel="noopener"
 &gt;Pages Router i18n&lt;/a&gt; · &lt;a class="link" href="https://nextjs.org/docs/app/api-reference/components/script#beforeinteractive" target="_blank" rel="noopener"
 &gt;&lt;code&gt;beforeInteractive&lt;/code&gt; script strategy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>