XSS trong Angular SSR do không escape nội dung template của @angular/platform-server

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

Lỗ hổng CVE-2026-88060 là lỗ hổng thuộc các loại Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') và Improper Encoding or Escaping of Output, ảnh hưởng tới angular (phiên bản bị ảnh hưởng: <= 19.2.25, >= 20.0.0, < 20.3.30 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.6. 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.30, 21.2.22 và 22.1.4, Angular server-side rendering (SSR) trong @angular/platform-server serialize input không tin cậy bên trong nội dung template được lồng trong các fallback raw-content element như noscript, iframe, noembed và noframes. Việc duyệt fallbackRawContentTags của Domino serializer dừng tại DocumentFragment được dùng bởi template.content, nên các thẻ đóng tương ứng trong xmp, style, script, comment hoặc text node không được escape. Interpolation thông thường với comment hoặc text node có thể tiếp cận đường này mà không cần schema nới lỏng; xmp hoặc style viết trực tiếp cần CUSTOM_ELEMENTS_SCHEMA hoặc NO_ERRORS_SCHEMA, trong khi việc tạo DOM bắt buộc bằng Renderer2 bị ảnh hưởng không điều kiện. Khi quá trình phân tích RAWTEXT của trình duyệt HTML5 gặp thẻ đóng không được escape, nó thoát khỏi fallback container và diễn giải markup phía sau như các phần tử DOM hoạt động, cho phép thực thi JavaScript tùy ý. Vấn đề này được sửa trong các phiên bản 20.3.30, 21.2.22 và 22.1.4.

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

  • Gói @angular/platform-server trong Angular <= 19.2.25 bị ảnh hưởng. Advisory cho biết nhánh này đã hết hỗ trợ hoặc LTS và sẽ không được vá.
  • Nhánh Angular >= 20.0.0, < 20.3.30 bị ảnh hưởng; bản đã được xác nhận là 20.3.30.
  • Nhánh Angular >= 21.0.0, < 21.2.22 bị ảnh hưởng; bản đã được xác nhận là 21.2.22.
  • Nhánh Angular >= 22.0.0, < 22.1.4 bị ảnh hưởng; bản đã được xác nhận là 22.1.4.
  • Các ranh giới của những nhánh khác không được bản ghi xác nhận, vì vậy không nên suy luận rằng một nhánh song song hoặc bản phát hành muộn hơn không bị ảnh hưởng chỉ từ các bản sửa nêu trên.

Chi tiết kỹ thuật

Trong quá trình SSR, @angular/platform-server dùng Domino serializer để chuyển cây DOM thành HTML. Các phần tử fallback raw-content như noscript, iframe, noembed và noframes khiến bộ phân tích HTML5 chuyển sang chế độ RAWTEXT, trong đó nội dung được coi là văn bản cho đến khi gặp thẻ đóng tương ứng. Serializer trước đây chỉ duyệt qua các phần tử khi tìm tổ tiên cần escape và dừng tại DocumentFragment riêng được dùng cho template.content, nên không nhận diện được phần tử fallback bên ngoài template. Vì vậy, các chuỗi thẻ đóng khớp như </noscript> trong xmp, style, script, comment hoặc text node có thể được xuất ra mà không được escape; trình duyệt sau đó có thể thoát khỏi fallback container và diễn giải markup tiếp theo như phần tử DOM hoạt động, dẫn đến thực thi JavaScript tùy ý. Interpolation thông thường với comment hoặc text node có thể chạm tới đường đi này mà không cần schema nới lỏng; xmp hoặc style viết trực tiếp cần CUSTOM_ELEMENTS_SCHEMA hoặc NO_ERRORS_SCHEMA, còn việc tạo DOM bắt buộc bằng Renderer2 bị ảnh hưởng không điều kiện. Bản ghi không xác định ứng dụng cụ thể nào thực sự đưa dữ liệu không tin cậy vào cấu trúc này, nên cần xác minh data flow và cách triển khai của từng ứng dụng.

Khả năng khai thác

Lỗ hổng có thể bị khai thác qua mạng trong quá trình ứng dụng Angular SSR tạo HTML. Đánh giá được cung cấp cho biết kẻ tấn công không cần quyền trước đó, độ phức tạp thấp và cần tương tác thụ động của người dùng, nghĩa là trình duyệt của nạn nhân hoặc quy trình do người dùng kích hoạt phải xử lý HTML SSR bị ảnh hưởng. Điều kiện thực tế vẫn là dữ liệu không tin cậy phải đi vào đường serialize trong template nằm bên trong fallback raw-content element. Bản ghi đánh dấu public exploit là có; advisory của Angular cũng có bản tái hiện tối thiểu, nhưng bằng chứng hiện có không xác nhận khai thác đang diễn ra, chiến dịch cụ thể, nạn nhân hay vụ xâm nhập nào.

