← 모든 글
개발

Node.js 및 의존성 보안 취약점 대응 보고서 — 2026년 10월

AI 작성 보고서 · 대응일: 2026년 10월 25일(KST)

이 문서는 @minju25kim 사이트에서 수행한 Node.js 및 의존성 보안 업데이트를 정리한 대응 기록입니다. 실제 침입이나 정보 유출이 확인된 사고를 서술하는 문서는 아닙니다.

1. 대응 요약

Node.js 10월 보안 공지와 프로젝트 의존성 검사를 바탕으로 빌드 환경과 취약 패키지를 업데이트하고, 테스트 및 미리보기 검증 후 운영에 배포했습니다.

  • 작업에 사용한 Node.js: 24.6.0 → 24.22.1
  • pnpm 검사에서 보고된 보안 권고: 107건 → 0건
  • npm 잠금 파일 재검사: 별도 기준값 미기록 → 0건
  • 기존 자동화 테스트: 업데이트 과정에서 호환성 문제 발견 → 24개 통과
  • 운영 반영: 기존 배포 → 보안 업데이트 배포 완료

107건은 패키지 107개 또는 실제 공격 107회를 의미하지 않습니다. 당시 의존성 검사에서 보고된 보안 권고의 집계입니다. 최초 집계는 Critical 2건, High 49건, Moderate 44건, Low 12건이었습니다. 개발 도구의 의존성도 검사 범위에 포함됐습니다.

2. 확인 범위와 실행 환경

운영 서비스는 Cloudflare Pages의 정적 파일과 Worker 서버 엔트리로 구성되어 있습니다. 운영 요청을 처리하는 런타임은 Cloudflare가 관리하며, 로컬 Node.js는 패키지 설치·검사·빌드·배포 도구 실행에 사용합니다.

따라서 이번 조치는 두 층으로 나누어 수행했습니다.

  • 빌드 환경: 실제 작업에 사용한 Node.js를 24.22.1로 교체하고 .node-version과 패키지의 요구 버전에 기록했습니다.
  • 프로젝트 의존성: 직접 의존성과 그 아래의 전이 의존성을 업데이트하고, pnpm·npm 잠금 파일을 갱신했습니다.

이 기록은 Cloudflare 운영 런타임을 Node.js 24.22.1로 교체했다는 의미가 아닙니다. Node.js 내부 라이브러리 업데이트와 프로젝트에 별도로 설치된 npm 패키지 업데이트 역시 서로 대체되지 않습니다.

3. 주요 취약점과 판단

Node.js 공식 10월 공지에는 DNS 이름 처리, TLS 인증서 검증, Brotli 디코더 등과 관련한 수정이 포함되어 있었습니다. 프로젝트에서 사용하던 24.6.0 대신 24 계열의 보안 수정 버전 24.22.1을 빌드에 사용했습니다.

프로젝트 의존성에서는 Undici의 다음 세 권고를 확인했습니다.

  • CVE-2026-109924: EventSource 파서의 무제한 메모리 사용에 따른 서비스 거부. 수정 버전: 7.30.1.
  • CVE-2026-109841: 대소문자가 섞인 알고리즘 토큰에서 Subresource Integrity 검증 우회. 수정 버전: 7.30.1.
  • CVE-2026-109869: 과도한 Content-Encoding 응답 처리 중 미처리 오류에 따른 프로세스 종료. 수정 버전: 7.30.1.

의존성에 취약 버전이 있다는 사실만으로 운영 서비스에서 해당 공격이 가능했다고 단정할 수는 없습니다. 예를 들어 마지막까지 남았던 Undici 7.29.1은 Wrangler의 로컬 실행 도구인 Miniflare 아래에 있었습니다. 이번 작업은 취약 의존성 제거를 수행했으며, 각 권고에 대한 운영 경로의 공격 가능성을 개별적으로 입증하는 분석은 수행하지 않았습니다.

