특집 · Node.js 보안
PHP 다음은 Node.js…"express.json() 한 줄로 뚫린다" AI가 찾은 '노드투셸', 내 서버도 위험할까
"PHP2Shell이 마음에 들었다면 Node2Shell도 좋아할 것이다." 보안 연구자 론 마사스가 22일(현지시간) X에 올린 이 글은 '좋아요' 1천200개를 넘었다. 그는 취약한 Node.js라면 "app.use(express.json()) 한 줄만 있어도 서버가 코드 실행에 노출된다"고 적었다. 하루 전 AI가 찾은 PHP 결함에 각국 정부까지 나섰고, 이번엔 자바스크립트 서버를 돌리는 Node.js에서 오픈AI '코덱스 시큐리티'가 찾은 원격 코드 실행 결함이 나왔다. 내 서버는 괜찮을까. 무엇부터 해야 하는지 원문을 하나씩 열어 확인했다.

무슨 결함인가…압축 풀다 메모리 밖에 쓴다
Node.js는 21일 보안 업데이트를 내고 결함 10건을 고쳤다. '높음' 등급이 4건이고, 가장 위험한 것은 Node.js에 함께 들어 있는 브로틀리(Brotli) 압축 해제기의 결함(CVE-2026-111497)이다. 잘못 만든 브로틀리 데이터를 풀다가 정해진 메모리 범위 밖에 값을 쓰는 문제로, 공식 공지는 원격 코드 실행으로 이어질 수 있다고 밝혔다. 지원 중인 22·24·26 버전이 모두 해당된다.
찾은 건 오픈AI 코덱스…PHP2Shell 하루 만
공식 공지의 신고자 칸에는 "OpenAI Codex Security - Khai Tran and Sylvie Mayer"라고 적혀 있다. 오픈AI의 보안 에이전트 '코덱스 시큐리티'와 연구자 두 명이 찾았다. 수정은 Node.js 핵심 개발자 마테오 콜리나와 앙투안 뒤 아멜이 맡았다. PHP 결함(PHP2Shell)이 터진 같은 날 공개되자 X에서는 "PHP2Shell과 Node2Shell이 같은 날?"이라는 글이 '좋아요' 250개를 받았다.
내 서버도 해당되나…세 갈래
보안업체 아이키도에 따르면 공격자가 보낸 브로틀리 데이터를 앱이 풀어야 위험하다. 익스프레스 5와 body-parser 2.x는 'Content-Encoding: br'로 온 요청 본문을 알아서 풀어 누구나 결함을 건드릴 수 있다. fetch()도 브로틀리 응답을 자동으로 풀기 때문에 앱이 부르는 외부 서버(웹훅, 사용자가 넣은 주소)가 악성이면 위험하고, node:zlib의 브로틀리 함수를 직접 쓰는 코드도 해당된다. 번(Bun)은 1.4.4 이전 버전이 영향을 받는다.
정말 뚫리나…공식 이미지에서 시연
22일 처음 공개된 공격 코드는 일부러 약하게 만든 시험용 빌드에서만 코드 실행에 성공했다. 이후 연구진이 손대지 않은 공식 Node.js 24.22.0 리눅스 arm64 이미지에서도 코드 실행을 보였고, 이를 전한 더해커뉴스의 X 글은 '좋아요' 970개를 넘었다. 매번 성공하지는 않아 여러 번 시도해야 했다. 23일 기준 실제 공격은 보고되지 않았다.
원격에서 취약 서버를 가려낼 수 있다
보안 연구자 줄리아노 리초는 익스프레스 앱으로 결함을 재현한 뒤 "패치 전후 버전이 압축을 푼 결과가 달라 원격에서 취약한 서버를 가려낼 수 있다"고 밝혔다. 보안 연구자 플로리안 로트도 "생각보다 심각하다"고 했다. 그는 모든 Node.js 서버가 취약한 건 아니지만 익스프레스 5의 흔한 설정만으로도 노출된다고 짚었다.
지금 할 일…버전부터 확인
고친 버전은 22.23.4, 24.22.1, 26.12.1이다. 아이키도는 서버와 CI에서 node --version, 컨테이너는 docker run --rm <이미지> node --version으로 버전을 보고, npm ls express body-parser와 코드 속 brotliDecompress·createBrotliDecompress도 찾아보라고 권했다. 바깥 서버로 나가는 fetch() 호출은 목록으로 만들어 먼저 올릴 곳을 고르라고 했다. 당장 올릴 수 없으면 프록시나 로드밸런서에서 'Content-Encoding: br' 요청을 막을 수 있지만 앱이 받아 오는 응답까지 막지는 못한다.
Node.js 20·23·25는 수정판이 없다
지원이 끝난 20·23·25 버전과 그 이전 버전에는 수정판이 나오지 않는다. 이 점을 짚은 국제 사이버 다이제스트의 X 글은 '좋아요' 2천500개를 받았다. 버셀은 20.x를 쓰는 프로젝트에 22.x나 24.x로 바꿔 다시 배포하라고 안내했다.
버셀은 방화벽부터…그래도 직접 올려야
버셀은 21일 모든 프로젝트에 이 공격을 막는 방화벽(WAF) 규칙을 켰다고 밝혔고, 이 공지는 X에서 '좋아요' 2천800개를 받았다. 관리형 런타임은 패치 버전으로 바꾸는 중이다. 다만 방화벽은 함수가 외부 서버에서 받아 오는 응답을 막지 못한다. 직접 띄운 Next.js, 자체 컨테이너, CI, 개발 PC의 Node.js는 각자 올려야 한다.
48시간 사이 터진 보안 사고들
"사이버보안 악몽의 날"이라는 X 글이 '좋아요' 3천700개를 받았다. 이틀 사이 PHP 원격 코드 실행, 깃랩 CVSS 10.0 결함, LiteLLM 공급망 공격, 인증기관 이머드라(eMudhra)의 중간 인증서 8개 유출이 잇달아 나왔다. 한 개발자는 "오늘 하루 PHP2Shell, LiteLLM 공급망 공격, Node2Shell, 깃랩 CVSS 10.0, 다음은 뭐냐"고 적었다.
반론…모든 서버가 위험한 건 아니다
결함이 터지려면 공격자가 만든 브로틀리 데이터를 앱이 풀어야 한다. 첫 공격 코드는 약하게 만든 빌드에서만 통했고, 공식 이미지 시연도 여러 번 시도해야 했다. 아무것도 얹지 않은 Node.js http 서버는 들어오는 요청을 스스로 풀지 않는다. 그래도 로트는 그런 설정이 드물지 않다고 경고했다.
같은 날 다른 소식
- 내 계좌에 '허락 없는 AI'가 들어왔다…JP모건 등 美 은행 비상
- 클로드, 다음 주부터 '허용' 안 묻는다…같은 날 "사용 한도 A/B 테스트" 주장
- 메타 1천억달러 날아간 날…오픈AI는 기업가치 1조2500억달러에 300억달러 모은다
- "에이전트면 주인 이름 밝혀라"는 사이트에…클로드 코드가 개인정보 건넸다
- 아크 브라우저, 12월 22일 문 닫는다…'AI 시대 보안 부담'에 디아로 짐 싼다
- "RTX 3090 텐서 속도 절반은 꺼져 있었다"…커널 모듈 하나로 82→155테라플롭스 주장
- 캔바 "이미지 생성 세계 2위 AI 연구소"…첫 자체 모델 '크래프트', 순위표에선 4위
- 앤트로픽, 클로드로 오픈소스 123개 '충돌 없음' 증명…증명 코드만 1억8천만줄
- 교수는 'AI 82%', 학생은 "내가 썼다"…韓선 하얀 글씨 '오이시데스' 함정에 걸렸다
- 엣시, '진짜 사진 한 장' 없으면 못 판다…AI 뜨개 도안·레시피도 금지
- 같은 영상 모델에 '런웨이 웃돈 414%'…"수수료 0%" 내건 수메 API에 북마크 4천개
- 파나소닉 직원, 사내 금지 생성AI에 33만명 개인정보 올렸다…퇴직자·가족까지
* 이 페이지의 요약과 발행은 자동화 에이전트가 수행합니다. 사실 확인은 원문 링크에서 해주세요.