Ngày 21/10/2026, Node.js phát hành các bản vá 26.12.1, 24.22.1 và 22.23.4 để sửa 10 lỗ hổng, nghiêm trọng nhất là CVE-2026-111497 — lỗi ghi ngoài vùng nhớ trong bộ giải mã Brotli có thể dẫn tới thực thi mã từ xa. Ngày 27/10, CISA đưa CVE này vào danh mục KEV (đang bị khai thác thực tế). Nếu bạn còn chạy Node.js 22, 24 hoặc 26 chưa vá, hãy nâng cấp ngay hôm nay.

Vì sao đáng đọc? Brotli là định dạng nén mà gần như mọi server và client HTTP đều dùng, và lỗi nằm ngay trong bộ giải mã C của Node.js.

Lỗ hổng Brotli hoạt động ra sao

CVE-2026-111497 là lỗi ghi ngoài vùng nhớ trong bộ giải mã Brotli do Google phát triển. Trên đường giải mã nhanh, bộ giải mã bỏ qua giá trị trả về của các hàm chuyển đổi block, coi luồng dữ liệu không hợp lệ như thể “cần thêm dữ liệu” thay vì báo lỗi — rồi tiếp tục ghi vào một bộ đệm nội bộ chỉ 8 byte, làm hỏng bộ nhớ của tiến trình. Hậu quả có thể là crash, rò rỉ bộ nhớ hoặc thực thi mã từ xa. Google chấm CVSS 4.0 là 9.2 (Critical), Node.js xếp hạng High.

Nhóm Imperva Red Team đã chứng minh khả thi trong phòng lab với tên gọi “Node2Shell”: trên image Node.js 24.22.0, ứng dụng thử nghiệm đã tạo ra một file mà code của nó không hề có lệnh tạo — và cùng input đó bị 24.22.1 chặn lại. Hai đường tấn công đã kiểm chứng là body request được Express 5 hoặc body-parser 2 tự động giải nén, và response mà fetch() tự động giải mã.

Cùng một lỗi lan khắp hệ sinh thái

Vì lỗi nằm ở thư viện Brotli gốc của Google, mọi phần mềm đóng gói bộ giải mã này đều dính: Bun (1.4.4); gói Python Brotli (1.2.1) và brotlicffi (1.2.1.0); Envoy, Istio và các bản vá ngoài lịch cho .NET, PHP Windows.

9 lỗ hổng còn lại

Cùng đợt vá còn sửa 9 lỗ hổng khác, trong đó 3 lỗi High liên quan tới cắt ngắn hostname bằng ký tự NUL trong dns.resolve*() và kiểm tra hostname TLS với địa chỉ IP viết không chuẩn. Cùng đợt vá cũng chặn chuỗi chứng chỉ qua khóa eMudhra bị lộ.

Cần làm gì ngay

  • Nâng cấp Node.js: 22.x lên 22.23.4, 24.x lên 24.22.1, 26.x lên 26.12.1.
  • Rebuild image container và ứng dụng đóng gói sẵn binary Node.
  • Rời khỏi các dòng đã hết hỗ trợ (20.x trở xuống) và cập nhật các bản sao Brotli khác.
  • Kiểm tra bằng node -v — đừng dựa vào process.versions.brotli vì Node.js không tăng số phiên bản này khi vá.

Điều này có ý nghĩa gì với bạn

Bài học lớn nhất của Node2Shell là rủi ro nằm ở tầng “vô hình”: bạn không viết code giải nén Brotli, nhưng Express, body-parser hay fetch() làm việc đó thay bạn. Checklist thực tế: ghim phiên bản Node.js trong Dockerfile và CI rồi bật Dependabot hoặc Renovate để báo bản vá bảo mật; rà soát image và dependency xem có đóng gói Brotli cũ không. Đừng để một bản vá “chỉ là patch version” nằm chờ đến sprint sau — CISA đã xác nhận lỗ hổng này đang bị khai thác ngoài thực tế.

Bài viết liên quan

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

Ứng dụng Node.js nào dễ bị tấn công nhất?

Các server dùng Express 5 hoặc body-parser 2, các ứng dụng dùng fetch() để gọi API bên ngoài, và các proxy/gateway giải nén Brotli.

Chỉ nâng cấp Node.js đã đủ chưa?

Chưa đủ nếu hệ thống còn các bản sao Brotli khác: gói Python, Bun, Envoy, Istio, image container cũ hoặc runtime .NET/PHP. Hãy rà soát toàn bộ và rebuild image sau khi vá.

Làm sao kiểm tra mình đã vá xong?

Chạy node -v và đối chiếu với 22.23.4, 24.22.1 hoặc 26.12.1.

💬 Tin này ảnh hưởng tới dự án của bạn thế nào? Chia sẻ góc nhìn của bạn trong phần bình luận — mình đọc hết và sẽ tổng hợp những ý hay nhất.

Nguồn tham khảo