Bộ giải mã Brotli ghi ra ngoài bộ đệm: đường vào quan trọng hơn số phiên bản
Node.js và Bun mang sẵn bộ giải mã Brotli trong chương trình. Một máy chỉ bị chạm tới khi có dữ liệu nén br đi qua bộ giải mã đó — từ request của người lạ, từ phản hồi của một máy chủ khác, hoặc từ dữ liệu ứng dụng tự giải nén. Trang này nói đường nào, bản Brotli nào, và cách đo trên máy của bạn.
Chuyện gì xảy ra
Bộ giải mã Brotli của Google, các bản 1.0.3 tới 1.2.0, ghi ra ngoài vùng đệm khi giải nén từng phần một dòng dữ liệu dị dạng. Bản đã sửa: 1.0.10, 1.1.1 và 1.2.1.
CISA đưa lỗi vào danh sách lỗ hổng đang bị khai thác (KEV) từ 27/10/2026, nên đây không còn là lỗi lý thuyết.
Node.js và Bun biên dịch sẵn Brotli, nên bản vá đến từ bản phát hành của chính runtime. Node.js 18, 20, 23 và 25 không có bản vá: các nhánh đó đã hết hỗ trợ, và cách duy nhất là chuyển nhánh.
Đường vào
- Thân request có
Content-Encoding: br. Express 5 dùng body-parser 2 giải nén thân request do bất kỳ ai gửi tới, không cần đăng nhập. Express 4 dùng body-parser 1 trả về 415 và không giải nén. Cùng một máy chủ Node, hai mức phơi nhiễm khác nhau — và đây là khác biệt mà số phiên bản Node không nói được. - Phản hồi
brtừ máy chủ khác.fetch()giải nén phản hồi ứng dụng tải về. Nếu máy chủ nguồn bị chiếm hoặc cố tình trả dữ liệu dị dạng, lỗi xảy ra ở phía ứng dụng. - Giải nén do chính mã ứng dụng gọi.
zlib.brotliDecompresshaycreateBrotliDecompresstrên dữ liệu không tin cậy. - Lớp trước Node. Nếu proxy ngược hoặc CDN tự giải nén
brthì bộ giải mã của lớp đó mới là chỗ bị chạm, và phiên bản Node trên máy không nói gì về nó.
Bản Brotli nào
- Biên dịch sẵn trong runtime: bản tải từ nodejs.org hoặc bun.sh. Vá bằng cách nâng runtime, rồi khởi động lại dịch vụ.
- Liên kết thư viện hệ thống: gói
nodejscủa Ubuntu hoặc Debian liên kếtlibbrotli1. Vá bằngapt, rồi khởi động lại mọi tiến trình đang ánh xạ thư viện đó. Bản đã sửa: noble1.1.0-2ubuntu0.1, resolute1.2.0-3ubuntu0.1, trixie1.1.0-2+deb13u1, bookworm1.0.9-2+deb12u1. - Nằm trong ảnh container: ứng dụng mang runtime của riêng nó trong ảnh.
node -vtrên máy chủ không nói gì về nó; phải đo bên trong container, và ảnh phải được dựng lại hoặc kéo bản mới.
Đang chạy, không phải đã cài
- Nâng cấp xong, tiến trình đang chạy vẫn giữ bản cũ cho tới khi khởi động lại:
/proc/<pid>/exekết thúc bằng(deleted), hoặc/proc/<pid>/mapscòn dònglibbrotli… (deleted). - Vì vậy "đã cài bản vá" và "đang chạy bản vá" là hai câu hỏi khác nhau. Một máy đã
apt upgrademà chưa khởi động lại dịch vụ vẫn đang giải nén bằng bản lỗi.
Bản bị ảnh hưởng và bản vá
| Sản phẩm | CVE | Bản bị ảnh hưởng | Bản vá |
|---|---|---|---|
| Node.js | CVE-2026-111497 | 22.x · 24.x · 26.x | ^22.23.4 · ^24.22.1 · ^26.12.1 |
| Bun | CVE-2026-111497 | >=1.0.21 <1.4.4 | 1.4.4 |
Tóm tắt giữ nguyên tiếng Anh như trong cảnh báo gốc.
Mô tả gốc (Node.js · CVE-2026-111497): Node.js Brotli decoder out-of-bounds write permits remote code execution
Mô tả gốc (Bun · CVE-2026-111497): Bundled brotli decoder has an out-of-bounds write (CVE-2026-111497)
Cách xử lý
- Bản biên dịch sẵn: nâng Node.js lên 22.23.4, 24.22.1 hoặc 26.12.1 (Bun 1.4.4), rồi khởi động lại dịch vụ.
- Bản hệ thống: nâng
libbrotli1(hoặc nâng toàn bộ gói), rồi khởi động lại mọi tiến trình có ánh xạ thư viện đó. - Bản trong ảnh: dựng lại ảnh với runtime đã sửa, kéo ảnh mới,
compose up -d, rồi đo lại phiên bản bên trong container. - Chưa nâng được runtime: chặn
Content-Encoding: brở proxy cho tới khi vá, và không giải nénbrtừ nguồn không tin cậy.
Tự kiểm tra
node -v; bun -vCho biết: phiên bản runtime đang có trên máy
ldd $(command -v node) | grep -i brotliCho biết: có dòng libbrotli nghĩa là bản hệ thống, nên apt mới là đường vá; không có dòng nào nghĩa là biên dịch sẵn
npm ls express body-parserCho biết: Express 5 với body-parser 2 là đường vào thân request br; Express 4 thì không
dpkg -l libbrotli1Cho biết: bản thư viện hệ thống đang cài (Debian, Ubuntu)
ls -l /proc/$(pgrep -f 'node|bun' | head -1)/exeCho biết: tiến trình đang chạy tệp nào; (deleted) là bản cũ sau khi đã nâng cấp
docker exec <container> node -vCho biết: phiên bản trong ảnh, không phải trên máy chủ
Nguồn
- CVE-2026-111497 — Node.js
- CVE-2026-111497 — Bun
- CISA KEV catalog
- google/brotli releases
- Ubuntu CVE-2026-111497
- Debian security tracker CVE-2026-111497
Viết từ cảnh báo gốc và tài liệu của nhà phát hành; phiên bản lấy từ dữ liệu của trang, cập nhật 10/11/2026. Khi có khác biệt, cảnh báo gốc là chuẩn.