Tác động kỹ thuật

Nếu khai thác thành công, HTML SSR trả về trình duyệt có thể chứa markup thoát khỏi fallback container và dẫn đến thực thi JavaScript tùy ý. Hậu quả có thể gồm đọc dữ liệu được expose cho trang, sửa nội dung hiển thị hoặc thực hiện thao tác trong ngữ cảnh người dùng; phạm vi thực tế phụ thuộc vào quyền của trang và dữ liệu có sẵn trong phiên đó. Đánh giá được cung cấp cho thấy tác động đến tính bí mật và toàn vẹn của hệ thống bị ảnh hưởng là cao, trong khi không xác định tác động đến tính sẵn sàng. Lỗi không tự động chứng minh rằng mọi ứng dụng Angular đều có thể bị khai thác, vì cần có đường dữ liệu không tin cậy đi qua cấu trúc SSR cụ thể.

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

  • JavaScript được thực thi thành công có thể đọc dữ liệu mà trang của nạn nhân được phép truy cập và thay đổi nội dung hoặc hành vi giao diện.
  • Tùy vào phiên người dùng và dữ liệu được hiển thị, mã chạy trong trình duyệt có thể thực hiện các thao tác thay mặt người dùng; đây là hậu quả có thể xảy ra, không phải bằng chứng về một vụ xâm nhập cụ thể.
  • Lỗi chủ yếu ảnh hưởng đến tính bí mật và toàn vẹn của nội dung web được render. Đánh giá được cung cấp không xác định tác động đến tính sẵn sàng.
  • Các ứng dụng dùng SSR, nhận input không tin cậy và có template hoặc DOM construction phù hợp nên ưu tiên kiểm tra trước.

Cách khắc phục

  1. Nâng cấp @angular/platform-server và các dependency Angular thuộc nhánh 20 lên đúng bản 20.3.30, nhánh 21 lên đúng bản 21.2.22, hoặc nhánh 22 lên đúng bản 22.1.4.
  2. Với Angular <= 19.2.25, không chờ một bản vá 19.x vì advisory nêu rõ nhánh này đã hết hỗ trợ hoặc LTS và sẽ không được vá. Lập kế hoạch chuyển sang một nhánh còn được hỗ trợ sau khi đánh giá tương thích.
  3. Trong thời gian chưa nâng cấp, tránh render dữ liệu không tin cậy bên trong template nằm trong noscript, iframe, noembed hoặc noframes. Cũng tránh dùng cách tạo DOM bắt buộc để dựng template trong các fallback container này khi dữ liệu có thể do người dùng kiểm soát.
  4. Sau khi nâng cấp, kiểm tra lại lockfile, dependency runtime và HTML SSR thực tế để bảo đảm ứng dụng đang dùng bản đã sửa, sau đó chạy các bài kiểm thử cho interpolation, comment, text node và các đường Renderer2 liên quan.

Cách phát hiện

  1. Kiểm kê dependency và lockfile để xác định ứng dụng có dùng @angular/platform-server hay không, sau đó đối chiếu từng nhánh Angular với các ranh giới affected và fixed đã nêu.
  2. Rà soát SSR template để tìm template nằm trong noscript, iframe, noembed hoặc noframes, đặc biệt khi bên trong có interpolation, comment hoặc text node nhận dữ liệu không tin cậy.
  3. Kiểm tra các template dùng xmp hoặc style cùng CUSTOM_ELEMENTS_SCHEMA hoặc NO_ERRORS_SCHEMA, và các directive hoặc component dùng Renderer2 để tạo template trong fallback container.
  4. Trong môi trường kiểm thử, kiểm tra HTML SSR được serialize để xác định các thẻ đóng tương ứng với fallback container có được escape khi xuất hiện trong nội dung template hay không.
  5. Có thể tăng cường giám sát XSS phía trình duyệt như một biện pháp phòng ngừa, nhưng không có IOC hoặc sự kiện log đặc thù nào được xác lập; việc không thấy log không chứng minh hệ thống an toàn.
Nguồn (19)
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.