Lỗ hổng DoS vòng lặp vô hạn trong Angular Server-Side Rendering

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-101895 là gì?

Lỗ hổng CVE-2026-101895 là lỗ hổng thuộc các loại Uncontrolled Resource Consumption và Loop with Unreachable Exit Condition ('Infinite Loop'), ảnh hưởng tới angular (phiên bản bị ảnh hưởng: <= 19.2.25, >= 20.0.0, < 20.3.31 và các phiên bản bị ảnh hưởng khác) và platform-server (phiên bản bị ảnh hưởng: <= 19.2.25, >= 20.0.0, < 20.3.31 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.7. Lỗ hổng này đã có mã hoặc bằng chứng khai thác công khai, nhưng điều đó chưa xác nhận việc khai thác trong thực tế.

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.31, 21.2.23 và 22.1.6, bộ phân tích mô phỏng DOM của @angular/platform-server có thể đi vào vòng lặp đồng bộ vô hạn khi Angular server-side rendering xử lý HTML do kẻ tấn công kiểm soát có DOCTYPE không hoàn chỉnh kết thúc bằng khoảng trắng ở cuối đầu vào. Trong Domino lib/HTMLParser.js, after_doctype_name_state phát ra các token doctype và EOF nhưng không tăng nextchar hoặc rời khỏi trạng thái fixed-lookahead, khiến scanner liên tục xử lý cùng một dấu EOF. Kẻ tấn công từ xa không cần xác thực có thể sử dụng điều kiện này thông qua các đường dẫn phân tích HTML phía máy chủ như innerHTML binding để làm một Node.js SSR worker tiêu thụ CPU tối đa, làm nghẽn event loop và dừng các request đồng thời cũng như các request tiếp theo. Lỗi này được sửa trong các phiên bản 20.3.31, 21.2.23 và 22.1.6.

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

  • Gói @angular/platform-server và bản ghi sản phẩm Angular tương ứng bị ảnh hưởng ở các phạm vi sau:
  • <= 19.2.25.
  • >= 20.0.0, < 20.3.31.
  • >= 21.0.0, < 21.2.23.
  • >= 22.0.0, < 22.1.6.
  • Bản advisory đánh dấu nhánh <= 19.2.25 đã hết hỗ trợ hoặc LTS và sẽ không được sửa trong nhánh đó.
  • Các bản sửa được xác nhận theo nhánh là 20.3.31, 21.2.23 và 22.1.6. Không nên suy ra trạng thái của các nhánh song song hoặc bản phát hành khác nếu chưa được đối chiếu riêng.

Chi tiết kỹ thuật

Angular Server-Side Rendering sử dụng bộ phân tích DOM emulation của Domino bên trong @angular/platform-server để xử lý HTML không tin cậy, bao gồm dữ liệu đi qua binding như [innerHTML] hoặc các thao tác DOM phía máy chủ. Khi đầu vào chứa DOCTYPE không hoàn chỉnh kết thúc bằng khoảng trắng tại EOF, trạng thái after_doctype_name_state trong lib/HTMLParser.js phát các token doctype và EOF nhưng không tăng nextchar hoặc rời khỏi trạng thái fixed-lookahead. Scanner vì vậy xử lý lặp đi lặp lại cùng một dấu EOF và không thể kết thúc vòng lặp đồng bộ. Do Node.js chạy mã JavaScript đồng bộ trên event loop, vòng lặp này có thể chiếm toàn bộ CPU của SSR worker và chặn việc xử lý các request khác. Điều kiện khai thác thực tế phụ thuộc vào việc ứng dụng có đưa dữ liệu do kẻ tấn công kiểm soát vào đường dẫn phân tích HTML phía máy chủ hay không; bằng chứng hiện có không cho thấy mọi triển khai Angular SSR đều phơi nhiễm như nhau. Lỗi tương ứng với CWE-400 và CWE-835.

Khả năng khai thác

Lỗ hổng có thể bị kích hoạt qua mạng khi ứng dụng Angular SSR phân tích HTML do người dùng kiểm soát, chẳng hạn dữ liệu được đưa vào binding [innerHTML] hoặc đường dẫn tạo markup phía máy chủ. Bản ghi và advisory xác định điều kiện khai thác là remote, không yêu cầu xác thực, không cần tương tác của người dùng khác và có độ phức tạp thấp. Một đầu vào DOCTYPE không hoàn chỉnh kết thúc bằng khoảng trắng có thể khiến SSR worker bị khóa trong vòng lặp đồng bộ, làm các request đồng thời và tiếp theo không được xử lý bởi worker đó. Bản ghi đánh dấu public exploit là có, và advisory có mô tả proof of concept, nhưng bằng chứng cung cấp không nêu tên chiến dịch, nạn nhân hoặc hoạt động khai thác thực tế đã quan sát. Tác động phụ thuộc vào topology của worker, process và cơ chế dự phòng của dịch vụ.

Tác động kỹ thuật

  • Kết quả kỹ thuật chính là vòng lặp đồng bộ không có điều kiện thoát trong parser Domino, dẫn đến tiêu thụ CPU không kiểm soát và làm cạn khả dụng của SSR worker.
  • Worker bị ảnh hưởng có thể không xử lý các request đồng thời hoặc request tiếp theo vì event loop bị chiếm giữ.
  • Lỗ hổng không được bằng chứng hiện có mô tả là làm tăng privilege, đọc dữ liệu hoặc sửa dữ liệu; tác động được xác nhận tập trung vào availability của hệ thống bị ảnh hưởng.
  • Phạm vi gián đoạn ở cấp dịch vụ phụ thuộc vào kiến trúc triển khai, số lượng worker, cơ chế cô lập process và khả năng chuyển request sang replica khác. Một ứng dụng có nhiều replica có thể giảm phạm vi, nhưng không loại bỏ rủi ro đối với các worker vẫn chạy phiên bản bị ảnh hưởng.

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

  • Một SSR worker bị khóa có thể ngừng trả lời các request đồng thời và request đến sau, làm giảm capacity hoặc gây gián đoạn dịch vụ.
  • Nếu nhiều request có thể đến các worker bị ảnh hưởng, sự cố có thể lan thành suy giảm hoặc mất khả dụng của lớp SSR, tùy thuộc vào số replica, load balancing và cơ chế restart.
  • Do lỗ hổng là resource-consumption và không được mô tả là cho phép đọc hoặc sửa dữ liệu, bằng chứng hiện có không thiết lập tác động trực tiếp đến confidentiality hoặc integrity.
  • Đội vận hành cần ưu tiên cập nhật dependency, xác định các đường dẫn nhận HTML không tin cậy và kiểm tra hành vi của worker sau khi triển khai bản sửa.

Cách khắc phục

  1. Nâng cấp theo đúng nhánh đang sử dụng: cập nhật @angular/platform-server lên bản sửa tương ứng 20.3.31, 21.2.23 hoặc 22.1.6. Xác minh cả manifest và lockfile để bảo đảm dependency thực tế đã thay đổi.
  2. Với nhánh <= 19.2.25, không chờ bản vá cho nhánh đã hết hỗ trợ hoặc LTS. Di chuyển sang một nhánh được hỗ trợ có bản sửa đã xác nhận, đồng thời kiểm tra tương thích ứng dụng trước khi phát hành.
  3. Giảm phơi nhiễm trong thời gian chuyển đổi: tránh đưa dữ liệu không tin cậy trực tiếp vào [innerHTML] trong template được render phía máy chủ. Khi không cần HTML thô, dùng text interpolation hoặc [textContent].
  4. Nếu bắt buộc phải render HTML không tin cậy, kiểm tra hoặc sanitize dữ liệu trước khi đưa vào đường dẫn [innerHTML] phía máy chủ. Advisory nêu biện pháp tạm thời là loại bỏ hoặc từ chối chuỗi khớp ^<!DOCTYPE/i.
  5. Sau cập nhật, chạy regression test trong staging cho các đường dẫn parse HTML, theo dõi CPU và event-loop lag của SSR worker, rồi mới mở rộng triển khai. Các workaround không thay thế cho việc nâng cấp.

Cách phát hiện

  • Kiểm kê dependency trực tiếp và dependency lock để xác định ứng dụng có sử dụng @angular/platform-server hay không, sau đó đối chiếu nhánh và phiên bản với các phạm vi bị ảnh hưởng.
  • Xác định các deployment có bật Angular SSR và rà soát data flow từ request, nội dung người dùng hoặc dữ liệu lưu trữ đến [innerHTML], markup được tạo phía máy chủ, bộ sanitizer hoặc các API DOM.
  • Trong môi trường staging được kiểm soát, chạy regression test của advisory đối với trường hợp DOCTYPE không hoàn chỉnh kết thúc bằng whitespace và xác nhận parser kết thúc bình thường, không làm treo worker. Không thực hiện kiểm thử này trên production.
  • Theo dõi CPU saturation, event-loop lag, SSR worker không phản hồi hoặc request timeout xảy ra đồng thời với hoạt động phân tích HTML. Đây là telemetry phòng ngừa, không phải IOC đã được xác nhận.
  • Bằng chứng hiện có không cung cấp một IOC cụ thể trong log. Việc không thấy log bất thường không chứng minh hệ thống không bị ảnh hưởng.
Nguồn (16)
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.