전 세계 웹 서비스의 서버 쪽을 떠받치는 자바스크립트 실행 환경 'Node.js'에서 보안 취약점 10건이 한꺼번에 드러났다. Node.js 프로젝트는 지난 21일(현지시간) 지원 중인 22·24·26 버전 계열 전부에 대한 보안 업데이트를 내놓았다. 10건 가운데 4건은 위험도 '높음(High)'이다.
가장 심각한 것은 압축 데이터를 풀어내는 과정에서 생기는 메모리 오류다. Node.js 측은 이 결함이 원격 코드 실행, 즉 외부 공격자가 서버에서 임의의 명령을 돌리는 상황으로 이어질 수 있다고 밝혔다. 공식적인 임시 회피책은 없다. 업데이트만이 유일한 해법이다.
고위험 4건·중위험 3건·저위험 3건
Node.js는 웹 브라우저 안에서만 돌던 자바스크립트를 서버에서도 쓸 수 있게 만든 프로그램이다. 쇼핑몰·뉴스 사이트·사내 업무 시스템의 서버, 개발자들이 쓰는 빌드 도구, 클라우드 함수까지 폭넓게 깔려 있다. 그만큼 한 번 취약점이 나오면 영향 범위가 넓다.
이번 업데이트로 고쳐진 결함은 위험도 기준 높음 4건, 중간 3건, 낮음 3건이다. 고위험 결함은 ▷Brotli 압축 해제 시 메모리 범위 밖 쓰기(CVE-2026-111497) ▷DNS 조회 때 NUL 문자로 이름이 잘려 검사 우회(CVE-2026-105482) ▷비표준 IP 표기로 TLS 인증서 검증 우회(CVE-2026-106069) ▷전각 숫자로 TLS 인증서 검증 우회(CVE-2026-105483) 등이다. 이 밖에 연결 재사용 시 미리 보낸 응답을 정상 응답으로 오인하는 문제, 스냅숏·단일 실행파일에서 난수가 반복되는 문제, 권한 모델 우회 문제 등이 함께 고쳐졌다.
Node.js 안에 함께 묶여 배포되는 부품도 같이 갱신됐다. 암호화 통신을 맡는 OpenSSL, 웹 요청을 처리하는 Undici, 도메인 주소를 찾아주는 c-ares, 인증서 목록 등이다.
압축 파일 하나로 서버를 노린다
가장 위험한 결함은 'Brotli'라는 압축 방식을 푸는 과정에 있다. Brotli는 웹페이지를 작게 줄여 빠르게 전송하려고 널리 쓰는 압축 기술이다. 문제는 Node.js 자체 코드가 아니라 Node.js가 내장한 구글의 Brotli 라이브러리에서 나왔다.
공격자가 교묘하게 조작한 압축 데이터를 보내면, 프로그램이 정해진 메모리 구역 바깥에 데이터를 써버린다. 보안 업계에서는 이런 유형을 서버 장악으로 가는 대표 경로로 본다.
눈여겨볼 대목은 Node.js의 기본 웹 요청 기능인 fetch다. 보안업체 Konfirmity는 fetch가 HTTPS 서버에 기본적으로 Brotli 압축 응답을 요청하고 이를 Node.js 내부에서 풀기 때문에, 악성이거나 해킹당한 외부 서버에 요청만 보내도 공격 데이터를 받을 수 있다고 분석했다. 서버가 '받는' 데이터뿐 아니라 '가져오는' 데이터도 위험하다는 뜻이다. 다만 이는 업체의 소스 분석이며 Node.js가 공식 언급한 내용은 아니다.
나머지 고위험 3건은 '눈속임' 계열이다. 예컨대 도메인 이름 중간에 보이지 않는 NUL 문자를 끼워 넣으면, 프로그램은 신뢰하는 주소로 판단하지만 실제 조회는 엉뚱한 주소로 나간다. '0127.0.0.1'처럼 8진수로 쓴 IP나 전각 숫자 '127'을 쓰면 인증서 검사는 한 주소로, 실제 접속은 다른 주소로 이뤄지는 틈도 있었다. 사용자가 입력한 주소로 접속하는 웹훅·링크 미리보기 기능이 주된 표적이다.
"내부망이라 괜찮다"는 착각
외부에 공개되지 않은 사내 서버라도 안심하긴 이르다. 내부 서버도 결제·인공지능·고객관리 같은 외부 서비스를 끊임없이 호출하기 때문이다. 이번 결함 중 상당수는 바로 이 '나가는 요청'을 노린다. 다만 공격자가 호출 대상 서비스를 장악하거나 통신 경로에 끼어들어야 하므로, 내부 서비스는 상대적으로 덜 급하다는 평가도 있다.
더 큰 위험은 업데이트가 끊긴 구버전이다. Node.js 20은 지난 4월 30일, 25는 6월 1일 지원이 끝나 이번 패치를 받지 못한다. Node.js 측은 보안 공지 때마다 "지원 종료 버전은 항상 영향을 받는다"고 명시한다. 20 버전 이하를 쓰는 서비스는 사실상 알려진 구멍을 그대로 안고 있는 셈이다.
도커 컨테이너나 단일 실행파일로 배포한 서비스도 주의가 필요하다. 이들은 저마다 Node.js 사본을 품고 있어, 서버 본체를 업데이트해도 이미지를 다시 만들기 전까지는 취약한 상태가 남는다. 클라우드도 마찬가지다. 아마존웹서비스(AWS)의 경우 22일 기준 람다 기본 이미지는 갱신됐지만 일래스틱 빈스톡, 아마존 리눅스 패키지 등은 아직 패치 버전이 반영되지 않은 것으로 파악됐다.
대응은 '버전 확인 → 업데이트 → 재빌드'
대응 방법은 단순하다. 사용 중인 버전 계열별로 22.23.4, 24.22.1, 26.12.1 이상으로 올리면 된다. Node.js 26은 오는 28일 장기지원(LTS) 버전으로 전환되며, 22는 2027년 4월까지 지원된다. 20 이하와 21·23·25 버전은 패치가 없으므로 22나 24로 옮겨야 한다. 버전은 터미널에서 'node -v' 명령으로 확인할 수 있다. 공식 도커 이미지는 21일 갱신됐으므로, 컨테이너는 새 기본 이미지를 받아 다시 빌드해야 한다.
업데이트 뒤 코드를 고칠 일은 대부분 없다. 다만 비표준 IP 주소로의 접속은 인증서 검사에서 거부되고, NUL 문자가 든 도메인 조회는 오류를 낸다. 단일 실행파일을 스냅숏 기능으로 만들어 배포했다면 다시 빌드하고, 그 파일이 만든 토큰이나 난수는 교체하는 것이 안전하다.
한편 이번 결함에 대해 국내 기관 차원의 별도 권고는 26일 현재 확인되지 않았다. 국내 개발사·공공기관 서비스도 상당수 Node.js 위에서 돌아가는 만큼 자체 점검이 필요하다.
올해만 네 번째… 자원봉사로 떠받치는 인터넷 기반
이번이 끝이 아니다. Node.js는 올해 1월(7건), 6월, 7월에 이어 10월까지 최소 네 차례 대규모 보안 업데이트를 냈다. 매번 지원 중인 모든 버전 계열에서 고위험 결함이 나왔다. 오픈소스 보안 재단인 OpenJS 재단은 2분기 보고서에서 상반기에만 49건의 보안 권고를 냈다고 밝혔다.
이 많은 보안 작업을 맡는 이들은 주로 자원봉사자다. Node.js 측은 지난 3월 릴리스 일정 개편을 발표하며 "Node.js는 주로 자원봉사자가 유지보수한다"며 "네다섯 개 버전 계열의 보안 업데이트를 동시에 관리하기가 어려워졌다"고 털어놨다.
그래서 일정이 바뀐다. 27 버전부터 대형 업데이트는 연 2회에서 매년 4월 1회로 줄고, 10월에 장기지원(LTS) 버전으로 전환된다. 홀수·짝수 구분도 없어져 모든 버전이 LTS가 된다. 관리할 버전 수를 줄여 보안 대응에 힘을 모으겠다는 것이다.
이번 사태는 인터넷 기반 소프트웨어의 공급망 구조를 그대로 드러낸다. 이번 최고 위험 결함도 Node.js가 아닌 그 안에 든 구글 Brotli 라이브러리에서 나왔다. 서비스 운영자 입장에서는 내가 쓰는 프로그램뿐 아니라 그 안에 든 부품까지 챙겨야 하는 시대라는 뜻이다.




































댓글 많은 뉴스
이재명 대통령, 흉악범 '가석방 없는 무기형' 도입 추진
"김혜경 여사 단독 참석 행사에 14억" 꺼내자…최휘영 "폄하하지 마십시오!" [여의도.gif]
박정희·노무현·김대중 '3강' 그대로, 2030 선호 뒤집히고, 영부인은 여전히 육영수 [시사뒷담]
신평 "2028년 총선서 야권 압승…이재명 정부, 스스로 명 단축하는 형국"
李 대통령 참석한 경찰의 날 행사…美·日 대사 빠지고 中·러 대사 참석