Lỗ hổng XSS nghiêm trọng trong Angular Ivy renderer

Nhóm Angular vừa phát hành bản vá cho một lỗ hổng bảo mật nghiêm trọng mới được phát hiện trong Angular framework, ảnh hưởng đến cơ chế quốc tế hóa (i18n) của framework này và có khả năng tác động đến hàng nghìn ứng dụng web trên toàn cầu.
Thông tin chi tiết
Định danh lỗ hổng: CVE-2026-32635
Điểm CVSS (4.0): 8.6
Mức độ nghiêm trọng: HIGH - Nghiêm trọng cao
Mô tả: Lỗ hổng Cross-Site Scripting (XSS) được xác định trong Angular runtime và compiler, xảy ra khi ứng dụng sử dụng một thuộc tính HTML nhạy cảm về bảo mật (ví dụ
hreftrên thẻ anchor) kết hợp với khả năng quốc tế hóa thuộc tínhi18ncủa Angular. Việc bật quốc tế hóa cho thuộc tính nhạy cảm bằng cách thêmi18n-<attribute>sẽ bỏ qua cơ chế sanitization (làm sạch dữ liệu) tích hợp của Angular, khi kết hợp với data binding từ dữ liệu do người dùng tạo ra không đáng tin cậy, cho phép kẻ tấn công chèn mã độc hại.
Mặc dù lỗ hổng không yêu cầu xác thực, tuy nhiên cần có sự tương tác của người dùng, chẳng hạn như truy cập vào một trang web độc hại chứa chức năng khai thác của kẻ tấn công.Phiên bản bị ảnh hưởng: @angular/core, @angular/compiler các phiên bản Angular từ
17.0.0-next.0đến trước các phiên bản:22.0.0-next.3,21.2.4, 20.3.18và19.2.20.
Angular là một framework phát triển web phổ biến, được trang bị cơ chế DomSanitizer — lớp bảo vệ tự động làm sạch dữ liệu đầu vào trước khi render lên giao diện, nhằm ngăn chặn các script độc hại thực thi trong trình duyệt người dùng. Ví dụ, khi người dùng nhập một đường dẫn javascript:alert(1) vào một trường href, DomSanitizer sẽ chặn và vô hiệu hóa giá trị này trước khi nó được hiển thị.
Angular cũng hỗ trợ tính năng quốc tế hóa (i18n) — cho phép ứng dụng hiển thị nội dung bằng nhiều ngôn ngữ khác nhau. Để đánh dấu một thuộc tính cần dịch, developer thêm tiền tố i18n- vào trước tên thuộc tính, ví dụ i18n-href.
CVE-2026-32635 phát sinh chính xác tại điểm giao giữa hai tính năng này: khi một thuộc tính nhạy cảm được đánh dấu quốc tế hóa bằng tiền tố i18n-, Angular compiler sẽ xử lý thuộc tính đó thông qua pipeline i18n thay vì pipeline thông thường — và codepath này hoàn toàn bỏ qua bước sanitization. Kết quả là: dữ liệu đầu vào không đáng tin cậy được gắn vào một thuộc tính nhạy cảm có thể thực thi JavaScript tùy ý trong trình duyệt của nạn nhân.
Ví dụ minh họa: một template Angular được định nghĩa như sau:
<a [href]="userUrl" i18n-href>Nhấn vào đây</a>
Nếu userUrl chứa giá trị javascript:alert(document.domain) do người dùng kiểm soát, Angular sẽ render thành <a href="javascript:alert(document.domain)">Nhấn vào đây</a>. Khi người dùng click vào liên kết, mã độc lập tức được thực thi trong ngữ cảnh của ứng dụng.
Khi bị khai thác thành công, lỗ hổng có thể dẫn đến: chiếm đoạt phiên đăng nhập (session hijacking), đánh cắp dữ liệu nhạy cảm, thực hiện hành động trái phép thay mặt người dùng, và đánh cắp thông tin xác thực từ LocalStorage, IndexedDB hoặc cookie.
Khuyến nghị & Khắc phục
Đội ngũ FPT Threat Intelligence khuyến nghị các tổ chức và nhà phát triển đang sử dụng Angular cần kiểm tra ngay phiên bản hiện tại và thực hiện cập nhật lên phiên bản đã được vá. Đối với các hệ thống không thể cập nhật ngay lập tức, cần áp dụng các biện pháp giảm thiểu tạm thời theo hướng dẫn bên dưới.
| Phiên bản Angular | Trạng thái | Hành động cần thực hiện |
|---|---|---|
| 19.x, 20.x, 21.x, 22.x-next | Đã có bản vá | Cập nhật lên phiên bản 19.2.20 / 20.3.18 / 21.2.4 / 22.0.0-next.3 tương ứng |
| 17.x, 18.x | Không có bản vá (End-of-Life) | Áp dụng biện pháp giảm thiểu thủ công hoặc nâng cấp lên phiên bản được hỗ trợ |
Hướng dẫn cập nhật (đối với phiên bản có bản vá):
- Bước 1: Kiểm tra phiên bản Angular hiện tại của dự án:
grep '"@angular/core"' package.json
- Bước 2: Cập nhật lên phiên bản đã được vá tương ứng:
npm install @angular/core@19.2.20 --save
# hoặc
npm install @angular/core@20.3.18 --save
# hoặc
npm install @angular/core@21.2.4 --save
- Bước 3: Xác minh phiên bản sau khi cập nhật:
npm list @angular/core
Biện pháp giảm thiểu tạm thời (đối với phiên bản 17.x và 18.x không có bản vá):
Rà soát toàn bộ codebase, tìm kiếm các thuộc tính nhạy cảm (
href,src,action,formaction,data,background) đang đồng thời sử dụng cả data binding và tiền tối18n-.Gỡ bỏ tiền tố
i18n-khỏi các thuộc tính nhạy cảm nếu có thể, hoặc tách riêng nội dung cần dịch ra khỏi các thuộc tính này.Sử dụng
DomSanitizer.bypassSecurityTrustUrl()một cách có kiểm soát, kết hợp với whitelist đầu vào nghiêm ngặt.Triển khai Content Security Policy (CSP) nghiêm ngặt, cấm thực thi
unsafe-inlinevà chặn schemejavascript:để vô hiệu hóa vector tấn công chính.Bật Trusted Types trong cấu hình ứng dụng để buộc trình duyệt từ chối các phép gán chuỗi nguy hiểm vào DOM sink.
Tham khảo
GitHub Security Advisory: https://github.com/angular/angular/security/advisories/GHSA-g93w-mfhg-p222
Angular Pull Request Fix: https://github.com/angular/angular/pull/67541






