Vẫn đang dùng Node.js 20? Bản cập nhật bảo mật ngày 11/11 sẽ không vá lỗi cho bạn

Node.js 20 đã chính thức ngừng hỗ trợ (End-of-Life) vào ngày 30 tháng 4 năm 2026, và bản phát hành bảo mật ngày 11 tháng 11 sẽ bỏ qua phiên bản này. Hãy cùng xem phiên bản này đã bỏ lỡ những gì, nên nâng cấp lên 24 hay 26, những thay đổi nào có thể gây lỗi, và bạn nên làm gì nếu chưa thể di...

Ashley Innocent

Ashley Innocent

5 tháng 11 2026

Vẫn đang dùng Node.js 20? Bản cập nhật bảo mật ngày 11/11 sẽ không vá lỗi cho bạn

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Node.js 20 sẽ không nhận được bất kỳ bản cập nhật nào vào ngày 11 tháng 11 năm 2026. Đợt phát hành bảo mật này chỉ dành riêng cho các phiên bản 26.x, 24.x và 22.x, bởi vì Node.js 20 đã chính thức chạm mốc End-of-Life (ngừng hỗ trợ) vào ngày 30 tháng 4 năm 2026. Bản vá cuối cùng dành cho phiên bản này là 20.20.2, được build vào ngày 24 tháng 3. Kể từ đó, đã có 33 lỗ hổng CVE được công bố mà không hề có bất kỳ bản build nào cho nhánh 20.x. Hãy nâng cấp lên Node.js 24 hoặc 26 ngay trong tuần này.

33 CVE kể trên xuất hiện trong ba đợt phát hành bảo mật hoàn toàn bỏ qua Node.js 20. Đợt thứ tư chỉ còn vài ngày nữa là ra mắt, và thông báo trước (pre-announcement) đã đánh giá mức độ nghiêm trọng của lỗ hổng tồi tệ nhất ở mức CAO (HIGH) trên tất cả các phiên bản còn được hỗ trợ.

Đợt phát hành ngày 11 tháng 11 có gì và vì sao Node.js 20 bị bỏ lại?

Dự án Node.js sẽ tung ra các bản build mới cho các nhánh 26.x, 24.x và 22.x vào (hoặc ngay sau) thứ Tư, ngày 11 tháng 11 năm 2026. Chi tiết về các CVE hiện vẫn chưa được công bố công khai và sẽ được giữ kín cho đến khi các bản build chính thức ra mắt. Bài hướng dẫn đếm ngược đến bản phát hành tháng 11 của chúng tôi đã đề cập chi tiết về việc rà soát runtime và các lệnh cần chạy trong ngày phát hành bản vá, vì vậy bài viết này sẽ bỏ qua các nội dung đó.

Node.js 20 không có tên trong danh sách vì dự án đã ngừng bảo trì phiên bản này. Trang thông tin End-of-Life đã nêu rõ một thực tế rõ ràng: khi các bản phát hành bảo mật mới công bố lỗi, “ngay cả khi các lỗ hổng tương tự ảnh hưởng đến những phiên bản đã EOL, thì cũng sẽ không có bất kỳ bản phát hành mới nào dành cho chúng.”

Bản khuyến cáo bảo mật còn nhấn mạnh một điểm rất đáng lưu tâm: “Các phiên bản End-of-Life luôn bị ảnh hưởng mỗi khi có một đợt phát hành bảo mật diễn ra.”

Những bản vá bảo mật mà Node.js 20 đã bỏ lỡ

Đã có ba đợt phát hành bảo mật được tung ra kể từ khi Node.js 20 chính thức chạm mốc End-of-Life. Không có đợt nào phát hành bản build cho 20.x.

Thông báo bảo mật Số CVE Cao Trung bình Thấp Đã vá trong phiên bản
18 tháng 6, 2026 12 2 6 4 26.3.1, 24.17.0, 22.23.0
29 tháng 7, 2026 11 3 5 3 26.5.1, 24.18.1, 22.23.2
21 tháng 10, 2026 10 4 3 3 26.12.1, 24.22.1, 22.23.4
Tổng cộng 33 9 14 10 Không có bản build 20.x

Những phần mã nguồn được vá lại chính là những phần mà một máy chủ API phải chạy liên tục mỗi ngày:

