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

Node.js vá các lỗi nghiêm trọng gây sập HTTP/2 và rò rỉ bộ nhớ TLS

Node.js đã phát hành các bản cập nhật bảo mật cho phiên bản 22, 24 và 26 để khắc phục 16 lỗ hổng, bao gồm các lỗi mức độ nghiêm trọng cao cho phép tấn công từ xa làm sập máy chủ và rò rỉ dữ liệu trong các máy chủ HTTP/2 và HTTPS.

Hình minh họa một máy chủ được bảo vệ bởi lá chắn chống rò rỉ dữ liệu
Ảnh minh họa tạo riêng cho bài viết

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

Dự án Node.js đã phát hành các bản vá bảo mật khẩn cấp cho các dòng runtime được hỗ trợ nhằm xử lý mười sáu lỗ hổng, một số trong đó gây ra rủi ro tức thì cho các máy chủ web. Bản cập nhật này áp dụng cho các phiên bản 22.23.5, 24.22.3 và 26.13.1, khắc phục các lỗi cho phép kẻ tấn công không cần xác thực vẫn có thể làm sập dịch vụ hoặc rò rỉ nội dung bộ nhớ nhạy cảm. Các bản vá này rất quan trọng đối với bất kỳ tổ chức nào đang chạy ứng dụng tự lưu trữ (self-hosted) trên các nhánh phát hành cụ thể này.

Chuyện gì đã xảy ra

Các vấn đề nghiêm trọng nhất liên quan đến việc triển khai HTTP/2 và HTTPS trong lõi Node.js. Một lỗi, được theo dõi dưới mã CVE-2026-123863, cho phép một client từ xa làm sập máy chủ HTTP/2 chỉ bằng cách gửi một yêu cầu mà máy chủ phản hồi trước khi toàn bộ phần thân của yêu cầu được nhận. Hành vi này được mô tả là điển hình đối với nhiều cấu hình mặc định, khiến phạm vi rộng lớn các hệ thống triển khai dễ bị tấn công từ chối dịch vụ (DoS) qua cả kết nối mã hóa và kết nối dạng văn bản thuần túy (cleartext).

Một lỗ hổng nghiêm trọng khác, CVE-2026-123866, cho phép client kích hoạt một lỗi rò rỉ bộ nhớ, từ đó lộ ra dữ liệu từ các kết nối đang hoạt động khác. Trong một số kịch bản, điều này có thể bao gồm cả các phản hồi dành cho những người dùng khác. Một lỗi mức độ nghiêm trọng cao thứ ba, CVE-2026-123864, ảnh hưởng cụ thể đến các máy chủ HTTPS. Lỗi này cho phép kẻ tấn công không cần xác thực đọc bộ nhớ máy chủ, tiềm ẩn nguy cơ lộ khóa riêng tư TLS và dữ liệu yêu cầu của người dùng khác, miễn là mã ứng dụng gọi các phương thức phản hồi cụ thể theo một thứ tự nhất định.

Bản tin cảnh báo bảo mật không liệt kê bất kỳ giải pháp thay thế (workaround) nào cho các vấn đề này, khẳng định rằng việc nâng cấp lên các phiên bản đã được sửa lỗi là con đường khắc phục duy nhất. Các máy chủ chạy phiên bản đã hết vòng đời (end-of-life), chẳng hạn như 20.x và 25.x, sẽ không nhận được bản vá và vẫn mãi mãi dễ bị tổn thương bởi các cuộc khai thác này. Dự án không báo cáo về bất kỳ cuộc khai thác tích cực nào trong thực tế tại thời điểm phát hành, cũng như không nêu rõ liệu các máy chủ bị xâm nhập có bắt buộc phải xoay vòng (rotate) khóa TLS sau khi vá hay không.

Chi tiết chính

  • Các phiên bản đã được sửa lỗi là 22.23.5, 24.22.3 và 26.13.1; cả ba dòng được hỗ trợ đều bị ảnh hưởng.
  • CVE-2026-123863 cho phép các client không cần xác thực làm sập máy chủ HTTP/2 thông qua các phản hồi quá sớm.
  • CVE-2026-123864 cho phép đọc khóa riêng tư TLS và dữ liệu kết nối khác từ bộ nhớ máy chủ HTTPS.
  • Các phiên bản đã hết vòng đời như Node.js 20.x và 25.x không nhận được bản sửa lỗi và vẫn dễ bị tổn thương.
  • Năm trong số các lỗ hổng được báo cáo bởi Chris Rohlf phối hợp cùng Anthropic Research.
  • Bản tin cảnh báo nêu rõ không có giải pháp thay thế nào được biết đến ngoài việc nâng cấp runtime.

Bối cảnh