4. 적용한 변경

직접 의존성은 기존 메이저 버전 범위 안에서 업데이트했습니다. Vite, Vitest, Tiptap, TanStack Router 및 관련 도구를 포함하며, 전이 의존성도 함께 갱신했습니다.

일반 업데이트 후에도 남은 항목은 의존성 경로를 확인해 처리했습니다.

  1. Wrangler → Miniflare → Undici: 상위 도구가 7.29.1을 지정하고 있어, 해당 버전에 한정해 7.30.1을 사용하도록 pnpm·npm 설정에 재정의를 추가했습니다.
  2. Vite → tsx → esbuild: tsx 4.21.0을 4.23.15로 올려 수정된 esbuild를 사용하게 했습니다. esbuild만 임의로 교체하는 대신 이를 소유한 의존성을 갱신했습니다.
  3. 서버 렌더링 호환성: 라우터 업데이트로 변경된 API에 맞췄습니다. 리다이렉트는 요청 처리기의 기본 동작을 사용하고, 오류 응답의 검색 제외 헤더는 렌더링된 응답 상태를 기준으로 설정했습니다.

보안 업데이트 자체에는 데이터베이스 마이그레이션이나 게시글 데이터 변경이 포함되지 않았습니다. 이후 별도로 진행한 에디터·작성자 구분 변경은 이 보고서의 보안 대응 범위에서 제외합니다.

5. 검증과 운영 배포

최초 보안 업데이트를 완료한 시점에 다음 항목을 확인했습니다.

  • pnpm 의존성 재검사 및 npm 잠금 파일 검사: 모두 보고된 취약점 0건.
  • 잠금 파일을 고정한 설치, 린트, TypeScript 검사, 클라이언트·Worker 빌드: 통과.
  • 기존 테스트 24개: 통과. 서버 렌더링, 오류 상태, 번역 및 편집 관련 기존 테스트를 포함했습니다.
  • Cloudflare 미리보기: 홈, 글 목록·본문, 한국어 이력, 장비 페이지, robots.txt, sitemap.xml 및 관리자 진입 경로의 응답 확인.
  • 없는 글·경로: 404와 검색 제외 헤더 확인.
  • 운영 반영 후: 홈, 글 목록, 한국어 이력, 장비 페이지, 사이트맵과 없는 글의 응답을 재확인.

미리보기에서 검증한 빌드 결과물을 운영에 배포했습니다. 당시 보안 릴리스는 47e77c74 배포이며, 대응 전 배포 ID는 롤백 대상으로 기록했습니다. 현재 운영에는 이 보안 릴리스 이후의 기능 변경도 반영되어 있습니다.

6. 결과와 한계

이번 작업은 확인된 취약 의존성을 수정 버전으로 교체하고, 기존 동작을 검증한 뒤 운영에 반영한 취약점 대응입니다. 검사 결과 0건은 당시의 패키지 구성과 권고 데이터에 대한 결과이며, 모든 보안 문제가 없다는 보증은 아닙니다.

침해 로그 분석, 포렌식, 유출 여부 조사, 인증 정보 교체는 이번 작업에서 수행하지 않았습니다. 따라서 침해가 있었다거나 없었다는 결론을 내리지 않습니다. 또한 전체 운영 플로우에 대한 수동 보안 점검을 완료했다고 주장하지 않습니다.

추가한 의존성 재정의는 향후 상위 패키지가 수정 버전을 직접 제공하면 제거 여부를 검토해야 합니다. 새 보안 권고가 발표되면 같은 범위에서 재검사하고, 업데이트 후에는 테스트·미리보기·운영 확인을 다시 수행하는 것이 후속 운영 과제입니다. 이 보고서 작성으로 자동 감시가 설정된 것은 아닙니다.

참고 자료

작성 근거: 당시 의존성 검사 결과, 테스트·빌드 출력, 배포 기록 및 운영 HTTP 확인 결과.