Path traversal làm lộ trang prerendered từ thư mục anh em trong Angular SSR

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

Lỗ hổng CVE-2026-104871 là lỗ hổng Improper Limitation of a Pathname to a Restricted Directory ảnh hưởng tới angular-cli (phiên bản bị ảnh hưởng: < 20.3.36, >= 21.0.0, < 21.2.23 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 6.3. Các nguồn hiện có chưa ghi nhận lỗ hổng này bị khai thác.

Giới thiệu chung

Dữ liệu gốc

Angular SSR là một công cụ kết xuất phía máy chủ cho các ứng dụng Angular. Trước các phiên bản 20.3.36, 21.2.23 và 22.1.7, logic lấy trang prerendered của CommonEngine retrieveSSGPage trong @angular/ssr/node, và trong @angular/ssr đối với các phiên bản từ 17 đến 18, chấp nhận URL request tương đối chứa một đoạn parent-traversal sử dụng dấu gạch chéo ngược trên Windows. Cơ sở URL resolve:// không đặc biệt giữ nguyên dấu gạch chéo ngược, path.join diễn giải nó như dấu phân cách Windows, và phép kiểm tra pagePath.startsWith(normalize(publicPath)) chấp nhận sai một thư mục output anh em có tên dùng chung tiền tố với thư mục public đã cấu hình. Do đó, một requester chưa xác thực có thể lấy một trang HTML prerendered từ thư mục anh em khi trang đó chứa marker Angular SSG. Lỗi chỉ giới hạn ở các triển khai Windows truyền URL request tương đối vào CommonEngine.render, có thư mục output anh em dùng chung tiền tố và có HTML Angular prerendered đáp ứng điều kiện; lỗi không cung cấp khả năng đọc tệp tùy ý. Lỗi này đã được sửa trong các phiên bản 20.3.36, 21.2.23 và 22.1.7.

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

  • @angular/ssr và logic CommonEngine bị ảnh hưởng trong nhánh >= 22.0.0, < 22.1.7.
  • Nhánh >= 21.0.0, < 21.2.23 bị ảnh hưởng.
  • Nhánh >= 20.0.0, < 20.3.36 bị ảnh hưởng.
  • Vendor advisory cũng xác định các phiên bản <= 19.2.27 bị ảnh hưởng và đã hết hỗ trợ, không được vá. Điều này bao gồm phạm vi v17 đến v18 được nêu trong record chuẩn hóa.
  • Điều kiện phơi nhiễm vẫn phải đồng thời tồn tại: triển khai Windows dùng CommonEngine, truyền URL tương đối, có thư mục anh em dùng chung tiền tố với publicPath, và có HTML prerendered chứa marker Angular SSG.

Chi tiết kỹ thuật

Lỗi nằm trong logic retrieveSSGPage của CommonEngine, thuộc @angular/ssr/node và các bản trước đó của @angular/ssr. Khi ứng dụng truyền URL tương đối do người dùng kiểm soát vào CommonEngine.render, URL có thể chứa đoạn parent traversal sử dụng dấu gạch chéo ngược trên Windows.

Cơ chế lỗi gồm các bước chính:

  1. Cơ sở URL không đặc biệt resolve:// giữ nguyên dấu gạch chéo ngược trong pathname.
  2. path.join xử lý dấu gạch chéo ngược như dấu phân cách đường dẫn trên Windows, khiến đường dẫn được ghép có thể thoát khỏi thư mục publicPath và trỏ tới thư mục anh em.
  3. Kiểm tra pagePath.startsWith(normalize(publicPath)) chỉ so khớp tiền tố, không yêu cầu dấu phân cách thư mục ở cuối. Vì vậy, một thư mục anh em có tên bắt đầu bằng cùng tiền tố vẫn có thể vượt qua kiểm tra.
  4. Nếu tệp đích tồn tại và chứa marker Angular SSG, CommonEngine sẽ đọc và trả về trang prerendered đó thay vì render route được yêu cầu.

Điều kiện khai thác gồm triển khai trên Windows, sử dụng CommonEngine, truyền URL tương đối, có thư mục anh em dùng chung tiền tố với publicPath, và có HTML prerendered chứa marker Angular SSG. Cơ chế triển khai chính xác của từng ứng dụng, cấu trúc route và nội dung cụ thể của trang bị lộ không được xác định trong bằng chứng hiện có.

Khả năng khai thác

Lỗi có thể bị khai thác qua mạng bởi requester chưa xác thực và không yêu cầu tương tác của người dùng. Việc khai thác phụ thuộc vào các điều kiện triển khai cụ thể: ứng dụng phải chạy trên Windows, nhận URL tương đối trong CommonEngine.render, có thư mục output anh em phù hợp và có trang HTML prerendered đáp ứng điều kiện SSG.

Độ phức tạp của yêu cầu gửi tới dịch vụ không cao, nhưng các điều kiện triển khai nói trên phải tồn tại trước. Bằng chứng được cung cấp không xác lập trạng thái khai thác thực tế; record cũng không đánh dấu có public exploit. Điều này không chứng minh rằng chưa từng có hoạt động khai thác.

Tác động kỹ thuật

  • Kết quả kỹ thuật là truy cập trái phép vào các trang HTML prerendered trong thư mục output anh em có tên dùng chung tiền tố với publicPath.
  • Kẻ tấn công không cần tài khoản hoặc quyền trước đó và không cần người dùng khác tương tác, nhưng phải gặp đúng cấu hình Windows và cấu trúc output cần thiết.
  • Phạm vi dữ liệu bị lộ chỉ gồm các HTML phù hợp với marker Angular SSG. Cơ chế này không cung cấp khả năng đọc tùy ý các tệp không phải Angular, tệp bí mật hoặc tệp cấu hình không có marker phù hợp.
  • Bằng chứng hiện có không cho thấy thay đổi tính toàn vẹn, suy giảm tính sẵn sàng, leo thang đặc quyền hoặc thực thi mã. Hệ quả tổ chức chủ yếu là lộ nội dung của ứng dụng hoặc build output vốn không dự định công khai.

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

  • Người dùng chưa xác thực có thể truy cập trái phép nội dung HTML prerendered từ một ứng dụng hoặc build output nằm trong thư mục anh em phù hợp.
  • Nếu thư mục anh em chứa trang nội bộ, chẳng hạn giao diện quản trị hoặc nội dung chỉ dành cho người dùng hạn chế, dữ liệu được render vào các trang đó có thể bị tiết lộ.
  • Lỗi ảnh hưởng đến tính bí mật của nội dung trang, nhưng bằng chứng hiện có không cho thấy khả năng sửa đổi tệp, thực thi mã hoặc làm gián đoạn dịch vụ.
  • Phạm vi tác động bị giới hạn bởi Windows, cách truyền URL, quy tắc đặt tên thư mục và sự hiện diện của marker Angular SSG; không phải mọi triển khai Angular SSR đều phơi nhiễm.

Cách khắc phục

  1. Nâng cấp theo đúng nhánh đang sử dụng lên bản đã sửa: 22.1.7, 21.2.23 hoặc 20.3.36. Không suy diễn trạng thái của các nhánh khác nếu chưa được xác minh.
  2. Nếu đang ở nhánh <= 19.2.27, chuyển sang một nhánh còn được hỗ trợ và áp dụng bản sửa tương ứng, vì nhánh này đã hết hỗ trợ và không được vá.
  3. Trước khi áp dụng bản sửa, với các triển khai Windows còn dùng CommonEngine, chuẩn hóa URL request trước khi truyền vào CommonEngine.render: thay dấu gạch chéo ngược bằng dấu gạch chéo xuôi hoặc xây dựng một absolute HTTP URL.
  4. Cân nhắc chuyển từ CommonEngine đã deprecated sang AngularNodeAppEngine, theo hướng dẫn của vendor, để dùng cơ chế route dựa trên manifest thay vì phân giải đường dẫn tệp trực tiếp.
  5. Sau khi thay đổi, kiểm tra lại inventory phiên bản, publicPath, cấu trúc thư mục output và đường đi request của ứng dụng để bảo đảm không còn triển khai thỏa các điều kiện phơi nhiễm.

Cách phát hiện

  • Lập danh mục các máy chủ Windows chạy Angular SSR và xác định ứng dụng có sử dụng @angular/ssr/node, @angular/ssr hoặc CommonEngine.
  • Kiểm tra mã máy chủ, đặc biệt server.ts và các adapter HTTP, để tìm việc truyền req.url hoặc req.originalUrl dưới dạng URL tương đối vào CommonEngine.render.
  • Kiểm tra giá trị publicPath và cấu trúc thư mục output để phát hiện thư mục anh em có tên dùng chung tiền tố với thư mục public.
  • Xác định các thư mục anh em có HTML prerendered chứa marker Angular SSG. Đây là điều kiện phơi nhiễm, không phải bằng chứng đã bị truy cập.
  • Như một biện pháp rà soát bổ sung, xem log request để tìm các URL có chuỗi parent traversal dùng dấu gạch chéo ngược và đối chiếu với các response trả về trang prerendered. Không có IOC hoặc log event cụ thể nào được xác nhận trong bằng chứng hiện có.
Nguồn (13)
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.