Angular @angular/router SSR cho phép request làm cạn heap Node.js

Lưu ý: Dữ liệu này chỉ có tính chất tham khảo, phục vụ nghiên cứu an ninh mạng.CyStack khuyến nghị người dùng không sử dụng các thông tin này nhằm các mục đích bất hợp pháp

Lỗ hổng CVE-2026-101896 là gì?

Lỗ hổng CVE-2026-101896 là lỗ hổng thuộc các loại Uncontrolled Resource Consumption và Allocation of Resources Without Limits or Throttling, ảnh hưởng tới angular (phiên bản bị ảnh hưởng: <= 19.2.25, >= 20.0.0, < 20.3.32 và các phiên bản bị ảnh hưởng khác) và router (phiên bản bị ảnh hưởng: <= 19.2.25, >= 20.0.0, < 20.3.32 và các phiên bản bị ảnh hưởng khác). Lỗ hổng này được xếp hạng ở mức Cao, với điểm CVSS 8.2. Các nguồn hiện có chưa ghi nhận lỗ hổng này bị khai thác.

Giới thiệu chung

Dữ liệu gốc

Angular là một nền tảng phát triển để xây dựng các ứng dụng web cho thiết bị di động và máy tính để bàn bằng TypeScript/JavaScript cùng các ngôn ngữ khác. Trước các phiên bản 20.3.32, 21.2.24 và 22.2.0, bộ phân tích URL của @angular/router lưu tên matrix parameter dạng số và tên outlet dạng số làm thuộc tính trên các JavaScript object ban đầu đang rỗng trong quá trình Node.js server-side rendering. V8 có thể diễn giải các key bắt nguồn từ URL này như array index và cấp phát dense backing store có kích thước theo các giá trị số lớn, vì vậy những path segment nhỏ lặp lại gây ra mức tiêu thụ heap không tương xứng trên mỗi segment. Một kẻ tấn công không cần xác thực có thể gửi các request chồng lấp chứa matrix parameter dạng số lặp lại khi SSR được bật, router trực tiếp phân tích request URL, và các proxy upstream cho phép semicolon cùng nhiều path segment, cuối cùng làm cạn Node.js old-space heap và khiến SSR worker kết thúc. Các ứng dụng Angular chỉ chạy phía client không bị ảnh hưởng. Vấn đề này được khắc phục trong các phiên bản 20.3.32, 21.2.24 và 22.2.0.

Sản phẩm và phạm vi ảnh hưởng

  • @angular/router và các deployment Angular sử dụng package này bị ảnh hưởng khi bật Node.js SSR và URL request được router trực tiếp phân tích.
  • Nhánh <= 19.2.25 bị ảnh hưởng. Nguồn CNA/vendor cho biết nhánh này đã hết hỗ trợ và sẽ không được phát hành bản vá.
  • Nhánh >= 20.0.0, < 20.3.32 bị ảnh hưởng; bản sửa tương ứng là 20.3.32.
  • Nhánh >= 21.0.0, < 21.2.24 bị ảnh hưởng; bản sửa tương ứng là 21.2.24.
  • Nhánh >= 22.0.0, < 22.2.0 bị ảnh hưởng; bản sửa tương ứng là 22.2.0.
  • Ứng dụng Angular chỉ chạy phía client, không bật SSR, không thuộc phạm vi ảnh hưởng được mô tả.

Chi tiết kỹ thuật

Trong quá trình Node.js server-side rendering, @angular/router phân tích URL request và lưu tên matrix parameter, tên outlet cùng dữ liệu của từng path segment vào các object JavaScript thông thường. Khi tên được kiểm soát bởi URL là chuỗi số, V8 có thể diễn giải chúng như array index và cấp phát dense backing store theo index lớn nhất thay vì dùng dictionary storage. Mỗi segment tạo một object tham số riêng, vì vậy nhiều segment nhỏ lặp lại trong các request chồng lấp có thể tạo mức tiêu thụ heap lớn hơn nhiều so với kích thước URL. Điều kiện khai thác gồm SSR chạy trên Node.js/V8, URL do người dùng kiểm soát được router trực tiếp phân tích, và proxy upstream cho phép semicolon cùng nhiều path segment; chi tiết này không áp dụng cho ứng dụng Angular chỉ chạy phía client.

Khả năng khai thác

Lỗi có thể bị khai thác từ xa qua network mà không cần xác thực hoặc tương tác của người dùng, nhưng chỉ khi deployment thỏa các điều kiện SSR và proxy nêu trên. Kẻ tấn công gửi các request đồng thời chứa các matrix parameter có tên dạng số lặp lại trong nhiều path segment để làm tăng nhanh mức sử dụng V8 heap. Mức độ phức tạp được đánh giá là thấp, nhưng attack requirement vẫn hiện hữu vì ứng dụng phải bật SSR, router phải trực tiếp xử lý URL và proxy phải chuyển tiếp các ký tự cùng cấu trúc path liên quan. Khi heap old-space bị cạn, SSR worker có thể kết thúc với lỗi JavaScript heap out of memory. Bản ghi được cung cấp không xác định hoạt động khai thác thực tế và không xác định một public exploit đã được công bố.

