Bảo mật & quyền riêng tư

Lỗ hổng nghiêm trọng trong trình giải mã Brotli cho phép thực thi mã từ xa trên Node.js, Bun và Python

Một lỗi hỏng bộ nhớ trong thư viện C Brotli của Google, được theo dõi với mã CVE-2026-111497, cho phép thực thi mã từ xa trên nhiều môi trường chạy (runtime), bao gồm Node.js và Bun.

Hình minh họa lỗ hổng nén dữ liệu gây rò rỉ bộ nhớ
Minh họa được tạo riêng cho bài viết này

Được dịch tự động từ bản gốc tiếng Anh.

Một lỗ hổng hỏng bộ nhớ nghiêm trọng trong thư viện nén Brotli của Google đã khiến các ngăn xếp phần mềm phổ biến bị lộ trước nguy cơ thực thi mã từ xa. Được công bố vào ngày 21 tháng 10 năm 2026, lỗ hổng này ảnh hưởng đến Node.js, Bun, các gói Python và các proxy hạ tầng như Envoy và Istio. Mặc dù chưa có báo cáo về các cuộc tấn công đang diễn ra, các nhà nghiên cứu đã thành công trong việc chứng minh khả năng thực thi mã trên các bản dựng Node.js chưa được vá.

Chuyện gì đã xảy ra

Lỗ hổng, được theo dõi với mã CVE-2026-111497, nằm trong đoạn mã C chịu trách nhiệm giải mã dữ liệu nén Brotli. Vì nhiều ứng dụng và môi trường chạy đóng gói riêng bản sao của trình giải mã này, lỗi sẽ lan truyền độc lập qua các hệ sinh thái khác nhau. Google đã gán mức độ nghiêm trọng là critical (nghiêm trọng) với điểm 9.2 trên thang đo CVSS 4.0, trong khi Node.js phân loại nó là high (cao) và Red Hat là important (quan trọng). Nguyên nhân gốc rễ thực tế đã được vá trong mã nguồn Brotli vào ngày 27 tháng 2, nhưng bản vá không được phát hành cho đến ngày 21 tháng 10 vì ban đầu các nhà phát triển không nhận ra đây là một lỗ hổng bảo mật.

Đội Red Team của Imperva đã chứng minh rằng kẻ tấn công có thể thực thi mã tùy ý trên bản dựng Node.js 24.22.0 nguyên bản chạy trên Linux ARM64. Họ đạt được điều này bằng cách gửi dữ liệu nén được thiết kế đặc biệt thông qua phản hồi fetch hoặc body của yêu cầu Express. Mặc dù kỹ thuật khai thác này đòi hỏi nhiều lần thử và chưa được công bố rộng rãi, nó xác nhận rằng rủi ro lý thuyết là hoàn toàn khả thi. Đội Codex Security của OpenAI, những người đã báo cáo lỗ hổng, lưu ý rằng vấn đề hoạt động theo cả hai chiều: máy khách độc hại có thể xâm nhập máy chủ, và máy chủ độc hại có thể xâm nhập máy khách.

Cơ chế hoạt động

Brotli là một thuật toán nén do Google phát triển để giảm kích thước lưu lượng web. Lỗ hổng là một lỗi đọc và ghi đè vượt giới hạn bộ đệm (buffer over-read and overwrite) trong trình giải mã. Khi một chương trình xử lý dữ liệu Brotli được thiết kế đặc biệt, trình giải mã sẽ ghi dữ liệu vượt quá cuối bộ nhớ bộ đệm đã được cấp phát. Sự hỏng bộ nhớ này có thể dẫn đến sụp đổ ứng dụng, rò rỉ dữ liệu hoặc thực thi các chỉ thị do kẻ tấn công kiểm soát. Vì lỗi tồn tại trong thư viện C nền tảng, bất kỳ phần mềm nào liên kết hoặc đóng gói các phiên bản dễ bị tổn thương của mã Brotli từ Google đều thừa hưởng rủi ro này.

Mức độ phơi nhiễm phụ thuộc vào việc phần mềm có chủ động giải mã các luồng Brotli không đáng tin cậy hay không. Trong Node.js và Bun, điều này xảy ra khi sử dụng API fetch() tích hợp sẵn để lấy các phản hồi có tiêu đề Content-Encoding: br, hoặc khi các middleware như Express 5 và body-parser 2 giải nén body của yêu cầu. Trong Python, rủi ro rộng hơn; nếu các gói Brotli hoặc brotlicffi được cài đặt, các HTTP client như requests, urllib3 và httpx có thể tự động giải mã các phản hồi Brotli mà không cần sự can thiệp rõ ràng từ nhà phát triển. Các công cụ hạ tầng như Envoy và Istio chỉ bị ảnh hưởng nếu tính năng giải nén Brotli được bật rõ ràng trong cấu hình của chúng.