Hãy đọc kỹ danh sách đó. Đội ngũ phát triển dự án không đánh giá các phiên bản đã End-of-Life, vì vậy các thông báo bảo mật chỉ liệt kê những phiên bản còn được hỗ trợ. Một số lỗi trong số này nằm trong phần mã nguồn mà Node.js 20 có thể không có: ví dụ, một CVE trong tháng 10 là lỗi hồi quy (regression) mà dự án xác định chỉ ảnh hưởng riêng tới 26.x và 24.x. Do đó, tình trạng thực tế của từng CVE trên Node.js 20 chính là chưa được vá và chưa được đánh giá. Không một ai dám khẳng định rằng bạn an toàn, và cũng chẳng có ai kiểm tra điều đó giúp bạn cả.

Mọi chuyện càng tồi tệ hơn khi các lỗi có tính liên hoàn (bug chains). Bản vá DNS trong tháng 10 là để hoàn thiện một bản vá từ tháng 6, và một bản vá trong tháng 7 cũng bổ sung cho một bản vá khác của tháng 6. Mỗi bản vá về sau đều được xây dựng dựa trên những bản vá trước đó mà bạn chưa hề có.

Timeline of Node.js 20: last build on March 24, 2026, End-of-Life on April 30, then security releases on June 18, July 29 and October 21 with no 20.x fix, and the November 11 release still pending

“Nhưng nó vẫn hoạt động bình thường mà”

Đúng là nó vẫn chạy. Và đó mới chính là vấn đề.

Một runtime đã End-of-Life không tự nhiên ngừng hoạt động. Lệnh node -v vẫn in ra đúng phiên bản đó, các bài test của bạn vẫn vượt qua, và dashboard giám sát vẫn hiển thị màu xanh an toàn. Rủi ro thực sự lại tiềm ẩn ở những nơi bạn ít ngờ tới nhất:

Chọn phiên bản mục tiêu: Node.js 24 hoặc 26, đừng chọn 22

Hãy chuyển sang bản 24 ngay trong tuần này nếu bạn muốn lộ trình ngắn nhất. Hãy chọn bản 26 nếu bạn có thể xử lý các API bị loại bỏ ngay từ bây giờ và muốn có chu kỳ hỗ trợ dài nhất. Hãy bỏ qua bản 22: dù phiên bản này vẫn nhận được bản vá tháng 11, nhưng vòng đời của nó sẽ kết thúc vào ngày 30 tháng 4 năm 2027 — tức là chưa đầy sáu tháng nữa — và bạn sẽ lại phải lặp lại toàn bộ quá trình nâng cấp này vào mùa xuân tới.

Nhánh Trạng thái Mới nhất tính đến 5/11 Thời điểm hết hạn hỗ trợ Phù hợp nhất cho
26.x “Lithium” Active LTS từ ngày 28/10/2026 26.13.0 30/04/2029 Các dịch vụ mà bạn có thể kiểm thử toàn diện ngay lúc này
24.x “Krypton” Maintenance LTS từ ngày 20/10/2026 24.22.2 30/04/2028 Lựa chọn an toàn và nhanh nhất để rời khỏi bản 20
22.x “Jod” Maintenance LTS 22.23.4 30/04/2027 Không đáng để nâng cấp ở thời điểm hiện tại

Các mốc thời gian được lấy từ lịch phát hành của Node.js. Hãy kiểm tra nền tảng hạ tầng của bạn trước khi đưa ra quyết định cuối cùng. Chẳng hạn trên AWS Lambda, runtime Node.js 26 hiện mới ở giai đoạn public preview và chưa được cam kết theo SLA của Lambda, vì vậy Node.js 24 vẫn là lựa chọn an toàn hơn cho môi trường production ở thời điểm hiện tại.

Bar chart of Node.js support windows from November 2026: 22.x ends April 30, 2027, 24.x ends April 30, 2028, and 26.x ends April 30, 2029

Các bước di chuyển và những điểm có thể gây lỗi

Mọi thông tin trong bảng dưới đây đều được tổng hợp từ ghi chú phát hành chính thức của các phiên bản 22.0.0, 24.0.0, 25.0.0, và 26.0.0, cùng với hướng dẫn di chuyển từ v22 sang v24. Đây là bản tóm lược dành riêng cho các dịch vụ API, chứ không phải toàn bộ changelog đầy đủ.