Tác động kỹ thuật

Kết quả kỹ thuật là uncontrolled resource consumption trong V8 heap, với tác động chính lên availability. Các tên URL dạng số có thể bị xử lý như array index, khiến object tham số của từng segment nhận dense backing store lớn hơn đáng kể so với dữ liệu đầu vào. Nhiều request chồng lấp có thể làm cạn old-space và làm mất SSR worker.

  • Kẻ tấn công không cần tài khoản và không cần người dùng khác tương tác.
  • Tác động bị giới hạn bởi điều kiện triển khai: phải có Node.js SSR, router trực tiếp phân tích URL và proxy phải chuyển tiếp cấu trúc request phù hợp.
  • Không có bằng chứng trong bản ghi cho thấy lỗi đọc hoặc sửa dữ liệu, leo thang quyền, hay ảnh hưởng đến confidentiality và integrity.
  • Ứng dụng Angular chỉ chạy phía client không tạo ra đường dẫn tác động SSR được mô tả.

Tác động đến tổ chức

Lỗi chủ yếu đe dọa availability của các dịch vụ Angular SSR. Một lượng request đồng thời tương đối nhỏ có thể làm SSR worker gặp lỗi hết heap và kết thúc, dẫn đến gián đoạn render phía server, tăng lỗi request hoặc gây restart lặp lại nếu môi trường tự động khởi động worker.

  • Phạm vi tác động là tiến trình SSR và dịch vụ phụ thuộc vào tiến trình đó, không phải bộ nhớ của trình duyệt trong ứng dụng client-side thuần túy.
  • Việc tăng số worker hoặc tự động restart có thể làm giảm triệu chứng trong ngắn hạn nhưng có thể kéo theo tiêu thụ tài nguyên và gián đoạn lặp lại nếu request vẫn được chuyển tiếp.
  • Bản ghi không thiết lập ảnh hưởng đến confidentiality hoặc integrity.

Cách khắc phục

  1. Nâng cấp @angular/router lên bản sửa phù hợp với nhánh đang triển khai: 20.3.32, 21.2.24 hoặc 22.2.0. Xác minh lockfile, artifact build và runtime thực tế đều sử dụng bản đã sửa.
  2. Nếu đang dùng nhánh <= 19.2.25, lưu ý rằng nhánh này được xác định là đã hết hỗ trợ và sẽ không được vá. Lập kế hoạch chuyển sang một nhánh được hỗ trợ có bản sửa, sau khi kiểm tra tương thích ứng dụng.
  3. Nếu chưa thể nâng cấp ngay, chặn hoặc loại bỏ semicolon trong request path tại reverse proxy hoặc WAF trước khi chuyển tiếp đến SSR service. Đồng thời giới hạn nghiêm ngặt độ sâu path để giảm số lượng segment được router xử lý.
  4. Có thể tăng giới hạn Node.js old-space như một biện pháp giảm rủi ro tạm thời, nhưng cách này chỉ làm tăng ngưỡng chịu tải và không loại bỏ lỗi khi có traffic kéo dài.
  5. Sau khi thay đổi, kiểm tra lại routing của SSR, hành vi proxy đối với semicolon và nhiều path segment, rồi theo dõi lỗi hết heap cùng trạng thái worker trong quá trình rollout.

Cách phát hiện

  1. Kiểm kê dependency để xác định các ứng dụng có cài @angular/router, sau đó đối chiếu với các nhánh affected và fixed trong affected_summary.
  2. Xác minh ứng dụng có chạy Angular SSR trên Node.js/V8 hay chỉ là client-side application. Ứng dụng chỉ chạy phía client không thuộc phạm vi ảnh hưởng được mô tả.
  3. Kiểm tra request flow để xác định URL do người dùng kiểm soát có được @angular/router phân tích trực tiếp hay không, đồng thời kiểm tra reverse proxy có cho phép semicolon và path có nhiều segment.
  4. Rà soát log request như một biện pháp phòng ngừa để tìm các URL có nhiều segment, matrix parameter lặp lại và tên parameter dạng số. Đây là dấu hiệu cần điều tra, không phải IOC được xác nhận.
  5. Đối chiếu các sự kiện JavaScript heap out of memory, SSR worker exit hoặc restart, độ trễ tăng và lỗi HTTP trong cùng khoảng thời gian. Việc không thấy các sự kiện này không chứng minh hệ thống an toàn.
Nguồn (22)
Tìm hiểu thêm

Kiểm tra chuyên sâu cùng giải pháp quản lý rủi ro Web toàn diện

Giải pháp CyStack VulnScan liên tục phát hiện tài sản, xác minh lỗ hổng và giúp đội ngũ bảo mật ưu tiên khắc phục cho toàn bộ doanh nghiệp.