Node.js là một JavaScript runtime được sử dụng rộng rãi để xây dựng các ứng dụng mạng có khả năng mở rộng. Các module HTTP/2 và HTTPS tích hợp sẵn xử lý các giao thức mạng ở tầng thấp, bao gồm mã hóa TLS và các luồng đa hợp (multiplexed streams). Khi các lỗ hổng tồn tại trong những module lõi này, chúng ảnh hưởng đến mọi ứng dụng sử dụng chúng, bất kể framework ở tầng cao hơn như Express hay Fastify. Điều này khác với các lỗi ở cấp độ ứng dụng, nơi lập trình viên thường có thể tự vá trong mã nguồn của họ. Các lỗ hổng trong lõi đòi hỏi phải chờ các nhà bảo trì runtime phát hành một binary hoặc bản phát hành mã nguồn mới.

HTTP/2 cải thiện hiệu suất bằng cách cho phép nhiều yêu cầu trên một kết nối duy nhất, nhưng nó giới thiệu việc quản lý trạng thái phức tạp cho các luồng và tiêu đề (headers). Các lỗi trong lĩnh vực này thường dẫn đến cạn kiệt tài nguyên hoặc hỏng bộ nhớ vì máy chủ phải theo dõi trạng thái của nhiều tương tác đồng thời. Tương tự, việc xử lý TLS liên quan đến quản lý các khóa mật mã và dữ liệu phiên trong bộ nhớ. Nếu một lỗi cho phép đọc ngoài vùng đệm bộ nhớ dự kiến, kẻ tấn công có thể trích xuất các bí mật vốn nên được bảo vệ bởi lớp mã hóa.

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

Đối với các đội ngũ vận hành phần mềm tự lưu trữ, những lỗ hổng này đại diện cho mối đe dọa trực tiếp đối với tính sẵn sàng và tính bảo mật. Một lỗi gây sập có nghĩa là kẻ tấn công có thể hạ gục API hoặc giao diện web của bạn với nỗ lực tối thiểu, gây ra thời gian chết ảnh hưởng đến người dùng và doanh thu. Vì điều kiện kích hoạt lỗi sập khá phổ biến trong các thiết lập mặc định, nhiều dịch vụ có thể bị lộ mà không cần bất kỳ thay đổi cấu hình tùy chỉnh nào. Điều này làm cho việc vá lỗi kịp thời trở nên thiết yếu để duy trì độ tin cậy của dịch vụ.

Các vấn đề rò rỉ bộ nhớ còn đáng lo ngại hơn đối với những tổ chức chú trọng bảo mật. Nếu kẻ tấn công có thể đọc khóa riêng tư TLS, họ có khả năng giải mã lưu lượng truy cập trong quá khứ hoặc tương lai nếu họ cũng nắm bắt được các gói tin mạng. Việc rò rỉ dữ liệu yêu cầu của người dùng khác vi phạm kỳ vọng về quyền riêng tư và có thể phá vỡ các yêu cầu tuân thủ như GDPR hoặc HIPAA. Bởi vì những lỗi này nằm trong chính runtime, tường lửa ở cấp độ ứng dụng hoặc kiểm tra đầu vào có thể không giảm thiểu hoàn toàn rủi ro, để lộ quy trình máy chủ nền tảng.

Ngoài ra, việc thiếu bản vá cho các phiên bản đã hết vòng đời buộc các đội ngũ vẫn đang dùng Node.js 20 hoặc 25 phải đưa ra quyết định khó khăn. Họ phải hoặc tiến hành di chuyển khẩn cấp sang một phiên bản được hỗ trợ, hoặc chấp nhận rủi ro vận hành cơ sở hạ tầng dễ bị tổn thương. Điều này nhấn mạnh gánh nặng vận hành trong việc giữ cho các runtime luôn cập nhật, vì trì hoãn nâng cấp có thể dẫn đến tình huống không có bản vá nào khả dụng khi một lỗi nghiêm trọng được phát hiện.

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

  • Xác định tất cả các máy chủ đang chạy Node.js 22, 24 hoặc 26 và lên kế hoạch nâng cấp ngay lập tức lên các phiên bản đã được sửa lỗi.
  • Kiểm tra xem có dịch vụ nào đang chạy trên các phiên bản đã hết vòng đời như 20.x hoặc 25.x không và ưu tiên di chuyển chúng.
  • Xem xét nhật ký ứng dụng để tìm các sự cố sập bất thường hoặc kết nối bị reset, có thể chỉ ra các nỗ lực khai thác.
  • Cân nhắc xoay vòng khóa riêng tư TLS và chứng chỉ nếu bạn nghi ngờ bất kỳ máy chủ nào đã bị tổn thương bởi CVE-2026-123864.
  • Kiểm thử kỹ lưỡng ứng dụng của bạn sau khi nâng cấp, vì các bản nâng cấp phiên bản nhỏ đôi khi có thể giới thiệu những thay đổi gây xung đột (breaking changes).
  • Theo dõi kênh bảo mật Node.js để biết thêm các cảnh báo, đặc biệt là về nhu cầu xoay vòng khóa.

Tin khác

Tất cả tin