Node2Shell lan rộng thành HTTP2Shell: Lỗ hổng Brotli ảnh hưởng hàng loạt thư viện và ứng dụng HTTP
Lỗ hổng nghiêm trọng CVE-2026-111497 trong thư viện nén Brotli của Google, ban đầu được công bố với tên Node2Shell, nay đã lan rộng thành HTTP2Shell khi ảnh hưởng đến Python, C++, Bun, Envoy, Istio và nhiều ứng dụng HTTP khác. Với điểm CVSS 9.2, lỗ hổng cho phép kẻ tấn công từ xa thực thi mã tùy ý, và các đội ngũ phát triển cần nâng cấp khẩn cấp hoặc tạm thời vô hiệu hóa giải mã Brotli.

Node2Shell lan rộng thành HTTP2Shell: Lỗ hổng Brotli ảnh hưởng hàng loạt thư viện và ứng dụng HTTP
Một lỗ hổng nghiêm trọng trong thư viện nén Brotli của Google đang cho thấy phạm vi ảnh hưởng lớn hơn nhiều so với dự đoán ban đầu. Sau khi Node.js công bố vào ngày 21/10, sự cố mang tên Node2Shell đã nhanh chóng lan sang Python, C++, Bun, Envoy, Istio và vô số ứng dụng sử dụng giao thức HTTP.
Node.js - runtime bị ảnh hưởng nặng nề bởi lỗ hổng
Lỗ hổng Brotli CVE-2026-111497 là gì?
Brotli là thuật toán nén không mất dữ liệu do Google phát triển, được sử dụng rộng rãi để nén nội dung web như HTML, CSS và JavaScript trước khi truyền qua internet. Chính vì mức độ phổ biến này mà khi lỗ hổng xuất hiện, phạm vi ảnh hưởng trở nên cực kỳ rộng.
CVE-2026-111497 là lỗi ghi ngoài biên (out-of-bounds write) trong bộ giải mã Brotli, ảnh hưởng đến các phiên bản từ 1.0.3 đến 1.2.0 trên mọi nền tảng. Kẻ tấn công không cần xác thực từ xa có thể gửi một luồng dữ liệu Brotli được chế tạo đặc biệt để làm hỏng bộ nhớ, rò rỉ dữ liệu nhạy cảm, gây sập tiến trình hoặc thậm chí thực thi mã tùy ý.
Lỗ hổng được chấm điểm CVSS 4.0 là 9.2 (Mức nghiêm trọng). Đáng chú ý, OpenAI cho biết họ đã phát hiện ra vấn đề này từ tháng 2/2026, nhưng lúc đó chưa được nhận diện như một lỗ hổng bảo mật. Mã nguồn gốc của Brotli đã được vá từ thời điểm đó, nhưng chưa có bản phát hành nào đóng gói bản vá cho đến nay.
Nguyên nhân kỹ thuật
Lỗi nằm trong hàm DecodeBlockTypeAndLength(), xử lý các điểm chuyển khối khi luồng Brotli thay đổi cây Huffman đang sử dụng. Ở các phiên bản dễ bị tổn thương, hàm này trả về một giá trị boolean đơn giản, và BROTLI_FALSE có thể mang nghĩa "luồng dữ liệu bị lỗi định dạng" hoặc "cần thêm dữ liệu đầu vào". Lập trình viên gọi hàm không thể phân biệt hai trường hợp này, và trên đường xử lý nhanh, bộ giải mã còn bỏ qua hoàn toàn giá trị trả về.
Một luồng dữ liệu được chế tạo có thể khai báo một loại khối duy nhất rồi làm cạn độ dài của khối đó, buộc phải chuyển khối nhưng không thể thành công. Kết quả là bộ giải mã hoặc báo cần thêm dữ liệu cho một luồng đã hoàn chỉnh, hoặc tiếp tục giải mã với trạng thái khối cũ — dẫn đến lỗi ghi ngoài biên.
Bản vá gốc (commit
0ed4268của Google) khiến hàm trả về mã lỗi và thêm lỗi mớiBROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17). Quá trình giải mã giờ đây dừng lại khi gặp lỗi định dạng trên cả hai đường xử lý.
Phạm vi ảnh hưởng mở rộng
Điều khiến sự cố này đáng lo ngại là Brotli xuất hiện như một phụ thuộc bắc cầu (transitive dependency) trong rất nhiều dự án. Riêng gói Brotli trên PyPI đã có 82,8 triệu lượt tải mỗi tháng.
Các thư viện HTTP phổ biến như requests, httpx, aiohttp, urllib3 và Scrapy sẽ tự động tải và sử dụng Brotli nếu gói này có mặt trong môi trường. Nghĩa là ứng dụng của bạn có thể bị tấn công dù không hề import Brotli trong mã nguồn.
Minh họa quy trình và các thành phần bị ảnh hưởng
Dữ liệu của kẻ tấn công có thể tiếp cận bộ giải mã qua hai con đường:
- Yêu cầu gửi đi (Outbound): Ứng dụng của bạn tải một phản hồi Brotli từ máy chủ do kẻ tấn công kiểm soát, chẳng hạn qua webhook, tính năng xem trước URL hoặc trình thu thập dữ liệu.
- Yêu cầu nhận vào (Inbound): Framework hoặc middleware giải mã phần thân yêu cầu được gửi với header
Content-Encoding: br.
Các phiên bản đã được vá
| Dự án | Phiên bản đã vá | Ghi chú |
|---|---|---|
| Node.js | 22.23.4 · 24.22.1 · 26.12.1 | Dùng nhánh được hỗ trợ |
| Bun | 1.4.4 | Bao gồm Brotli 1.2.1 |
| Envoy | 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 | Nhánh 1.36 không còn được hỗ trợ |
| Istio | 1.29.9 · 1.30.6 · 1.31.2 | Nhánh 1.29 đã hết vòng đời |
| Google Brotli (gốc) | 1.0.10 · 1.1.1 · 1.2.1 | Chọn theo nhánh thư viện |
| Python Brotli | 1.2.1 | Trên PyPI |
| brotlicffi | 1.2.1.0 | Trên PyPI |
Đáng chú ý, Apache với mod_brotli tiêu chuẩn không giải mã Brotli, và Nginx cũng không giải mã Brotli theo mặc định, nên hai máy chủ này ít bị ảnh hưởng hơn.
Khuyến nghị khắc phục cho đội ngũ phát triển tại Việt Nam
Nếu chưa thể nâng cấp ngay, các biện pháp giảm thiểu tạm thời sau đây nên được áp dụng:
- Với ứng dụng Python: Gỡ cài đặt cả
Brotlivàbrotlicffikhỏi môi trường bị ảnh hưởng, loại bỏ các dependency extras nhưhttpx[brotli], sau đó tạo lại lockfile và khởi động lại workload. Các thư viện HTTP sẽ tự động chuyển về gzip và deflate. - Với yêu cầu nhận vào: Từ chối các yêu cầu có
Content-Encodingchứabrtại reverse proxy, load balancer hoặc middleware — trước khi bất kỳ bộ giải mã dễ tổn thương nào xử lý phần thân. - Với yêu cầu gửi đi: Loại bỏ
brkhỏi headerAccept-Encodingvà vô hiệu hóa giải mã phản hồi Brotli.
Lưu ý quan trọng: Chỉ thay đổi
Accept-Encodinglà chưa đủ. Máy chủ độc hại vẫn có thể gửi phản hồi Brotli bất kể client quảng cáo header gì, vàurllib3chọn bộ giải mã dựa trên headerContent-Encodingcủa phản hồi.
Một điểm đáng lưu ý cho các đội ngũ DevSecOps: tính đến ngày 23/10, các cơ sở dữ liệu advisory chưa ánh xạ CVE này tới hai gói PyPI, nên các công cụ như pip-audit, Dependabot và Safety sẽ chưa cảnh báo các phiên bản dễ bị tổn thương. Các nhóm cần kiểm tra thủ công bằng lệnh pip show Brotli brotlicffi và rà soát toàn bộ cây phụ thuộc.
Công cụ tự động hóa và quản lý phụ thuộc cần được cập nhật
Bối cảnh và tác động dài hạn
Sự việc Node2Shell tiến hóa thành HTTP2Shell là lời nhắc nhở về rủi ro chuỗi cung ứng phần mềm — khi một thư viện nén tưởng chừng nhỏ bé nhưng phổ biến lại có thể tạo ra lỗ hổng thực thi mã từ xa trên hàng triệu hệ thống. Với các doanh nghiệp Việt Nam đang vận hành hạ tầng cloud, API gateway và microservices, việc rà soát các thành phần phụ thuộc bắc cầu và thiết lập quy trình vá bảo mật nhanh là ưu tiên hàng đầu.
Theo báo cáo của The Hacker News, tính đến ngày 22/10 chưa ghi nhận khai thác trong thực tế, nhưng giới chuyên gia khuyến cáo nên xử lý như trường hợp khẩn cấp, bởi đây là lỗi an toàn bộ nhớ trong thành phần xử lý dữ liệu mạng không đáng tin cậy, và bản vá chỉ là một bước nâng cấp phiên bản thông thường. Các dịch vụ gọi tới máy chủ bên ngoài hoặc chấp nhận phần thân yêu cầu nén nên được ưu tiên vá trước.


