HTTP2Shell: Lỗ hổng Brotli RCE trong Node.js và Python

Sơ đồ HTTP2Shell CVE-2026-111497: lỗ hổng ghi ngoài vùng nhớ trong thư viện nén Brotli của Google và các bản vá Node.js, Python, .NET

HTTP2Shell (CVE-2026-111497) là lỗ hổng ghi ngoài vùng nhớ trong thư viện nén Brotli của Google, cho phép kẻ tấn công chạy mã từ xa trên máy chủ của bạn chỉ bằng dữ liệu nén đã được sửa. Lỗi nằm trong bản Brotli 1.0.3–1.2.0 và đã được CISA thêm vào danh mục KEV ngày 27/10/2026, hạn chót 10/11 cho cơ quan dân phục liên bang Mỹ. Nếu bạn chạy Node.js, Python, .NET, Bun, Envoy hay Istio — bài này là checklist kiểm tra và vá trong 48 giờ tới.

Brotli là gì và tại sao lỗi của nó lan khắp mọi nơi

Brotli là thuật toán nén của Google, nằm sau chữ Content-Encoding: br mà mọi trình duyệt và HTTP client đều tự động xử lý. Điểm đáng lưu ý: nhiều sản phẩm bundle sẵn bản sao của thư viện nén vào gói cài đặt, nên nâng cấp thư viện hệ thống không ăn vào app đã bundle — bạn phải nâng cấp chính gói đó.

Chuyện gì đã xảy ra: từ tháng 2 đến hôm nay

Mốc đầu tiên gây bất ngờ là 27/02/2026: bản vá đã được commit vào mã nguồn Brotli, nhưng lúc đó chưa ai biết đó là lỗi bảo mật. Lỗi nằm im tám tháng.

Ngày 21/10, Node.js và Google Brotli cùng ra bản vá. Ngày 25/10, Microsoft phát hành bản vá khẩn cho .NET. Ngày 26/10, ELLIO ghi nhận request khai thác ngoài đời nhắm vào Node.js 24.22.0.

Ngày 27/10, CISA thêm lỗ hổng vào KEV. Ngày 28/10 hôm nay, SecurityWeek đưa tin. Cần nói rõ ranh giới: đã có nỗ lực khai thác ngoài đời, nhưng chưa có nguồn nào xác nhận khai thác thành công ở quy mô lớn.

Một chi tiết hay gây hiểu nhầm: cái tên HTTP2Shell không liên quan gì đến HTTP/2 — đó là cách đặt tên kiểu “Node2Shell”, ghép tên hệ sinh thái với hậu tố “Shell”.

Vì sao “AI tìm ra lỗ hổng” lại đáng chú ý ở đây

Lỗi được phát hiện trong red-teaming — nghiên cứu tấn công có kiểm soát — bởi chính đội Codex Security của OpenAI, không phải AI đoán mò.

Bài học rút ra khá thực tế: AI giúp tìm và hiểu lỗi nhanh hơn, nhưng con người vẫn phải quyết định khi nào nó là lỗ hổng. Bản vá có trên tay từ tháng 2 nhưng phải đến 21/10 mới có người gắn nhãn “security bug” và kèm bản release. Bài AI agent an toàn: 5 lớp phòng thủ đã bàn về ranh giới này.

Bạn có bị ảnh hưởng không? Bảng phiên bản

Điều kiện phải có cả hai: runtime đang chạy bản lỗi, và có đường để dữ liệu nén không tin cậy đi vào decoder.

Thành phần Bản đã vá Bị ảnh hưởng
Node.js 22.23.4, 24.22.1, 26.12.1 20.x, 23.x, 25.x — hết hỗ trợ, không có bản vá
Google Brotli 1.0.10, 1.1.1, 1.2.1 1.0.3 – 1.2.0
Python Brotli 1.2.1, brotlicffi 1.2.1.0 brotlicffi ≤ 1.2.0.x
Bun 1.4.4 1.0.21 – 1.4.3
.NET 8.0.33, 9.0.22, 10.0.14, 11 RC3 Microsoft chấm 8.1 CVSS v3.1
Envoy / Istio Envoy 1.36.12–1.40.0, Istio 1.29.9–1.31.2 Istio 1.29 hết hỗ trợ 15/10

Về mức độ lan rộng, theo Wiz 91% môi trường cloud có tài nguyên dính lỗi và 82% có Node.js public. Theo Akamai, 61% mạng đang chạy Node.js bị ảnh hưởng. Hai con số này đo trên hai mẫu khác nhau, không so chéo được.

Lưu ý

Dòng Node.js 20.x, 23.x và 25.x đã hết hỗ trợ nên không có bản vá. Lối thoát duy nhất: nâng cấp lên dòng 22, 24 hoặc 26.

Ba đường tấn công thực tế

