개발/프론트엔드

🛡️ Next.js 16.4.1 보안 업데이트 · 내 앱 해당 조건표

개발만빼고다잘함 2026. 10. 28. 12:26
반응형

2026년 10월 14일 Next.js 공식 블로그에 비정기 보안 업데이트 글이 올라왔다. 고친 버전은 v16.4.1(Active LTS)과 v15.5.28(Maintenance LTS)이다. 막은 취약점은 Critical 둘에 High 하나다. 셋 다 조건이 붙어 있어서 내 앱이 해당되는지부터 헷갈린다.

첫 번째 취약점은 우회책이 없다. 공식 글은 비슷한 함수가 없는 앱도 바로 올리라고 적었다.

올리는 명령

공식 글에 실린 명령이다. 주석만 한국어로 바꿨다. 쓰는 줄기에 맞춰 하나만 실행하면 된다.

# 15.5 줄기를 쓰는 앱
npm install next@15.5.28
# 16.4 줄기를 쓰는 앱
npm install next@16.4.1

이 업데이트는 10월 8일에 미리 예고됐다. 9월 30일 보안 릴리스(v16.3.8·v15.5.27)에서 상위 의존성 사정으로 미뤄진 수정 두 건도 이번에 들어갔다.

내 앱이 해당되나

세 건을 조건별로 나누면 이렇다. 영향 버전은 각 GitHub 보안 권고(GHSA)에 적힌 범위다.

취약점등급해당 조건영향 버전우회책
use cache typed array RCE Critical App Router + Cache Components, use cache 함수가 typed array 여러 개를 반환 16.0.0~16.4.0 없음
이미지 최적화 SVG RCE Critical 이미지 최적화 API에서 SVG 사용, glibc 기반 리눅스에서 실행 15.5.27 이하, 16.x는 16.4.0 이하 sharp 0.35.5 이상
Server Action DoS High App Router + Server Action 하나 이상 13.0.0~15.5.27, 16.0.0~16.4.0 없음

표만 보면 Pages Router 앱은 안심해도 될 것 같다. 하지만 공식 글은 이미지 취약점에 라우터 조건을 달지 않았다. 셋 중 하나라도 걸리면 그냥 올리는 게 맞다.

use cache 원격 코드 실행

App Router에서 Cache Components를 켠 앱이 대상이다. use cache 함수가 typed array를 여러 개 반환하면 인증 없이 원격 코드 실행으로 이어질 수 있다. 같은 날 React 쪽 권고도 나왔다. React는 이를 "extremely rare cases"라고 적었다. 응답이 typed array 여러 개와 공격자가 조작한 값을 함께 실어 나를 때만 해당한다는 설명이다.

Cache Components를 켰는지는 설정 파일에서 확인한다. 16.4 발표 글에 실린 설정이다.

// next.config.ts
import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  // 이 값이 true면 첫 번째 취약점 조건에 들어간다
  cacheComponents: true,
  partialPrefetching: true,
};

export default nextConfig;

여기서 함정이 하나 있다. 10월 6일 나온 16.4부터 create-next-app으로 만든 새 앱은 Cache Components가 기본으로 켜진다. 최근에 새로 만든 프로젝트라면 내가 켠 기억이 없어도 켜져 있을 수 있다.

이미지 최적화 SVG와 sharp

이미지 최적화에 쓰는 상위 라이브러리의 메모리 관련 결함이다. 공식 글은 glibc 기반 리눅스에서 실행할 때 원격 코드 실행이 가능하다고 적었다. 다른 운영체제가 안전한지는 확인되지 않았다.

당장 Next.js를 올리기 어렵다면 Next.js가 쓰는 sharp를 0.35.5 이상으로 맞추는 것이 공식 우회책이다. 반대로 Next.js를 패치 버전으로 올리면 패키지 매니저가 고쳐진 sharp를 알아서 받아 준다. 이 취약점만 보면 둘 중 하나로 충분하다. 그래도 웬만하면 Next.js 자체를 올리는 쪽을 권장한다. 우회책은 세 건 중 이 하나만 막아 준다.

Server Action 서비스 거부

조작된 요청이 CPU를 과하게 잡아먹는 문제다. 같은 프로세스의 다음 요청까지 처리가 막힌다. 식당 주방에 주문서 한 장이 끝없이 걸려 있어서 뒤 주문이 하나도 안 나가는 꼴이다.

App Router에 Server Action이 하나라도 있으면 해당된다. Pages Router만 쓰거나 Server Action을 안 쓰는 앱은 취약하지 않다고 공식 글이 명시했다. 우회책은 따로 없다.

다음 공지를 놓치지 않는 설정

16.4에는 설치된 버전에 알려진 취약점이 있으면 next dev·next build 때 업그레이드를 알려 주는 실험 옵션이 들어왔다. 기본 정책이 'security'다.

// next.config.ts
const nextConfig: NextConfig = {
  experimental: {
    // 설치 버전에 알려진 취약점이 있을 때만 알린다
    agentUpgrade: 'security',
  },
};

보안 글은 9월 30일 릴리스와 10월 8일 예고에 이어 10월 14일까지 연달아 나왔다. 매번 블로그를 들여다보기 번거롭다면 설정 파일에서 이 값이 꺼져 있지 않은지 확인해 두자. 같은 프레임워크의 prefetch 기본값은 Next.js prefetch 글에 따로 적어 뒀다.

참고

반응형