Chi tiết chính

  • Mã định danh CVE: CVE-2026-111497.
  • Các phiên bản Node.js bị ảnh hưởng: 22.x, 24.x và 26.x trước khi có bản sửa lỗi; các phiên bản 20.x và cũ hơn đã hết vòng đời hỗ trợ (end-of-life).
  • Các phiên bản Node.js đã được sửa lỗi: 22.23.4, 24.22.1 và 26.12.1.
  • Các phiên bản Bun bị ảnh hưởng: 1.4.3 trở về trước; đã được sửa trong phiên bản 1.4.4.
  • Các gói Python bị ảnh hưởng: Brotli phiên bản 1.2.0 trở về trước, brotlicffi phiên bản 1.2.0.x trở về trước; đã được sửa trong phiên bản 1.2.1 và 1.2.1.0 tương ứng.
  • Hạ tầng: Envoy và Istio chỉ bị ảnh hưởng nếu tính năng giải nén Brotli được cấu hình và bật.

Tại sao điều này quan trọng

Đối với các đội ngũ kỹ sư, lỗ hổng này làm nổi bật những rủi ro ẩn chứa trong các phụ thuộc chuyển tiếp (transitive dependencies) và các thư viện C được đóng gói kèm. Khác với các lỗ hổng điển hình trong các gói JavaScript, lỗi này nằm ngay trong môi trường chạy (runtime) itself. Việc cập nhật một phụ thuộc trong package.json là không đủ nếu môi trường chạy Node.js hoặc Bun nền tảng vẫn chưa được vá. Hơn nữa, các nhà phát triển Python có thể bị ảnh hưởng ngay cả khi họ không trực tiếp import thư viện Brotli, vì các HTTP client phổ biến tự động kéo thư viện này vào. Điều này tạo ra một bề mặt tấn công thầm lặng mà các trình quét phụ thuộc tiêu chuẩn có thể bỏ sót nếu chúng không kiểm tra các liên kết C ở cấp hệ thống hoặc cấp chuyển tiếp.

Việc chậm trễ trong việc phát hành bản vá cũng nhấn mạnh khoảng trống trong quy trình bảo trì mã nguồn mở. Thay đổi mã đã tồn tại trong nhiều tháng mà không có bản phát hành, khiến các hệ thống vẫn bị phơi nhiễm mặc dù bản vá đã được viết xong. Kịch bản này gây phức tạp cho quy trình phản ứng sự cố, vì các đội ngũ không thể chỉ dựa vào các cảnh báo tự động từ các kho đăng ký gói (package registries). Việc xác minh thủ công các phiên bản runtime và hình ảnh container giờ đây là cần thiết, đặc biệt đối với các dịch vụ xử lý dữ liệu bên ngoài hoặc đóng vai trò là máy khách kết nối tới các máy chủ khác.

Bạn có thể làm gì

  • Cập nhật Node.js lên phiên bản 22.23.4, 24.22.1 hoặc 26.12.1, và Bun lên phiên bản 1.4.4 trở lên.
  • Nâng cấp gói Python Brotli lên phiên bản 1.2.1 và brotlicffi lên phiên bản 1.2.1.0, hoặc gỡ cài đặt chúng nếu không thực sự cần thiết.
  • Khởi động lại tất cả các dịch vụ và xây dựng lại hình ảnh container sau khi cập nhật, vì các tiến trình đang chạy vẫn giữ thư viện cũ dễ bị tổn thương trong bộ nhớ.
  • Nếu không thể cập nhật ngay lập tức, hãy cấu hình các proxy để từ chối các yêu cầu có tiêu đề Content-Encoding: br trước khi chúng tiếp cận ứng dụng.
  • Tắt tính năng giải mã Brotli tự động trong các HTTP client và loại bỏ br khỏi các tiêu đề Accept-Encoding khi khả thi, tuy nhiên lưu ý rằng máy chủ vẫn có thể gửi nội dung dạng Brotli.
  • Xác minh thủ công các phiên bản đã cài đặt của các gói Python, vì các trình quét phụ thuộc như Dependabot có thể chưa đánh dấu cờ các gói PyPI cụ thể liên quan đến CVE này.
  • #security
  • #nodejs
  • #python
  • #vulnerability
  • #brotli

Công cụ từ cửa hàng Bytechap

Đọc tiếp

Tất cả bài viết