Lỗi escape đầu ra SSR của Angular @angular/platform-server cho phép cross-site scripting

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

Lỗ hổng CVE-2026-88058 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, cơ chế server-side rendering (SSR) của Angular trong @angular/platform-server tuần tự hóa các nút DOM ProcessingInstruction bên trong các phần tử fallback raw-content nhưng không escape các thẻ đóng của ancestor tương ứng. Dữ liệu ProcessingInstruction được escape đối với các ký tự lớn hơn nhưng để nguyên các ký tự nhỏ hơn và không kiểm tra các fallback ancestor, vì vậy dữ liệu như một thẻ đóng tương ứng có thể kết thúc sớm các container noscript, iframe, noembed hoặc noframes. Các nút dễ bị lỗi này không thể được tạo thông qua Angular template chuẩn; để có thể tiếp cận, application hoặc library phải sử dụng inject(DOCUMENT).createProcessingInstruction với dữ liệu do attacker kiểm soát hoặc chèn DOM bằng Renderer2 bên trong một fallback container. Trong cơ chế phân tích RAWTEXT của HTML5, việc đóng sớm khiến các phần tử sibling tiếp theo được diễn giải thành HTML hoạt động và cho phép thực thi JavaScript tùy ý trong trình duyệt của nạn nhân. 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

  • @angular/platform-server thuộc nhánh <= 19.2.25 bị ảnh hưởng. Advisory nêu rõ nhánh này đã hết hỗ trợ hoặc LTS và sẽ không được vá.
  • Các bản >= 20.0.0, < 20.3.30 bị ảnh hưởng; bản sửa tương ứng là 20.3.30.
  • Các bản >= 21.0.0, < 21.2.22 bị ảnh hưởng; bản sửa tương ứng là 21.2.22.
  • Các bản >= 22.0.0, < 22.1.4 bị ảnh hưởng; bản sửa tương ứng là 22.1.4.
  • Không nên suy ra trạng thái an toàn cho các nhánh hoặc cách đóng gói khác nếu chúng không nằm trong các phạm vi đã được xác nhận.

Chi tiết kỹ thuật

Angular @angular/platform-server thực hiện server-side rendering bằng cách tuần tự hóa HTML thông qua logic serializer liên quan đến dependency domino. Với ProcessingInstruction node, nhánh xử lý trước đây chỉ escape ký tự > trong dữ liệu nhưng để nguyên < và không gọi logic kiểm tra các fallback raw-content ancestor như fallbackRawContentTags(). Trong HTML5, các phần tử noscript, iframe, noembed và noframes đưa HTML tokenizer vào chế độ RAWTEXT; khi dữ liệu chứa chuỗi thẻ đóng tương ứng, tokenizer có thể kết thúc container sớm, sau đó diễn giải các sibling element tiếp theo như HTML đang hoạt động. Đường đi này cần application hoặc library tạo hoặc chèn một ProcessingInstruction node bằng dữ liệu do attacker kiểm soát, chẳng hạn qua inject(DOCUMENT).createProcessingInstruction(...), trong một fallback container được SSR. Các Angular template thông thường không tạo được node này vì cú pháp tương ứng được phân tích thành comment node, nên phạm vi ảnh hưởng hẹp hơn các đường XSS SSR thông thường. Chi tiết về route ứng dụng, nguồn dữ liệu đầu vào và cách dữ liệu đến được node vẫn phụ thuộc vào từng ứng dụng.

Khả năng khai thác

Lỗ hổng có thể được tiếp cận từ mạng thông qua ứng dụng Angular sử dụng SSR. Bản ghi đánh giá điều kiện khai thác là không cần quyền đặc biệt, độ phức tạp thấp và cần tương tác thụ động của nạn nhân, nghĩa là nạn nhân cần tải hoặc hiển thị phản hồi SSR bị ảnh hưởng. Tuy nhiên, attacker vẫn phải đưa được dữ liệu kiểm soát vào ProcessingInstruction node nằm trong một fallback raw-content element; Angular template chuẩn không tự tạo đường đi này. Bản ghi đánh dấu public exploit là có, và advisory chứa một minimal reproduction, nhưng không xác định một chiến dịch hoặc việc khai thác trong thực tế. Trường known-exploited không thiết lập bằng chứng về một chiến dịch khai thác ngoài thực tế.

Tác động kỹ thuật

