Lỗi vượt qua bộ lọc URL của nuxt-content @nuxtjs/mdc dẫn đến 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-63671 là gì?

Lỗ hổng CVE-2026-63671 là lỗ hổng thuộc các loại Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') và Incomplete List of Disallowed Inputs, ảnh hưởng tới mdc (phiên bản bị ảnh hưởng: < 0.22.1). Lỗ hổng này được xếp hạng ở mức Cao, với điểm CVSS 8.1. 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

MDC là một công cụ nhận Markdown thông thường và tạo các tài liệu tương tác sâu với một Vue component. Trước 0.22.1, @nuxtjs/mdc sử dụng parseMarkdown với allowDangerousHtml được bật theo mặc định và dựa vào validateProps, validateProp cùng unsafeLinkPrefix để loại bỏ các URL có thể thực thi khỏi Markdown không tin cậy. validateProp chỉ kiểm tra các thuộc tính có tên href hoặc src, cho phép một giá trị SVG xlink:href được biểu diễn thành xLinkHref giữ lại URL javascript: và thực thi trong page origin khi được chọn. Các mục data:text/html trong denylist cũng được so sánh với url.protocol, mà giá trị này chỉ là data:, vì vậy một iframe src chứa data:text/html vượt qua quá trình làm sạch và thực thi trong opaque origin khi được tải. Các URL href javascript: thông thường, srcdoc, object, script và base đã bị chặn, khiến hai đường đi này là các khoảng trống cụ thể trong sanitizer. Vấn đề này được sửa trong phiên bản 0.22.1.

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

  • Package npm @nuxtjs/mdc của vendor nuxt-content bị ảnh hưởng ở các phiên bản < 0.22.1.
  • Advisory xác định 0.22.1 là phiên bản đã được vá cho hai khoảng trống trong URL sanitizer.
  • Bản ghi không cung cấp các nhánh song song hoặc trạng thái của các nhánh phát hành khác ngoài ranh giới nêu trên; không nên suy ra trạng thái của các nhánh chưa được xác minh.

Chi tiết kỹ thuật

@nuxtjs/mdc chuyển Markdown không tin cậy, bao gồm raw HTML, thành cây component Vue. parseMarkdown bật allowDangerousHtml theo mặc định, vì vậy bộ lọc thuộc tính và URL là lớp kiểm soát chính trước khi nội dung được render.

  1. validateProp chỉ kiểm tra scheme đối với các thuộc tính có tên chính xác là href hoặc src. Giá trị SVG xlink:href được biểu diễn thành xLinkHref, không đi qua nhánh kiểm tra này, sau đó được renderer chuyển lại thành thuộc tính xlink:href; vì vậy URL javascript: có thể còn lại và chạy trong page origin khi người dùng chọn liên kết.
  2. Danh sách chặn có các mục như data:text/html, nhưng mã cũ so sánh chúng với url.protocol, trong khi protocol của mọi data URI chỉ là data:. Do đó, iframe có src chứa data:text/html có thể vượt qua kiểm tra và thực thi script khi được tải trong opaque origin.

Dữ liệu đầu vào do kẻ tấn công kiểm soát là Markdown không tin cậy được ứng dụng đưa vào parser. Các thuộc tính href thông thường chứa javascript:, cùng với srcdoc, object, script và base, đã được chặn; vấn đề này là hai khoảng trống cụ thể trong sanitizer. Bản ghi cho thấy đường tấn công có thể được truy cập qua mạng và không yêu cầu đặc quyền, nhưng ứng dụng vẫn phải thực sự render nội dung do kẻ tấn công kiểm soát.

Khả năng khai thác

  • Khả năng tiếp cận: Kẻ tấn công cần đưa Markdown không tin cậy vào một ứng dụng sử dụng parser bị ảnh hưởng. Bản ghi đánh giá đường đi này là network-reachable và không yêu cầu đặc quyền.
  • Tương tác người dùng: Nhánh SVG cần người dùng chọn liên kết xlink:href; nhánh iframe thực thi khi tài liệu được tải, không cần thao tác chọn liên kết.
  • Độ phức tạp: Bản ghi mô tả điều kiện khai thác có độ phức tạp thấp khi ứng dụng đã render nội dung không tin cậy theo cấu hình mặc định.
  • Trạng thái công khai: Advisory của dự án kèm proof of concept và ghi nhận cả hai vector đã thực thi trong một bản Chromium hiện hành. Bản ghi không xác nhận một chiến dịch hoặc vụ khai thác thực tế cụ thể.