Xuất hiện từ Thay đổi Đối tượng bị ảnh hưởng
22 import ... assert { type: 'json' } removed; use with Mã nguồn ESM có import JSON
22 crypto.createCipher() and createDecipher() removed Mã nguồn mã hóa cũ (legacy encryption code)
23 and 24 No prebuilt 32-bit Windows or 32-bit armv7 Linux binaries; macOS 13.5 minimum Các máy chủ đời cũ và thiết bị biên (edge boxes)
24 OpenSSL 3.5 at security level 2: RSA, DSA, and DH keys under 2048 bits, ECC keys under 224 bits, and RC4 are prohibited Kết nối mTLS và các upstream cũ
24 tls.createSecurePair removed; url.parse() runtime-deprecated Mã nguồn xử lý mạng đời cũ
24 Stricter fetch() compliance, AbortSignal validation, stream and pipe errors now throw HTTP client, proxy
24 V8 13.6; addons may need C++20 Các native module
25 (if targeting 26) SlowBuffer and fs.F_OK, R_OK, W_OK, X_OK removed; Corepack no longer ships Các tiện ích cũ, Yarn hoặc pnpm cài qua Corepack
25 (if targeting 26) IP address as TLS servername moved to End-of-Life Client kết nối trực tiếp qua địa chỉ IP
26 _stream_* modules and writeHeader() removed; module.register() runtime-deprecated; Undici 8 Mã nguồn stream đời cũ, custom loader

Mục thay đổi OpenSSL chính là thứ nguy hiểm ngầm. Code của bạn chẳng hề thay đổi gì, nhưng quá trình bắt tay (handshake) với hệ thống của đối tác đời cũ sẽ âm thầm thất bại trong quá trình runtime.

Trên một nhánh git riêng, hãy cập nhật .nvmrc, engines, Dockerfile và cấu hình CI sang phiên bản mục tiêu (nếu cài đặt trên máy mới tinh, hãy tham khảo hướng dẫn cài đặt Node.js). Sau đó, hãy cài đặt lại dependencies để rebuild lại các native module, quét tìm các API đã bị loại bỏ, chạy các codemod chính thức, rồi khởi động dịch vụ với cờ theo dõi cảnh báo deprecation:

nvm install 24 && nvm use 24
rm -rf node_modules && npm ci

grep -rnE "assert \{ *type|createCipher\(|createDecipher\(|url\.parse\(|fs\.[FRWX]_OK|SlowBuffer|createSecurePair|_stream_[a-z]+|module\.register\(" \
  --include="*.js" --include="*.mjs" --include="*.ts" --exclude-dir=node_modules .

npx codemod run @nodejs/import-assertions-to-attributes
npx codemod run @nodejs/crypto-createcipheriv-migration
npx codemod run @nodejs/tls-create-secure-pair-to-tls-socket
npx codemod run @nodejs/fs-access-mode-constants

NODE_OPTIONS="--trace-deprecation" npm start

Hãy kiểm tra lại thủ công kết quả do codemod tạo ra. Bản codemod cho createCipher ghi chú rất rõ: đoạn mã mới được tạo ra sẽ không thể giải mã dữ liệu đã từng được mã hóa bằng API cũ, do đó bạn cần lên kế hoạch migrate dữ liệu nếu đang lưu trữ những dữ liệu như vậy.

Hiện tại trang chủ Node.js vẫn chưa có tài liệu hướng dẫn nâng cấp từ 24 lên 26, vì thế hãy tham khảo ghi chú phát hành của bản 25.0.0 và 26.0.0 cho bước nhảy này.

Đảm bảo API hoạt động đồng nhất trên phiên bản mới

Các bài unit test không thể phản ánh hết những tác động của một TLS stack và HTTP client mới lên lưu lượng truy cập thực tế. Đối với một bước nhảy vọt qua hai hoặc ba phiên bản major, bạn sẽ cần so sánh hành vi của dịch vụ trước và sau khi nâng cấp — và đây là nhiệm vụ lý tưởng dành cho các coding agent của bạn.

Apidog CLI cho phép Claude Code, Codex hoặc Cursor chạy trực tiếp các bộ test suite trên Apidog ngay từ terminal. Bạn chỉ cần thiết lập một lần duy nhất:

npm install -g apidog-cli@latest
apidog login --with-token <YOUR_TOKEN>
npx -y skills add https://apidog.com   # pick your agent when prompted

Sau đó, chỉ cần giao cho agent của bạn một prompt:

My service runs on Node.js 20 in staging. Run Apidog test suite <suiteId> in project
<projectId> against environment <envId> and save reports to reports/node20. When I
redeploy on Node.js 24, run the same suite into reports/node24. List every request
whose status, body, or TLS behavior changed. Then read the service logs for deprecation
warnings and check each failure against the 22, 24, and 25 release notes: removed APIs,
changed defaults, stricter fetch and AbortSignal handling, OpenSSL key size rejections.