Khi điều kiện reachability được đáp ứng, serializer có thể phát hành HTML trong đó fallback container bị đóng sớm bởi dữ liệu của processing instruction. Các sibling element vốn được kỳ vọng là nội dung fallback không còn bị giữ trong vùng raw text và có thể trở thành markup hoạt động trong trình duyệt. Kết quả kỹ thuật là arbitrary JavaScript execution trong browser của nạn nhân, với khả năng ảnh hưởng đến dữ liệu và thao tác mà context đó được phép thực hiện. Lỗ hổng không tự nó chứng minh việc thực thi mã trên máy chủ, phá vỡ tính sẵn sàng hoặc ảnh hưởng đến mọi ứng dụng Angular, vì code path tạo node và dữ liệu attacker kiểm soát là điều kiện bắt buộc.

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

Trong ứng dụng SSR bị ảnh hưởng, dữ liệu đầu vào từ attacker có thể làm thay đổi cách trình duyệt diễn giải HTML trả về và kích hoạt JavaScript trong context của nạn nhân. Tùy dữ liệu mà ứng dụng hiển thị và quyền của người dùng, script có thể đọc dữ liệu mà trang cho phép truy cập, thay đổi giao diện hoặc thực hiện hành động với quyền của người dùng đó. Tác động thực tế bị giới hạn bởi điều kiện reachability hẹp: ứng dụng phải tạo processing instruction bằng dữ liệu không tin cậy bên trong fallback container. Bản ghi mô tả tác động đến tính bí mật và toàn vẹn ở phía trình duyệt, nhưng không thiết lập việc chiếm máy chủ hoặc gián đoạn tính sẵn sàng của dịch vụ.

Cách khắc phục

  1. Nâng cấp @angular/platform-server theo đúng nhánh được hỗ trợ: dùng 20.3.30 cho nhánh 20, 21.2.22 cho nhánh 21 hoặc 22.1.4 cho nhánh 22. Xác nhận artifact SSR thực tế đã sử dụng dependency đã sửa.
  2. Với triển khai thuộc nhánh <= 19.2.25, chuyển sang một nhánh Angular còn được hỗ trợ và áp dụng bản sửa tương ứng, vì advisory nêu rõ nhánh hết hỗ trợ này sẽ không được vá.
  3. Nếu chưa thể cập nhật ngay, không đưa dữ liệu không tin cậy vào document.createProcessingInstruction(target, data) khi node được đặt trong noscript, iframe, noembed hoặc noframes trong quá trình SSR.
  4. Dùng biện pháp workaround phía server được advisory nêu: sanitize dữ liệu không tin cậy hoặc thay < bằng &lt; trước khi đưa dữ liệu vào processing instruction. Biện pháp này không thay thế cho nâng cấp bản vá.
  5. Sau khi cập nhật, kiểm thử lại các code path tạo processing instruction, đặc biệt những path đi qua dependency domino, và xác nhận matching ancestor closing tags được escape trong HTML SSR.

Cách phát hiện

  1. Kiểm kê các ứng dụng và service đang triển khai Angular SSR, kiểm tra dependency tree, lockfile và artifact runtime để xác định sự hiện diện của @angular/platform-server.
  2. Tìm trong mã nguồn các lời gọi inject(DOCUMENT).createProcessingInstruction, createProcessingInstruction và các luồng chèn DOM bằng Renderer2, sau đó xác định liệu dữ liệu đầu vào không tin cậy có thể đi vào trường data hay không.
  3. Kiểm tra các code path tạo node bên trong hoặc bên dưới noscript, iframe, noembed và noframes trong quá trình SSR.
  4. Kiểm tra HTML SSR được sinh ra để tìm chuỗi thẻ đóng của fallback container xuất hiện nguyên dạng trong dữ liệu của processing instruction, thay vì được escape.
  5. Thực hiện regression test trên output SSR với processing instruction chứa dữ liệu đại diện cho thẻ đóng của từng loại fallback container, rồi xác nhận dữ liệu không thể kết thúc container sớm và sibling markup vẫn ở trạng thái không hoạt động.
  6. Có thể xem xét CSP violation report, browser telemetry và thay đổi bất thường trong HTML SSR như biện pháp giám sát bổ sung. Đây chỉ là precaution, không phải indicator được xác nhận, và việc không thấy log không chứng minh hệ thống an toàn.
Nguồn (20)
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.