Node.js đã phát hành các bản cập nhật để khắc phục một vấn đề bảo mật nghiêm trọng được mô tả là ảnh hưởng đến "hầu hết mọi ứng dụng Node.js đang chạy sản xuất", mà nếu bị khai thác thành công, có thể gây ra tình trạng tấn công từ chối dịch vụ (DoS).
"Node.js/V8 đã nỗ lực hết sức để phục hồi sau tình trạng cạn kiệt không gian stack bằng một lỗi có thể bắt được, điều mà các framework đã tin cậy để đảm bảo tính khả dụng của dịch vụ," Matteo Collina và Joyee Cheung của Node.js cho biết trong một bản tin vào thứ Ba.
"Một lỗi chỉ xảy ra khi sử dụng async_hooks sẽ phá vỡ nỗ lực này, khiến Node.js thoát với mã 7 trực tiếp mà không ném ra một lỗi có thể bắt được khi các lệnh gọi đệ quy trong mã người dùng làm cạn kiệt không gian stack. Điều này làm cho các ứng dụng có độ sâu đệ quy được kiểm soát bởi đầu vào không được làm sạch dễ bị tấn công Denial-of-Service."
Về bản chất, lỗ hổng này xuất phát từ việc Node.js thoát với mã 7 (cho biết một Internal Exception Handler Run-Time Failure) thay vì xử lý ngoại lệ một cách linh hoạt khi xảy ra stack overflow trong mã người dùng trong khi async_hooks được bật. Async_hooks là một Node.js API cấp thấp cho phép nhà phát triển theo dõi vòng đời của các tài nguyên bất đồng bộ, chẳng hạn như truy vấn cơ sở dữ liệu, bộ hẹn giờ hoặc yêu cầu HTTP.
Vấn đề này, Node.js cho biết, ảnh hưởng đến một số framework và công cụ Application Performance Monitoring (APM), bao gồm React Server Components, Next.js, Datadog, New Relic, Dynatrace, Elastic APM và OpenTelemetry, do việc sử dụng AsyncLocalStorage, một thành phần được xây dựng dựa trên module async_hooks giúp lưu trữ dữ liệu trong suốt vòng đời của một hoạt động bất đồng bộ.
Nó đã được khắc phục trong các phiên bản sau -
- Node.js 20.20.0 (LTS)
- Node.js 22.22.0 (LTS)
- Node.js 24.13.0 (LTS)
- Node.js 25.3.0 (Current)
Vấn đề này cũng ảnh hưởng đến tất cả các phiên bản Node.js từ 8.x, là phiên bản đầu tiên có async_hooks, đến 18.x. Đáng chú ý là Node.js phiên bản 8.0.0, có tên mã Carbon, được phát hành vào ngày 30 tháng 5 năm 2017. Tuy nhiên, các phiên bản này không được vá lỗi vì chúng đã đạt trạng thái end-of-life (EoL).
Bản vá được triển khai phát hiện các lỗi stack overflow và ném lại chúng cho mã người dùng thay vì coi chúng là lỗi nghiêm trọng. Lỗi này đang được theo dõi dưới mã định danh CVE CVE-2025-59466 (điểm CVSS: 7.5). Mặc dù có tác động thực tế đáng kể, Node.js cho biết họ coi bản vá này chỉ là một biện pháp giảm thiểu do một vài lý do -
- Tình trạng cạn kiệt không gian stack không phải là một phần của đặc tả ECMAScript
- Công cụ JavaScript V8 không coi đây là một vấn đề bảo mật
- Những hạn chế với trình xử lý "uncaughtException", được thiết kế để sử dụng như một cơ chế cuối cùng để xử lý ngoại lệ
"Mặc dù đây là một bản sửa lỗi cho một hành vi không được chỉ định rõ ràng, chúng tôi đã chọn đưa nó vào bản phát hành bảo mật vì tác động rộng rãi của nó đối với hệ sinh thái," Node.js cho biết. "React Server Components, Next.js và hầu hết mọi công cụ APM đều bị ảnh hưởng. Bản sửa lỗi cải thiện trải nghiệm của nhà phát triển và giúp việc xử lý lỗi trở nên dễ đoán hơn."
Trước mức độ nghiêm trọng của lỗ hổng này, người dùng các framework/công cụ và nhà cung cấp dịch vụ lưu trữ máy chủ được khuyến nghị cập nhật càng sớm càng tốt. Các nhà bảo trì thư viện và framework được khuyến nghị áp dụng các biện pháp phòng thủ mạnh mẽ hơn để chống lại tình trạng cạn kiệt không gian stack và đảm bảo tính khả dụng của dịch vụ.
Thông báo này được đưa ra khi Node.js cũng phát hành các bản vá lỗi cho ba lỗ hổng nghiêm trọng khác (CVE-2025-55131, CVE-2025-55130 và CVE-2025-59465) có thể bị khai thác để rò rỉ hoặc hỏng dữ liệu, đọc các tệp nhạy cảm bằng cách sử dụng đường dẫn symbolic link (symlink) tương đối được tạo thủ công và kích hoạt tấn công từ chối dịch vụ từ xa, tương ứng.