Tác động kỹ thuật

  • Kết quả kỹ thuật là thực thi JavaScript thông qua hai bypass của sanitizer, thay vì chỉ hiển thị Markdown như dữ liệu.
  • Script từ SVG chạy trong page origin khi liên kết được chọn, vì vậy có thể truy cập hoặc sửa các tài nguyên mà origin của trang cho phép; mức độ cụ thể phụ thuộc vào ứng dụng và phiên người dùng.
  • Script trong iframe chạy khi iframe tải trong opaque origin. Điều này vẫn tạo ra thực thi mã trong trình duyệt nhưng không đồng nhất với quyền truy cập same-origin của page origin.
  • Đường SVG cần user interaction, còn đường iframe có thể thực thi khi tải. Bản ghi không cho thấy ảnh hưởng đến availability và không xác nhận một vụ xâm phạm thực tế.

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

  • Nội dung Markdown không tin cậy có thể phá vỡ ranh giới giữa dữ liệu và mã thực thi trong các trang được render bằng @nuxtjs/mdc.
  • Nhánh SVG có thể chạy script trong page origin sau khi người dùng chọn liên kết, nên tác động thực tế có thể bao gồm đọc hoặc thay đổi dữ liệu và giao diện mà trang đó cho phép truy cập.
  • Nhánh iframe chạy script trong opaque origin, làm phát sinh nội dung thực thi trong trình duyệt nhưng có giới hạn khác với script chạy trong page origin.
  • Tác động đến một tổ chức phụ thuộc vào loại dữ liệu và thao tác có sẵn trong ứng dụng. Bằng chứng không cho phép kết luận đã xảy ra rò rỉ dữ liệu, thay đổi trái phép hoặc xâm nhập cụ thể.

Cách khắc phục

  1. Nâng cấp @nuxtjs/mdc lên chính xác phiên bản 0.22.1, là phiên bản được advisory xác định đã vá.
  2. Nếu chưa thể nâng cấp, áp dụng bản sửa upstream trong một backport được kiểm thử: kiểm tra xlinkhref bằng cùng chính sách với href và src, đồng thời so sánh các tiền tố nguy hiểm với URL đầy đủ để bắt được data:text/html.
  3. Rà soát các ứng dụng đang render Markdown không tin cậy và hạn chế đường đi này cho đến khi bản vá được triển khai. Việc thay đổi cấu hình raw HTML chỉ nên được xem là biện pháp giảm thiểu sau khi xác nhận nó thực sự loại bỏ đường render bị ảnh hưởng.
  4. Kiểm tra các nội dung Markdown đã lưu và quy trình nhập liệu sau khi cập nhật, đặc biệt các nội dung có SVG xlink:href hoặc iframe dùng data:text/html.

Cách phát hiện

  1. Kiểm kê các ứng dụng dùng package @nuxtjs/mdc và xác định phiên bản thực tế trong lockfile, image hoặc artifact triển khai.
  2. Kiểm tra đường xử lý Markdown để xác định parseMarkdown có nhận raw HTML theo cấu hình mặc định hay không, và liệu ứng dụng có render nội dung do người dùng hoặc nguồn bên ngoài cung cấp hay không.
  3. Nếu sanitizer đã được vendored hoặc tùy biến, rà soát validateProps, validateProp, unsafeLinkPrefix, phép kiểm tra thuộc tính xLinkHref và việc so sánh denylist với URL đầy đủ thay vì chỉ url.protocol.
  4. Rà soát nội dung Markdown đã lưu và các nguồn nhập liệu để tìm SVG anchor dùng xlink:href và iframe có src bắt đầu bằng data:text/html.
  5. Trong môi trường kiểm thử, xác nhận parser loại bỏ các thuộc tính hoặc nguồn này và không còn giữ xLinkHref hay iframe src tương ứng. Không có IOC hoặc mẫu log cụ thể được xác nhận; việc không thấy log không chứng minh hệ thống an toàn.
Nguồn (12)
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.