Axios CRLF 헤더 주입과 npm 공급망 침해 대응
Axios의 CRLF 헤더 주입 취약점과 npm 공급망 침해 사고를 분석하고, Prototype Pollution·AWS IMDSv2·의존성 검증 대응책을 정리한다.
2026-08-14 · 최초 발행 2026-04-17
2026년 3월 말, 주간 7천만 회 이상 다운로드되는 JavaScript HTTP 클라이언트 Axios에서 CRLF 헤더 주입 취약점과 npm 공급망 침해가 연이어 발생했다. CVE-2026-40175는 Prototype Pollution과 결합할 경우 AWS IMDSv2를 우회해 클라우드 자격 증명을 탈취하는 경로로 이어질 수 있다. 같은 시기 Sapphire Sleet에 의한 npm 침해로 악성 RAT도 배포됐다.
헤더 병합 경로에서 발생한 CVE-2026-40175
- 취약점 식별자: CVE-2026-40175 / GHSA-fvcv-3m26-pcqx
- CVSS 3.1 점수: 9.9 (Critical)
- 영향 범위: Axios v0.x ~ v1.14.x 전 버전
- 취약 코드 위치:
lib/adapters/http.js의 HTTP 헤더 값 병합 로직 - 패치 버전: Axios 1.15.0 (2026년 4월 7일 릴리스)
- 핵심 문제: HTTP 헤더 값에 대한 CRLF(
\r\n) 문자열 미검증으로, Prototype Pollution 경유 시 Request Smuggling 공격 가능
CRLF(Carriage Return Line Feed, \r\n)는 HTTP에서 헤더를 구분하는 문자다. 헤더 값에 이 시퀀스가 섞이면 HTTP 파서가 이를 다음 헤더 또는 별도 요청의 시작으로 해석할 수 있다.
정상 흐름에서는 클라이언트가 지정한 헤더 값이 서버로 전달된다. 반면 CRLF가 삽입된 경우 하나의 Axios 요청이 둘 이상의 독립된 요청으로 나뉘는 HTTP Request Splitting이 발생할 수 있다. Axios의 문제 지점은 설정 객체를 병합할 때 Object.prototype에서 상속된 속성에 포함된 CRLF 문자열을 걸러내지 않은 부분이다.
// 정상 요청
GET /api/data HTTP/1.1\r\n
Host: example.com\r\n
Authorization: Bearer token\r\n
\r\n
// CRLF 주입된 요청 (하나의 헤더 값에 \r\n 삽입)
GET /api/data HTTP/1.1\r\n
Host: example.com\r\n
X-Custom: value\r\n\r\nPUT /latest/api/token HTTP/1.1\r\nHost: 169.254.169.254\r\nX-aws-ec2-metadata-token-ttl-seconds: 21600\r\n\r\n
\r\n
Prototype Pollution이 헤더 주입으로 이어지는 경로
이 취약점의 위험은 CRLF 검증 부재만으로 끝나지 않는다. Object.prototype이 오염되면 JavaScript 객체가 해당 속성을 상속할 수 있고, Axios 설정 병합 과정도 그 영향을 받을 수 있다.
| 단계 | 기법 | 세부 내용 |
|---|---|---|
| (1) Prototype Pollution | 의존성 취약점 악용 | qs, minimist, ini, body-parser 등 서드파티 라이브러리의 Prototype Pollution 취약점 활용 |
| (2) 속성 상속 | config 병합 | Axios의 설정 객체 병합 로직이 Object.prototype에서 오염된 헤더 속성 자동 상속 |
| (3) CRLF 주입 | 헤더 값 조작 | 오염된 속성 값에 포함된 \r\n 시퀀스가 필터링 없이 HTTP 요청 헤더에 삽입 |
| (4) Request Smuggling | 요청 분리 | 단일 Axios 요청이 두 개의 독립된 HTTP 요청으로 분리 |
| (5) SSRF | 내부 서비스 접근 | 분리된 두 번째 요청이 AWS Metadata Service(169.254.169.254)로 전달 |
| (6) IMDSv2 우회 | 토큰 획득 | PUT 요청에 X-aws-ec2-metadata-token-ttl-seconds 헤더 포함으로 IMDSv2 보안 우회 |
| (7) 자격 증명 탈취 | IAM 크레덴셜 유출 | 획득한 토큰으로 IAM 역할의 임시 자격 증명(Access Key, Secret Key, Session Token) 탈취 |
CVSS 9.9 Critical 등급과 클라우드 전체 장악 가능성은 이론적 위험을 보여준다. 다만 Node.js 런타임은 2018년부터 HTTP 헤더 값의 CRLF 문자를 차단하며 ERR_INVALID_CHAR 예외를 발생시킨다. Bun과 Deno도 동일하게 CRLF 문자를 차단한다.
Aikido Security는 "표준 Node.js 환경에서는 현실적으로 악용 불가능"이라고 평가했다. 그러나 커스텀 HTTP 구현, 프록시 서버, CRLF 필터링이 없는 런타임에서는 위험이 남는다.
npm 패키지 침해로 배포된 RAT
CVE-2026-40175와 별도로 2026년 3월 31일 Axios npm 패키지가 공급망 공격을 통해 침해됐다. Microsoft Threat Intelligence는 이 사고를 북한 국가 행위자 Sapphire Sleet의 활동으로 확인했다.
- 2026년 3월 31일: Axios 메인테이너 jasonsaayman의 npm 계정 탈취
- 39분 이내: 악성 버전
axios@1.14.1과axios@0.30.4발행 - 악성 의존성:
plain-crypto-js@4.2.1패키지가 런타임 의존성으로 주입 - post-install 실행: 사용자 상호작용 없이 설치 시 자동 실행
- C2 통신: Sapphire Sleet 소유 악성 도메인으로 연결
RAT는 macOS, Windows, Linux별 맞춤 페이로드를 배포했다. C2 서버와는 주기적인 인코딩 HTTP POST 요청으로 통신하며, 임의 PowerShell 코드 실행, 파일·디렉토리 열거, 바이너리 페이로드의 메모리 직접 주입, 실행 종료를 지원한다. axios@^1.14.0 또는 axios@^0.30.0 이상을 자동 업데이트하는 프로젝트가 영향 범위에 포함된다.
Sapphire Sleet은 2020년 3월 이후 활동해 온 북한 국가 지원 APT 그룹으로, 암호화폐·벤처 캐피탈·블록체인 조직 등 금융 부문을 주요 표적으로 삼아 왔다. 사회공학으로 메인테이너 계정을 탈취한 뒤 공급망을 침해하는 전술이 사용됐으며, 귀속 근거는 Microsoft Threat Intelligence의 C2 인프라 분석이다.
설치 흔적을 확인하고 배포 경로를 통제하기
우선 설치된 Axios 버전은 npm ls axios 또는 yarn why axios로 확인한다. axios@1.14.1, axios@0.30.4를 사용 중이면 즉시 axios@1.15.0 이상으로 올리고, package-lock.json 또는 yarn.lock에서 plain-crypto-js 의존성 존재 여부를 점검해야 한다. Sapphire Sleet C2 도메인과 IP에 대한 네트워크 로그도 확인 대상이다.
의존성 선언에는 ^ 대신 정확한 버전을 사용한다. 예를 들어 "axios": "1.15.0"처럼 고정하고, CI/CD에서는 npm ci로 lockfile 기반 설치를 강제한다. npm의 패키지 출처 증명(provenance attestation), Socket.dev와 Snyk 같은 실시간 공급망 위협 탐지 도구, npm 메인테이너 계정의 2FA 의무화도 함께 적용할 수 있다.
Prototype Pollution을 줄이려면 Object.freeze(Object.prototype)으로 프로토타입 오염을 차단하고, 일반 객체 대신 Map을 사용해 프로토타입 체인을 우회할 수 있다. 사용자 입력을 객체 키로 쓸 때는 __proto__, constructor, prototype 키를 필터링한다. npm audit의 정기 실행도 취약 라이브러리 탐지에 필요하다.
AWS 환경에서는 EC2 인스턴스 메타데이터 서비스를 IMDSv2 전용으로 설정하고 hop limit 1을 적용한다. EC2 IAM 역할은 최소 권한으로 제한하며, 메타데이터 서비스 접근은 VPC 내부로 제한한다. GuardDuty를 활성화해 비정상적인 자격 증명 사용 패턴을 탐지하는 방어층도 마련한다.
헤더 검증 문제와 악성 의존성 배포는 서로 다른 사고지만, 의존성 간 상호작용과 배포 신뢰 경로가 동시에 공격 표면이 될 수 있음을 보여준다. 표준 Node.js 런타임의 CRLF 차단은 악용 가능성을 제한하지만, 커스텀 환경과 프록시 구성은 별도로 검증해야 한다. 버전 고정, lockfile 무결성 확인, 공급망 위협 탐지, 클라우드 최소 권한이 함께 작동해야 한다.
Sources
- Unrestricted Cloud Metadata Exfiltration via Header Injection Chain - GitHub Advisory
- Axios CVE-2026-40175: a critical bug that's not exploitable - Aikido Security
- Mitigating the Axios npm supply chain compromise - Microsoft Security Blog
- axios Compromised on npm - Malicious Versions Drop Remote Access Trojan - StepSecurity
- Second security nightmare hits Axios: critical bug puts entire cloud infrastructure at risk - CyberNews
- CVE-2026-40175 Detail - NVD
- Axios Supply Chain Attack Pushes Cross-Platform RAT - The Hacker News
- Threat Brief: Widespread Impact of the Axios Supply Chain Attack - Unit 42
- Axios, Two Different Security Stories, and Why the New CVE Matters - CyberLeveling
- Inside the Axios supply chain compromise - Elastic Security Labs