↪cf_200D↩개요
여러 버전의 Node.js에 있는 http 모듈의 llhttp 구문 분석기는 CRLF 시퀀스를 엄격하게 사용하여 HTTP 요청을 구분하지 않으므로 HTTP 요청 스머징(HRS)이 발생할 수 있습니다.
HTTP 요청 스머핑은 HTTP 서버가 요청을 올바르게 처리하는 것을 방해합니다. 이 익스플로잇의 가능한 영향으로는 시스템에 대한 무단 액세스 허용, 공격자의 데이터(데이터베이스, 사용자 계정 및 기타 기록) 수정, 세션 하이재킹, 정보 유출, 캐시 포이즈닝 및 서비스 거부 등이 있습니다.
이 문제는 16.0.0부터 16.20.1까지, 18.0.0부터 18.16.1까지, 20.0.0부터 20.3.1까지 다음 버전의 Node.js에 영향을 줍니다(단, 제외).
세부 정보
모듈 정보
영향을 받는 패키지: llhttp
영향을 받는 Node.js 버전: 14 LTS
리포지토리: https://github.com/nodejs/node
게시된 패키지: 노드
패키지 관리자: npm
취약점 정보
이 심각도가 높은 취약점은 여러 버전의 llhttp 라이브러리에서 발견됩니다. RFC7230 섹션 3에서는 각 헤더 필드를 구분할 때 CRLF 시퀀스만 사용해야 한다고 명시하고 있지만, 취약한 버전의 라이브러리에서는 LF 없이 CR 문자만 사용하여 HTTP 헤더 필드를 구분할 수 있습니다.
이 라이브러리는 Node.js와 함께 번들로 제공되므로 v16, v18 및 v20 브랜치에 있는 많은 버전의 Node.js가 영향을 받습니다.
해결 방법은 없습니다.
재현 단계
- 서버에 취약한 버전의 Node를 설치합니다.
- r\n(CRLF)을 사용하는 대신 헤더 필드를 끝낼 때 \r(CR)만 사용하는 HTTP 요청을 작성합니다. 아래 예시에서는 첫 번째 요청이 \r로만 끝나기 때문에 두 번째 요청이 스밍(웹 서버의 특정 계층에 숨겨지거나 잘못 해석됨)될 가능성이 있습니다. 두 번째 요청은 \r\n으로 올바르게 종료되므로 올바르게 형성됩니다.
POST / HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11\r
쿠키: 세션=abc123\r
\r
data=payload1
POST /secret HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
\r\n
data=payload2
해결 방법은 사용할 수 없습니다.
완화
모든 사용자는 이 취약점이 없는 Node 버전으로 업그레이드해야 합니다.
추가 리소스
- NIST 항목
https://nvd.nist.gov/vuln/detail/CVE-2023-30589 - https://github.com/advisories/GHSA-cggh-pq45-6h9x
저희가 지원하는 오픈 소스 소프트웨어에서 새로운 취약점이 수정될 때마다 알림을 받으세요.