Lỗ hổng nghiêm trọng trong trình giải mã Brotli ảnh hưởng đến Node.js, Python và các dịch vụ HTTP
CVE-2026-111497 cho phép thực thi mã từ xa thông qua các luồng dữ liệu Brotli được tạo ra một cách tinh vi trên các runtime chính. Các bản vá đã có sẵn cho Node.js, Python, Bun và Envoy.
Được dịch tự động từ bản gốc tiếng Anh.
Một lỗ hổng nghiêm trọng trong thư viện nén Google Brotli, được theo dõi với mã CVE-2026-111497, khiến các runtime phần mềm chủ chốt dễ bị tấn công thực thi mã từ xa. Được công bố vào ngày 23 tháng 10 năm 2026, lỗi này ảnh hưởng đến Node.js, Python, Bun và nhiều thành phần cơ sở hạ tầng như Envoy và Istio. Các nhà phát triển cần vá các thư viện bị ảnh hưởng hoặc vô hiệu hóa việc giải mã Brotli ngay lập tức để ngăn chặn nguy cơ máy chủ bị xâm nhập.
Chuyện gì đã xảy ra
Lỗ hổng này, ban đầu được gọi là "Node2Shell" khi Node.js công bố vào ngày 22 tháng 10, sau đó được xác định là có tác động rộng hơn đối với toàn bộ hệ sinh thái phần mềm. Nguyên nhân bắt nguồn từ một lỗi an toàn bộ nhớ trong trình giải mã Brotli, cho phép kẻ tấn công không cần xác thực làm hỏng bộ nhớ của tiến trình. Bằng cách gửi một luồng dữ liệu nén được thiết kế đặc biệt, kẻ tấn công có thể làm sập dịch vụ, rò rỉ thông tin nhạy cảm hoặc thực thi mã tùy ý. Hệ thống đánh giá điểm lỗ hổng chung (CVSS) phiên bản 4.0 xếp hạng vấn đề này ở mức 9.2, đánh dấu nó là nghiêm trọng.
OpenAI tiết lộ rằng họ đã tìm ra nguyên nhân gốc rễ vào tháng 2 năm 2026. Mặc dù lỗi cơ bản đã được sửa trong mã nguồn Brotli vào thời điểm đó, nhưng nó không được nhận diện là một lỗ hổng bảo mật, do đó chưa có bản phát hành vá nào được tung ra cho đến nay. Sự chậm trễ này có nghĩa là mọi dự án đóng gói riêng bản sao thư viện Brotli đều vẫn bị phơi nhiễm trong nhiều tháng. Tính đến ngày 23 tháng 10, các bản vá đã được phát hành cho libbrotli, Python, C++, Node.js, Bun và Envoy, với nhiều bản cập nhật khác dự kiến sẽ dành cho các ứng dụng phụ thuộc.
Cơ chế hoạt động
Brotli là một thuật toán nén không mất dữ liệu, được sử dụng rộng rãi để giảm kích thước nội dung web như HTML, CSS và JavaScript trong quá trình truyền tải HTTP. Lỗ hổng nằm trong hàm DecodeBlockTypeAndLength() bên trong trình giải mã. Hàm này xử lý các chuyển đổi khối (block switches), xảy ra khi luồng dữ liệu thay đổi cây Huffman mà nó sử dụng để giải nén. Trong các phiên bản dễ bị tổn thương (từ 1.0.3 đến 1.2.0), hàm này trả về một giá trị boolean đơn giản, không phân biệt được giữa một luồng dữ liệu sai định dạng và yêu cầu thêm dữ liệu đầu vào.
Các hàm gọi trên đường dẫn giải mã nhanh bỏ qua giá trị trả về này, dẫn đến trạng thái mà trình giải mã tiếp tục xử lý ngay cả khi nó nên dừng lại. Kẻ tấn công có thể khai thác điều này bằng cách tạo ra một luồng dữ liệu làm cạn kiệt độ dài của một khối và buộc phải chuyển đổi sang trạng thái không hợp lệ. Sau đó, trình giải mã thực hiện ghi ngoài phạm vi bộ nhớ (out-of-bounds write), tràn bộ đệm làm việc nhỏ và làm hỏng vùng bộ nhớ lân cận. Bản vá giới thiệu một mã lỗi cụ thể, BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH, đảm bảo trình giải mã dừng ngay lập tức khi gặp các lỗi định dạng như vậy.
Chi tiết quan trọng
- Phiên bản bị ảnh hưởng: Brotli từ 1.0.3 đến 1.2.0 trên tất cả các nền tảng.
- Phiên bản đã sửa lỗi: Brotli 1.2.1, 1.1.1 và 1.0.10; brotlicffi 1.2.1.0.
- Bản vá runtime: Node.js 22.23.4, 24.22.1, 26.12.1; Bun 1.4.4; Envoy 1.40.0, 1.39.3, 1.38.6, 1.37.8.
- Tác động lên Python: Các gói
Brotlivàbrotlicffibị ảnh hưởng nếu phiên bản 1.2.0 trở xuống được cài đặt. - Khoảng trống phát hiện: Cơ sở dữ liệu cảnh báo chưa ánh xạ CVE này tới các gói PyPI, vì vậy các công cụ như Dependabot có thể không tự động gắn cờ cảnh báo.
- Vector tấn công: Truy cập từ xa, không cần xác thực thông qua các yêu cầu hoặc phản hồi HTTP được tạo ra chứa dữ liệu Brotli độc hại.
Tại sao điều này quan trọng
Lỗ hổng này làm nổi bật những rủi ro liên quan đến các phụ thuộc bắc cầu (transitive dependencies) trong chuỗi cung ứng phần mềm hiện đại. Nhiều nhà phát triển không nhập trực tiếp Brotli vào mã của họ, tuy nhiên các client HTTP phổ biến như requests, httpx và urllib3 trong Python, hoặc fetch tích hợp sẵn trong Node.js, sẽ tự động tải thư viện này nếu nó tồn tại. Điều này có nghĩa là một ứng dụng có thể bị tổn thương mà không có bất kỳ tham chiếu trực tiếp nào đến thư viện trong mã nguồn. Tính chất tự động của các phụ thuộc này khiến việc đánh giá mức độ phơi nhiễm trở nên khó khăn nếu không kiểm tra sâu cây phụ thuộc.
Đối với các nhóm xây dựng dịch vụ mạng, tác động là rất nghiêm trọng vì bề mặt tấn công bao gồm cả lưu lượng đi vào và đi ra. Một client độc hại có thể nhắm mục tiêu vào máy chủ bằng cách gửi các phần thân yêu cầu được nén, trong khi một máy chủ độc hại có thể nhắm mục tiêu vào client bằng cách trả về các phản hồi được nén. Mô hình mối đe dọa hai chiều này đòi hỏi phải vá toàn diện tất cả các dịch vụ xử lý lưu lượng HTTP, bao gồm cả microservices nội bộ và API hướng ra ngoài. Sự chậm trễ trong việc nhận ra ý nghĩa bảo mật của bản sửa lỗi tháng Hai càng nhấn mạnh nhu cầu giám sát chặt chẽ các thay đổi của thư viện upstream.
Bạn có thể làm gì
- Nâng cấp runtime: Cập nhật Node.js lên 22.23.4, 24.22.1 hoặc 26.12.1, và Bun lên 1.4.4 trở lên.
- Cập nhật gói Python: Chạy
pip install -U "Brotli>=1.2.1"vàpip install -U "brotlicffi>=1.2.1.0"trong tất cả các môi trường. - Xây dựng lại container: Tạo lại các tệp khóa (lockfiles) và xây dựng lại hình ảnh container để đảm bảo các phiên bản đã vá được bao gồm trong các nghệ phẩm được triển khai.
- Vô hiệu hóa giải mã: Nếu không thể vá ngay lập tức, hãy vô hiệu hóa việc giải mã Brotli bằng cách loại bỏ
brkhỏi các tiêu đềAccept-Encodingvà từ chối các yêu cầu đến cóContent-Encoding: brở cấp proxy. - Xác minh phụ thuộc: Sử dụng
pipdeptreehoặc các công cụ tương tự để xác định những thư viện nào kéo Brotli vào như một phụ thuộc bắc cầu. - Theo dõi cảnh báo: Kiểm tra các bản tin bảo mật cụ thể của nhà cung cấp cho các gói hệ điều hành, vì chúng có thể backport các bản sửa lỗi mà không thay đổi số phiên bản upstream.