Agent sẽ chạy cùng một bộ test suite cho cả hai giai đoạn trước và sau khi nâng cấp:

apidog run --test-suite <suiteId> --project <projectId> -e <envId> \
  -r cli,junit --out-dir reports/node20

# redeploy the service on the target line, restart it

apidog run --test-suite <suiteId> --project <projectId> -e <envId> \
  -r cli,junit --out-dir reports/node24

Có hai nguyên tắc giúp việc so sánh đạt độ tin cậy tuyệt đối:

Sau khi việc di chuyển hoàn tất thành công, hãy duy trì bước kiểm tra này trong quy trình CI/CD của bạn. Bài viết hướng dẫn về Apidog CLI CI/CD sẽ cung cấp quy trình chi tiết, còn hướng dẫn từng bước với Claude Code sẽ hướng dẫn cách thiết lập agent.

Nếu bạn chưa thể nâng cấp ngay trong tuần này

Mua các bản build đã được vá bảo mật. Trang thông tin End-of-Life của Node.js có nêu tên ba đối tác thông qua chương trình OpenJS Ecosystem Sustainability Program. HeroDevs cung cấp gói Never-Ending Support kèm theo các bản vá bảo mật. TuxCare với gói Endless Lifecycle Support chuyên backport các bản sửa lỗi cho các phiên bản đã End-of-Life. NodeSource cung cấp dịch vụ đánh giá và hỗ trợ nâng cấp. Dự án Node.js gọi đây là giải pháp tạm thời, và bản chất của nó đúng là như vậy.

Thu hẹp phạm vi tiếp cận tới tiến trình. Những biện pháp sau đây giúp giảm nguy cơ tiếp xúc với các nhóm lỗ hổng kể trên, nhưng chúng không thực sự sửa chữa bất kỳ lỗi nào:

Ghi chép và quản lý rủi ro rõ ràng. Hãy chỉ định rõ người chịu trách nhiệm, ấn định thời hạn nâng cấp và thiết lập các biện pháp kiểm soát bù đắp cụ thể, để từ “tạm thời” thực sự có điểm kết thúc.

button

FAQ

Node.js 20 còn được hỗ trợ không? Không. Phiên bản này đã chính thức End-of-Life vào ngày 30 tháng 4 năm 2026. Bản build cuối cùng là 20.20.2 phát hành ngày 24 tháng 3 năm 2026, và dự án sẽ không phát hành thêm bất kỳ bản nào khác.

Node.js 20 có dính các lỗ hổng trong đợt phát hành ngày 11 tháng 11 không? Hiện tại thông tin chi tiết về các CVE vẫn chưa được công bố công khai, nên chưa ai có thể khẳng định lỗ hổng nào sẽ ảnh hưởng. Tuy nhiên, thông báo bảo mật nhấn mạnh rằng các phiên bản End-of-Life luôn bị ảnh hưởng mỗi khi có một đợt phát hành bảo mật mới, và dự án không tiến hành đánh giá riêng cho từng phiên bản EOL.

Tôi có nên nâng cấp lên Node.js 22 thay thế không? Không nên. Dù đây là bước chuyển ngắn nhất, nhưng bản 22 sẽ kết thúc hỗ trợ vào ngày 30 tháng 4 năm 2027. Nâng cấp lên bản 24 sẽ cho bạn thêm một năm hỗ trợ, còn bản 26 sẽ mang lại thêm hai năm.

Nên chọn Node.js 24 hay 26? Hãy chọn bản 24 nếu bạn cần nâng cấp gấp ngay trong tuần này hoặc nền tảng triển khai của bạn chưa hỗ trợ đầy đủ bản 26. Hãy chọn bản 26 nếu bạn có điều kiện kiểm thử lại toàn bộ hệ thống ngay bây giờ, vì phiên bản này sẽ được hỗ trợ đến tận ngày 30 tháng 4 năm 2029.

Tôi đang dùng Node.js 25 thì bài viết này có áp dụng cho tôi không? Có. Node.js 25 đã chạm mốc End-of-Life từ ngày 1 tháng 6 năm 2026, với 25.9.0 là bản build cuối cùng. Phiên bản này cũng sẽ không nhận được bất kỳ bản vá nào trong đợt tháng 11, và chuyển lên 26 chỉ cách đúng một phiên bản major.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API