Inbound — request body. Express 5 cùng body-parser 2.x bật inflate: true mặc định, nên chỉ cần app.use(express.json()) là server đã tự giải nén body Brotli đến từ Internet. Express 4 cùng body-parser 1.x thì không.

Outbound — fetch() tự giải nén. Hàm fetch() của Node.js tự giải nén response. Webhook, dịch vụ xem trước URL, crawler hay AI agent tự fetch URL đều là đường vào, và WAF thường không nhìn thấy dữ liệu đã giải nén.

Trực tiếp — file nén. Code gọi zlib.brotliDecompress() trên input không tin cậy: file Parquet nén, JPEG XL, PDF, archive.

Làm gì trong 48 giờ tới

  1. Kiểm tra phiên bản runtime đang chạy thật: node -v, bun -v, pip show brotli.
  2. Nâng cấp theo bảng ở trên.
  3. Restart tiến trình và rebuild image container — tiến trình đang chạy giữ code cũ.
  4. Cập nhật lockfile (package-lock.json, poetry.lock, requirements.txt), nếu không lần build sau sẽ âm thầm kéo bản lỗi.

Trong lúc chưa vá được: chặn request có Content-Encoding: br ở proxy, tắt giải nén Brotli ở HTTP client, hoặc gỡ package brotli khỏi môi trường Python. Đừng tin cách “bỏ br khỏi Accept-Encoding” — server đối tác vẫn gửi Brotli được.

Góc nhìn từ hệ thống đang chạy tại Việt Nam

Bạn đang chạy VPS ở Việt Nam thì có phải vá gấp không? Rủi ro phụ thuộc vào việc app của bạn có nhận hay gửi dữ liệu nén Brotli qua Internet.

  • App nội bộ, không có endpoint công khai, không fetch URL lạ → rủi ro thấp. Server trần Node.js không tự giải nén body, Express 4 và body-parser 1.x cũng không.
  • API public, webhook, dịch vụ nhận file nén, app gọi API bên ngoài bằng fetch(), requests hoặc httpx → coi là có rủi ro cao. Đây là phần lớn app SaaS, app bán hàng và microservice ở Việt Nam.
  • Đừng chỉ nhìn bản vá của hệ điều hành: Docker image của bạn đã chứa sẵn bản Brotli lỗi.

Hai ngoại lệ hay bị nhầm: PHP chỉ bị ảnh hưởng ở bản build cho Windows có Brotli riêng (đã vá 8.2.35-1, 8.3.36-1, 8.4.27-1, 8.5.12-1); PHP nền tảng khác chỉ bị nếu lib hệ thống lỗi. Còn .NET Framework không bị ảnh hưởng, và decompression của ASP.NET Core cùng HttpClient auto-decompress đều tắt mặc định.

Câu hỏi thường gặp

Tôi dùng Node.js có bị không? Phụ thuộc vào dữ liệu nén, không phụ thuộc bạn có ghi Brotli trong code hay không.

Node.js server trần có bị không? Không, server trần không tự decode. Nhưng Express 5 thì có.

AI có tự vá giúp được không? AI có thể tìm và đề xuất bản vá, nhưng xác minh, build, deploy, theo dõi vẫn cần của đội ngũ. Bài 5 việc văn phòng giao cho AI agent nói rõ hơn về ranh giới này.

Đây có giống lỗ hổng PHP2Shell không? Không. Bài cập nhật PHP2Shell đã nói về lỗi trong chính runtime PHP; lỗi này nằm ở thư viện nén và có AI tham gia phát hiện.

Bảng phiên bản được kiểm tra ngày 28/10/2026.

Nguồn tham khảo

  1. CVE-2026-111497, MITRE CVE (10/2026) — https://www.cve.org/CVERecord?id=CVE-2026-111497
  2. Wednesday, October 21, 2026 Security Releases, Node.js (10/2026) — https://nodejs.org/en/blog/vulnerability/october-2026-security-releases
  3. CISA Adds Two Known Exploited Vulnerabilities to Catalog, CISA (10/2026) — https://www.cisa.gov/news-events/alerts/2026/10/27/cisa-adds-two-known-exploited-vulnerabilities-catalog
  4. Brotli2Shell: FAQ for Google Brotli decoder CVE-2026-111497, Tenable (10/2026) — https://www.tenable.com/blog/brotli2shell-frequently-asked-questions-for-google-brotli-decoder-cve-2026-111497
  5. Broccoli2shell: Everything You Need To Know, Wiz (10/2026) — https://www.wiz.io/blog/cve-2026-111497-brotli-rce-node-js
  6. CISA Warns of Node2Shell Exploitation as Honeypots Log Attack Attempts, SecurityWeek (10/2026) — https://www.securityweek.com/cisa-warns-of-node2shell-exploitation-as-honeypots-log-attack-attempts

Leave a Reply