Angular @angular/common HttpTransferCache làm lộ dữ liệu SSR đã xác thực qua bộ nhớ đệm HTML dùng chung

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

Lỗ hổng CVE-2026-88059 là lỗ hổng thuộc các loại Exposure of Sensitive Information to an Unauthorized Actor và Use of Cache Containing Sensitive Information, ảnh hưởng tới angular (phiên bản bị ảnh hưởng: <= 19.2.25, >= 20.0.0, < 20.3.28 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 Trung bình, với điểm CVSS 5.8. 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.28, 21.2.20 và 22.1.1, HttpTransferCache của Angular trong @angular/common có thể cache một response đã xác thực khi Server-Side Rendering (SSR) và hydration sử dụng một HttpClient phân cấp được cấu hình với withRequestsMadeViaParent. TransferCache ở child đánh giá một request ban đầu là anonymous trước khi delegation, sau đó chuỗi withInterceptors ở parent thêm header Authorization, cookie hoặc API token; mặc dù cache ở parent bỏ qua request đã xác thực, cache ở child vẫn lưu response riêng tư vào TransferState được tuần tự hóa dưới dạng JSON trong script ng-state. Việc khai thác yêu cầu provideClientHydration, child provideHttpClient delegation thông qua withRequestsMadeViaParent, credential injection ở cấp parent và một response HTML SSR được chia sẻ giữa nhiều người dùng bởi CDN, reverse proxy hoặc application cache. Một visitor không xác thực hoặc không được cấp quyền đến sau có thể nhận HTML đã cache chứa dữ liệu nhạy cảm trong response của người dùng đã xác thực trước đó. Ứng dụng có thể giảm thiểu bằng cách gắn credential ở child, lọc các endpoint nhạy cảm bằng withHttpTransferCacheOptions, tắt transfer caching cho các route nhạy cảm hoặc đánh dấu HTML personalized là private hoặc no-store. Vấn đề này được sửa trong các phiên bản 20.3.28, 21.2.20 và 22.1.1.

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

Các nhánh sau của Angular @angular/common được advisory xác định là bị ảnh hưởng:

  • <= 19.2.25: bị ảnh hưởng; advisory ghi nhận nhánh này đã hết hỗ trợ hoặc LTS và sẽ không được vá.
  • >= 20.0.0, < 20.3.28: bị ảnh hưởng; bản sửa được xác định là 20.3.28.
  • >= 21.0.0, < 21.2.20: bị ảnh hưởng; bản sửa được xác định là 21.2.20.
  • >= 22.0.0, < 22.1.1: bị ảnh hưởng; bản sửa được xác định là 22.1.1.

Tình trạng của các nhánh hoặc phiên bản khác không được suy ra nếu không có trong các ranh giới nêu trên.

Chi tiết kỹ thuật

Trong @angular/common, HttpTransferCache đánh giá request có đủ điều kiện cache hay không tại child trước khi request được delegation. Khi sử dụng withRequestsMadeViaParent(), request đi qua chuỗi interceptor của parent, nơi có thể thêm header Authorization, cookie hoặc API token. Cache ở parent nhận diện request đã xác thực và bỏ qua việc cache, nhưng child vẫn giữ quyết định ban đầu rằng request là anonymous và lưu response riêng tư vào TransferState, sau đó được tuần tự hóa dưới dạng JSON trong script ng-state của HTML SSR. Ứng dụng chỉ bị ảnh hưởng khi đồng thời bật SSR và hydration, sử dụng provideClientHydration, cấu hình child provideHttpClient delegation qua withRequestsMadeViaParent, chèn credential ở parent và chia sẻ HTML SSR giữa nhiều người dùng qua CDN, reverse proxy hoặc application cache. Hành động phía requester được bằng chứng mô tả là yêu cầu cùng trang SSR; không có payload đặc biệt nào được xác lập. Endpoint cụ thể và loại dữ liệu nhạy cảm được trả về phụ thuộc vào ứng dụng và không được xác định trong nguồn.

Khả năng khai thác

  • Lỗ hổng có thể bị tiếp cận qua mạng thông qua trang SSR của ứng dụng khi cấu hình dễ tổn thương và lớp cache HTML dùng chung tồn tại.
  • Bản ghi chuẩn hóa cho biết không yêu cầu quyền của attacker hoặc tương tác của người dùng cuối. Tuy nhiên, việc khai thác phụ thuộc đồng thời vào SSR, hydration, hierarchical HttpClient, credential injection ở parent và việc chia sẻ HTML giữa các session.
  • Một visitor không xác thực hoặc không được cấp quyền có thể yêu cầu cùng trang và nhận HTML đã cache, trong đó có dữ liệu response riêng tư của người dùng đã xác thực trước đó.
  • Bản ghi đánh dấu có public exploit, nhưng không cung cấp tên exploit, payload, chuỗi khai thác hoặc chiến dịch cụ thể. Trạng thái khai thác đã được xác nhận trong thực tế không được thiết lập.

Tác động kỹ thuật

Kết quả kỹ thuật là response riêng tư của một request đã được parent interceptor xác thực có thể xuất hiện trong TransferState và HTML SSR được cache. Visitor không xác thực hoặc không có quyền có thể đọc dữ liệu đó khi nhận cùng HTML cache; lỗi không cho phép sửa đổi response hoặc gây mất tính sẵn sàng theo bằng chứng hiện có. Attacker không cần có tài khoản trong đường dẫn được mô tả, nhưng ứng dụng phải đáp ứng toàn bộ điều kiện cấu hình và cache nêu trong advisory. Mức độ lộ dữ liệu phụ thuộc vào nội dung endpoint được gọi trong SSR và phạm vi HTML bị chia sẻ. Không có bằng chứng xác định rằng mọi ứng dụng Angular hoặc mọi response SSR đều bị ảnh hưởng.

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

Response của một người dùng đã xác thực có thể được tuần tự hóa vào HTML SSR rồi được CDN, reverse proxy hoặc application cache dùng lại giữa nhiều session. Điều này có thể làm lộ dữ liệu riêng tư hoặc dữ liệu theo người dùng cho các visitor không được phép truy cập, biến một cache entry của trang thành sự cố rò rỉ dữ liệu giữa các tài khoản. Bằng chứng hiện có xác nhận tác động đến tính bảo mật, nhưng không xác lập việc sửa đổi dữ liệu, gián đoạn dịch vụ hoặc một vụ xâm nhập cụ thể.

Cách khắc phục

  1. Nâng cấp @angular/common lên bản sửa tương ứng với nhánh đang sử dụng: 20.3.28, 21.2.20 hoặc 22.1.1. Với 19.2.25 và các bản cũ hơn, advisory cho biết nhánh này đã hết hỗ trợ và không được vá, vì vậy cần chuyển sang một nhánh được hỗ trợ có bản sửa.
  2. Nếu chưa thể nâng cấp, gắn credential trực tiếp tại child request hoặc bằng interceptor được cấu hình trên child HttpClient, thay vì chỉ dựa vào interceptor của parent.
  3. Dùng withHttpTransferCacheOptions để loại trừ rõ ràng các endpoint trả về dữ liệu theo người dùng hoặc dữ liệu nhạy cảm khỏi HTTP transfer cache.
  4. Tắt transfer caching cho các route SSR xử lý dữ liệu đã xác thực.
  5. Đảm bảo HTML personalized được gửi với chính sách Cache-Control: private hoặc no-store để CDN, reverse proxy và application cache không chia sẻ response giữa các người dùng.

Cách phát hiện

  1. Kiểm kê phiên bản package @angular/common trong các ứng dụng có SSR, đồng thời xác định ứng dụng nào sử dụng hydration.
  2. Rà soát cấu hình để tìm provideClientHydration(), child provideHttpClient(withRequestsMadeViaParent()) và các parent interceptor thêm Authorization, cookie hoặc API token.
  3. Kiểm tra CDN, reverse proxy và application cache để xác định HTML SSR có bị chia sẻ giữa nhiều người dùng hay không. Xác nhận các trang personalized có được đánh dấu private hoặc no-store hay chưa.
  4. Trong môi trường kiểm thử có kiểm soát, kiểm tra HTML SSR và dữ liệu JSON trong ng-state để tìm response của endpoint dành riêng cho người dùng hoặc dữ liệu nhạy cảm.
  5. So sánh hành vi cache của cùng trang bằng các danh tính kiểm thử đã xác thực và chưa xác thực, tập trung vào việc response của người dùng trước có xuất hiện trong HTML của request sau hay không.
  6. Theo dõi cache hit trên các trang SSR personalized như một biện pháp phòng ngừa. Đây là tín hiệu giám sát chung, không phải indicator đã được nguồn xác nhận.
Nguồn (24)
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.