<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cve on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/cve/</link><description>Recent content in Cve on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Fri, 08 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/cve/index.xml" rel="self" type="application/rss+xml"/><item><title>Next.js v16.2.6 — 13개 보안 권고를 한 릴리스에 묶은 긴급 패치</title><link>https://ice-ice-bear.github.io/ko/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/ko/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 — 13개 보안 권고를 한 릴리스에 묶은 긴급 패치" /&gt;&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/vercel/next.js" target="_blank" rel="noopener"
 &gt;vercel/next.js&lt;/a&gt;가 2026-05-07 &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;에서 &lt;strong&gt;13개 보안 권고를 한꺼번에&lt;/strong&gt; 닫았다. High 7건 / Moderate 4건 / Low 2건. 현장 한 줄 평이 가장 정확하다 — &lt;em&gt;&amp;ldquo;패치 내용 보니 안 하면 큰일 날 거 같습니다 / 엄청 크리티컬해요&amp;rdquo;&lt;/em&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;strong&gt;인증·인가 우회 권고가 3건&lt;/strong&gt;, &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; 1건, &lt;strong&gt;캐시 오염 권고가 3건&lt;/strong&gt; — 표면이 다양해서 단일 버그가 아니라 &lt;strong&gt;공통 패턴&lt;/strong&gt;이 드러난다.&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 응답"]
 Cache --&gt; C2["GHSA-vfv6-92ff-j949 &amp;lt;br/&amp;gt; RSC 캐시-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--가장-위험한-묶음"&gt;1. Middleware/Proxy bypass × 3 — 가장 위험한 묶음
&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;는 라우트 진입 전 인증·인가·리다이렉트를 처리하는 곳이다. &lt;strong&gt;이 레이어를 우회할 수 있다면 인증 자체가 무의미해진다.&lt;/strong&gt; v16.2.6은 서로 다른 표면 3곳에서 우회 경로를 한꺼번에 닫았다.&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; — &lt;strong&gt;App Router segment-prefetch route&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; (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; — &lt;strong&gt;dynamic route 파라미터 인젝션&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; — &lt;strong&gt;Pages Router의 &lt;a class="link" href="https://nextjs.org/docs/pages/building-your-application/routing/internationalization" target="_blank" rel="noopener"
 &gt;i18n 라우팅&lt;/a&gt;&lt;/strong&gt; 을 통한 미들웨어 우회 (High)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;세 표면(App Router segment / dynamic route / Pages Router i18n)에서 동시 발견됐다는 점이 메시지다. &lt;strong&gt;단일 버그가 아니라 라우팅 모델 전반의 공통 패턴&lt;/strong&gt; — 미들웨어 매칭 로직과 실제 라우팅이 같은 경로를 다르게 해석하는 클래스의 결함이다. 게다가 &lt;code&gt;26hh-7cqf-hhc6&lt;/code&gt;은 이전 패치의 incomplete fix를 같은 릴리스에 묶어 닫았다 — 외부에 불완전 패치가 노출되는 시간을 최소화한 점은 칭찬할 만하다.&lt;/p&gt;
&lt;h2 id="2-ssrf--websocket-upgrade"&gt;2. SSRF — WebSocket upgrade
&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;strong&gt;WebSocket upgrade 처리에서 SSRF&lt;/strong&gt; (High)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WebSocket upgrade 핸들링에서 &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;가 가능했다. 공격자가 서버를 통해 &lt;strong&gt;내부 네트워크 스캔, metadata endpoint 호출, 보호받는 내부 API 호출&lt;/strong&gt;까지 시도할 수 있다는 뜻이다. Realtime/스트리밍 기능을 쓰는 앱은 직격탄.&lt;/p&gt;
&lt;h2 id="3-캐시-오염--3"&gt;3. 캐시 오염 × 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; — &lt;strong&gt;RSC 응답&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; — &lt;strong&gt;RSC cache-busting 충돌&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 redirect&lt;/strong&gt; 가 캐시 오염 가능 (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; 응답이 CDN/Edge에서 캐싱되는 게 일반적인 만큼, 캐시가 한 번 오염되면 &lt;strong&gt;임의 사용자에게 악성 응답이 노출&lt;/strong&gt;된다. 공격자가 직접 트리거 가능한 경로가 두 개. Severity가 Moderate/Low로 표시됐지만, Edge 캐시 토폴로지에 따라 실제 영향이 등급보다 클 수 있다.&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; — App Router의 &lt;strong&gt;CSP nonce 처리&lt;/strong&gt;에서 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; — &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; 스크립트&lt;/a&gt;에 untrusted input&lt;/strong&gt; 주입 시 XSS (Moderate)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSP nonce는 XSS를 막기 위한 마지막 방어선인데 거기 자체에 결함이 있었다는 게 핵심. &lt;code&gt;beforeInteractive&lt;/code&gt;는 hydration 전에 실행되는 가장 위험한 위치라 untrusted input이 들어오면 손쓸 방법이 거의 없다.&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; 커넥션 고갈 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;세 권고 모두 외부에서 비교적 적은 비용으로 트리거 가능한 종류라 High/Moderate가 붙었다. Cache Components는 커넥션 고갈, Image API는 변환 비용을 통해 자원을 소진하는 패턴이다.&lt;/p&gt;
&lt;h2 id="즉시-해야-할-것"&gt;즉시 해야 할 것
&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;App Router + Middleware로 인증·인가를 처리하는 앱은 즉시 업그레이드.&lt;/strong&gt; Bypass 권고 3건이 합쳐지면 인증 자체가 의미 없어지는 시나리오가 있다. 업그레이드 전에 WAF/CDN 레이어에서 임시로 segment-prefetch 패턴과 의심스러운 &lt;code&gt;?&lt;/code&gt; query 파라미터를 차단하는 것도 고려.&lt;/p&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;p&gt;Triage 우선순위는 명확하다 — &lt;strong&gt;Bypass 3건 + SSRF 1건 + Cache poisoning 3건&lt;/strong&gt;이 같은 릴리스에 묶였다는 사실 자체가 가장 큰 시그널이다. Middleware 우회가 세 다른 표면에서 동시 발견된 건 단일 버그가 아니라 &lt;strong&gt;App Router의 라우팅 모델과 Middleware 매칭 로직이 같은 경로를 다르게 해석하는 클래스의 결함&lt;/strong&gt;이라는 뜻이다. Next.js 16이 비교적 신버전이라는 점을 감안해도, 한 릴리스에 13건이 묶이는 건 흔치 않다. Vercel 팀이 incomplete-fix follow-up을 같은 릴리스로 묶어 외부 노출 시간을 최소화한 점은 책임감 있는 disclosure의 좋은 사례. 현장 반응 &lt;em&gt;&amp;ldquo;엄청 크리티컬해요&amp;rdquo;&lt;/em&gt; 가 정확하고, &lt;strong&gt;upgrade triage에서 highest priority&lt;/strong&gt;로 다뤄야 한다. 더 큰 그림으로 보면, 이번 릴리스는 &lt;strong&gt;App Router의 라우팅 모델 자체에 대한 fuzz/감사가 더 필요했다&lt;/strong&gt;는 신호다 — 미들웨어 매칭 로직과 라우팅이 분리돼 있는 한 같은 클래스의 결함은 또 나올 가능성이 높다.&lt;/p&gt;
&lt;h2 id="참고"&gt;참고
&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 릴리스 노트&lt;/a&gt; (2026-05-07 published)&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><item><title>EKS AMI CVE-2026-31431 Copy-Fail — 패치 지연과 algif_aead 미티게이션</title><link>https://ice-ice-bear.github.io/ko/posts/2026-05-04-eks-ami-cve-2026-31431-mitigation/</link><pubDate>Mon, 04 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-05-04-eks-ami-cve-2026-31431-mitigation/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post EKS AMI CVE-2026-31431 Copy-Fail — 패치 지연과 algif_aead 미티게이션" /&gt;&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;2026-04-30, &lt;a class="link" href="https://github.com/awslabs/amazon-eks-ami/issues/2699" target="_blank" rel="noopener"
 &gt;awslabs/amazon-eks-ami issue #2699&lt;/a&gt; 가 열렸다. 제목은 단순했다 — &amp;ldquo;🚨 Patch for: CVE-2026-31431&amp;rdquo;. 하지만 AWS의 답은 &amp;ldquo;패치 없음, ETA 못 줌&amp;rdquo; 이었고, 그동안 &lt;a class="link" href="https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC" target="_blank" rel="noopener"
 &gt;컨테이너 탈출 PoC가 공개&lt;/a&gt;됐다. 결국 &lt;a class="link" href="https://github.com/awslabs/amazon-eks-ami/releases/tag/v20260505" target="_blank" rel="noopener"
 &gt;v20260505 EKS AMI&lt;/a&gt;가 6일 뒤 풀릴 때까지, &lt;strong&gt;공식 패치보다 커뮤니티의 미티게이션이 먼저 움직인&lt;/strong&gt; 사례다.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD
 A["2026-04-30 &amp;lt;br/&amp;gt; 이슈 #2699 오픈"] --&gt; B["05-01 &amp;lt;br/&amp;gt; v20260423 AMI도 취약 확인"]
 B --&gt; C["05-01 &amp;lt;br/&amp;gt; AWS: 패치 없음, ETA 없음"]
 C --&gt; D["05-01 &amp;lt;br/&amp;gt; algif_aead 모듈 차단 미티게이션"]
 D --&gt; E["05-01 &amp;lt;br/&amp;gt; kernel.org 6.12 메인라인 commit 8b88d99 머지"]
 E --&gt; F["05-02 &amp;lt;br/&amp;gt; SSM Run Command로 일괄 적용"]
 F --&gt; G["05-04 &amp;lt;br/&amp;gt; 커뮤니티 토론: Docker seccomp 차단 옵션"]
 G --&gt; H["05-05 &amp;lt;br/&amp;gt; Amazon Linux 커널 fix released"]
 H --&gt; I["05-06 &amp;lt;br/&amp;gt; EKS AMI v20260505 릴리스"]&lt;/pre&gt;&lt;h2 id="cve-2026-31431--copy-fail-핵심"&gt;CVE-2026-31431 — Copy-Fail 핵심
&lt;/h2&gt;&lt;p&gt;이 취약점은 리눅스 커널의 &lt;a class="link" href="https://www.kernel.org/doc/html/latest/crypto/userspace-if.html" target="_blank" rel="noopener"
 &gt;algif_aead&lt;/a&gt; — AF_ALG socket의 AEAD interface — 에 있는 메모리 처리 결함이다. 통칭 &amp;ldquo;Copy-Fail&amp;rdquo; 로 불린다. 핵심 특성 세 가지.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;로컬 인증된 사용자&lt;/strong&gt;가 트리거 가능. 원격 비인증 공격은 불가&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컨테이너 워크로드에서 컨테이너 탈출&lt;/strong&gt;이 가능 — 멀티테넌트 K8s, CI runner, sandbox에 직접 영향&lt;/li&gt;
&lt;li&gt;공개 PoC: &lt;a class="link" href="https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC" target="_blank" rel="noopener"
 &gt;Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub 어드바이저리: &lt;a class="link" href="https://github.com/advisories/GHSA-2274-3hgr-wxv6" target="_blank" rel="noopener"
 &gt;GHSA-2274-3hgr-wxv6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;원격 공격자가 직접 트리거할 수는 없지만, &amp;ldquo;로컬&amp;quot;이라는 단어가 K8s 환경에서는 가장 약한 가정이다. 멀쩡한 컨테이너 안에서 unprivileged process 가 호스트 커널을 건드릴 수 있다는 뜻.&lt;/p&gt;
&lt;h2 id="사건-흐름--이슈-2699"&gt;사건 흐름 — 이슈 #2699
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;날짜&lt;/th&gt;
 &lt;th&gt;진행&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-04-30&lt;/td&gt;
 &lt;td&gt;issue #2699 오픈. 제목: &amp;ldquo;🚨 Patch for: CVE-2026-31431&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-01&lt;/td&gt;
 &lt;td&gt;커뮤니티 검증: 최신 v20260423 AMI의 커널 6.12.79-101.147.amzn2023 도 &lt;strong&gt;여전히 취약&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-01&lt;/td&gt;
 &lt;td&gt;AWS 서포트 답변: &lt;strong&gt;&amp;ldquo;패치 없음, ETA 못 줌&amp;rdquo;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-01&lt;/td&gt;
 &lt;td&gt;AWS 공식 미티게이션 가이드 — &lt;code&gt;algif_aead&lt;/code&gt; 모듈 로딩 차단&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-01&lt;/td&gt;
 &lt;td&gt;6.12 메인라인 커널엔 &lt;a class="link" href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=8b88d99341f139e23bdeb1027a2a3ae10d341d82" target="_blank" rel="noopener"
 &gt;commit 8b88d99&lt;/a&gt; 약 10시간 전 머지됨&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-02&lt;/td&gt;
 &lt;td&gt;사용자가 &lt;a class="link" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/execute-remote-commands.html" target="_blank" rel="noopener"
 &gt;AWS SSM Run Command&lt;/a&gt; 로 클러스터 일괄 미티게이션 적용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-04&lt;/td&gt;
 &lt;td&gt;커뮤니티 토론: &amp;ldquo;Docker 쓰시는 분들은 seccomp으로 막아도&amp;rdquo; — 미티게이션 추가 옵션 제시&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-05&lt;/td&gt;
 &lt;td&gt;Amazon Linux 커널 fix — &lt;a class="link" href="https://alas.aws.amazon.com/AL2023/" target="_blank" rel="noopener"
 &gt;ALAS-2026 페이지&lt;/a&gt; 갱신&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05-06&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/awslabs/amazon-eks-ami/releases/tag/v20260505" target="_blank" rel="noopener"
 &gt;EKS AMI v20260505 릴리스&lt;/a&gt;&lt;/strong&gt; — kernel 6.12.80-106.156 / 6.1.168-203.330. 이슈 lock 예정&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="aws-공식-미티게이션-패치-전"&gt;AWS 공식 미티게이션 (패치 전)
&lt;/h2&gt;&lt;p&gt;기본 아이디어는 단순하다 — 취약한 커널 모듈을 로딩 자체로 차단하는 것.&lt;/p&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;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;install algif_aead /bin/false&amp;#34;&lt;/span&gt; &amp;gt; /etc/modprobe.d/disable-algif.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rmmod algif_aead 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;install algif_aead /bin/false&lt;/code&gt; 는 modprobe가 모듈을 로드하려 할 때 &lt;code&gt;/bin/false&lt;/code&gt; 를 대신 실행하게 만든다 — 즉 절대 로드되지 않는다. &lt;code&gt;rmmod&lt;/code&gt; 는 이미 로드된 모듈을 즉시 제거한다.&lt;/p&gt;
&lt;h2 id="클러스터-단위-일괄-적용--ssm-run-command"&gt;클러스터 단위 일괄 적용 — SSM Run Command
&lt;/h2&gt;&lt;p&gt;이슈 댓글에서 사용자들이 공유한 패턴.&lt;/p&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;aws ssm send-command &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --region eu-west-3 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --document-name &lt;span class="s2"&gt;&amp;#34;AWS-RunShellScript&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --targets &lt;span class="s2"&gt;&amp;#34;Key=tag:eks:cluster-name,Values={{CLUSTER_NAME}}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parameters &lt;span class="s1"&gt;&amp;#39;commands=[
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;echo \&amp;#34;install algif_aead /bin/false\&amp;#34; &amp;gt; /etc/modprobe.d/disable-algif.conf&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;rmmod algif_aead 2&amp;gt;/dev/null || true&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;lsmod | grep algif &amp;amp;&amp;amp; echo STILL_LOADED || echo MITIGATED&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; ]&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --comment &lt;span class="s2"&gt;&amp;#34;CVE-2026-31431 mitigation&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;마지막 줄은 검증 — &lt;code&gt;lsmod | grep algif&lt;/code&gt; 가 비어 있으면 모듈이 사라진 것. 클러스터에 노드가 수십 대라도 한 번에 적용된다.&lt;/p&gt;
&lt;h2 id="managed-node-groups--karpenter-userdata-베이크"&gt;Managed Node Groups / Karpenter UserData 베이크
&lt;/h2&gt;&lt;p&gt;한 사용자 사례: &lt;a class="link" href="https://karpenter.sh/" target="_blank" rel="noopener"
 &gt;Karpenter&lt;/a&gt; 의 NodePool UserData에 미티게이션을 박아 두면, &lt;strong&gt;모든 신규 노드가 부팅 즉시 보호된 상태로 올라온다&lt;/strong&gt;. 기존 노드는 SSM으로 일회성 처리, 새 노드는 UserData로 자동화 — 저영향, 저노력.&lt;/p&gt;
&lt;p&gt;PoC로 차단 검증, 사이드카·데몬셋 호환성 확인 후 단계적 롤아웃이 정석.&lt;/p&gt;
&lt;h2 id="bottlerocket-ami는-별도-트랙"&gt;Bottlerocket AMI는 별도 트랙
&lt;/h2&gt;&lt;p&gt;이슈 댓글 중 한 명이 보고: &amp;ldquo;&lt;a class="link" href="https://bottlerocket.dev/" target="_blank" rel="noopener"
 &gt;Bottlerocket&lt;/a&gt; AMI 쓰는 클러스터는 미티게이션 적용 실패. 이건 이 레포 소관 아닐 듯.&amp;rdquo; Bottlerocket은 read-only filesystem과 다른 모듈 로딩 정책을 갖기 때문에 &lt;a class="link" href="https://github.com/bottlerocket-os/bottlerocket" target="_blank" rel="noopener"
 &gt;bottlerocket-os&lt;/a&gt; 쪽에서 별도 트래킹이 필요하다.&lt;/p&gt;
&lt;h2 id="aws-커뮤니케이션-비판"&gt;AWS 커뮤니케이션 비판
&lt;/h2&gt;&lt;p&gt;이슈 전반에 흐르는 톤은 한 줄로 요약된다 — &lt;strong&gt;&amp;ldquo;AWS의 커뮤니케이션이 부족했다.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다른 매니지드 K8s 호스팅 업체들은 사전 경고 메일 발송, AWS만 무소식&lt;/li&gt;
&lt;li&gt;&amp;ldquo;패치 release 후 X일 내 AMI release&amp;rdquo; 같은 구체적인 ETA를 줬어야&lt;/li&gt;
&lt;li&gt;커뮤니티가 PoC와 메인라인 커밋을 먼저 추적하는 사이 AWS 서포트는 &amp;ldquo;ETA 못 줌&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이게 v20260505가 풀린 뒤 &amp;ldquo;이슈 lock 예정&amp;rdquo; 으로 정리된 배경이다.&lt;/p&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;p&gt;이 이슈가 던지는 진짜 메시지는 패치 자체가 아니라 &lt;strong&gt;타임라인의 모양&lt;/strong&gt;이다. 메인라인 커널 커밋이 머지된 뒤 EKS AMI가 풀리기까지 약 6일이 걸렸고, 그 6일 동안 PoC는 이미 공개돼 있었다 — 멀티테넌트 K8s, CI runner, sandbox 환경 모두에서 컨테이너 탈출이 실증 가능한 상태였다는 뜻. 그래서 운영자에게 진짜 가치 있는 신호는 &amp;ldquo;AMI가 곧 나온다&amp;quot;가 아니라 &lt;strong&gt;&amp;ldquo;패치 전 6일 동안 어떻게 살아남는가&amp;rdquo;&lt;/strong&gt; 다. 답은 두 줄로 정리된다 — &lt;code&gt;algif_aead&lt;/code&gt; 모듈 차단을 SSM으로 모든 노드에 즉시 적용, Karpenter/MNG의 UserData에 베이크해 신규 노드도 자동 보호. AWS의 &amp;ldquo;ETA 못 줌&amp;rdquo; 응답은 별도 문제로, 다른 매니지드 호스팅 업체들이 사전 경고 메일을 돌리는 동안 AWS만 침묵했다는 점은 운영팀이 &lt;strong&gt;공식 채널 이상의 정보 소스(이슈 트래커, 커뮤니티 토론, kernel.org)&lt;/strong&gt; 를 평소에 모니터링해야 한다는 결론으로 이어진다. 5월 4일 시점에 이미 &amp;ldquo;Docker seccomp으로 막아야&amp;rdquo; 같은 우회 옵션이 회자되고 있었다는 사실이 그 증거다 — 공식 발표보다 커뮤니티가 위협을 빠르게 인식했다. 다음 비슷한 사건에서도 패턴은 반복될 것이고, &lt;strong&gt;레포 알림 + 커뮤니티 토론 + ALAS 페이지 모니터링&lt;/strong&gt; 이 운영팀의 기본 자세가 돼야 한다.&lt;/p&gt;
&lt;h2 id="참고"&gt;참고
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Issue and AMI release&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/awslabs/amazon-eks-ami/issues/2699" target="_blank" rel="noopener"
 &gt;awslabs/amazon-eks-ami issue #2699&lt;/a&gt; — 🚨 Patch for: CVE-2026-31431&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/awslabs/amazon-eks-ami/releases/tag/v20260505" target="_blank" rel="noopener"
 &gt;EKS AMI v20260505 release&lt;/a&gt; — kernel 6.12.80-106.156 / 6.1.168-203.330 (2026-05-06 published)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CVE / advisories&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/advisories/GHSA-2274-3hgr-wxv6" target="_blank" rel="noopener"
 &gt;GHSA-2274-3hgr-wxv6&lt;/a&gt; — GitHub advisory&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=8b88d99341f139e23bdeb1027a2a3ae10d341d82" target="_blank" rel="noopener"
 &gt;Linux kernel commit 8b88d99&lt;/a&gt; — 메인라인 fix&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC" target="_blank" rel="noopener"
 &gt;Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC&lt;/a&gt; — 컨테이너 탈출 PoC&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.kernel.org/doc/html/latest/crypto/userspace-if.html" target="_blank" rel="noopener"
 &gt;Linux algif_aead userspace API docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://alas.aws.amazon.com/AL2023/" target="_blank" rel="noopener"
 &gt;Amazon Linux Security Center (ALAS)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mitigation references&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/execute-remote-commands.html" target="_blank" rel="noopener"
 &gt;AWS SSM Run Command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://karpenter.sh/" target="_blank" rel="noopener"
 &gt;Karpenter&lt;/a&gt; — UserData 베이크용&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://bottlerocket.dev/" target="_blank" rel="noopener"
 &gt;Bottlerocket&lt;/a&gt; · &lt;a class="link" href="https://github.com/bottlerocket-os/bottlerocket" target="_blank" rel="noopener"
 &gt;bottlerocket-os GitHub&lt;/a&gt; — 별도 트랙&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>