2 điểm bởi GN⁺ 2025-12-07 | 1 bình luận | Chia sẻ qua WhatsApp
  • Một kỹ thuật clickjacking mới sử dụng bộ lọc SVG được giới thiệu, mở rộng các cuộc tấn công dụ nhấp chuột đơn giản trước đây thành các cuộc tấn công tương tác phức tạp hơn
  • Đã xác nhận rằng các phần tử bộ lọc SVG như feColorMatrix, feDisplacementMap có thể được áp dụng cả với iframe cross-origin, từ đó cho phép thao túng trực quan và trích xuất dữ liệu
  • Bằng cách kết hợp các bộ lọc, có thể thực hiện đọc pixel, phép toán logic và thao tác UI theo điều kiện, giúp triển khai các cuộc tấn công clickjacking nhiều bước hoặc tấn công dẫn dụ nhập liệu
  • Trong trường hợp thực tế, một cuộc tấn công sử dụng lỗ hổng Google Docs đã thành công, và nhà nghiên cứu nhận được phần thưởng $3133.70 từ Google VRP
  • Kỹ thuật này làm lộ ra một bề mặt tấn công mới trong mô hình bảo mật trình duyệt, cho thấy cách khai thác logic của bộ lọc SVG có thể phát triển thành mối đe dọa an ninh

Tổng quan về clickjacking SVG

  • Clickjacking truyền thống có cấu trúc tấn công đơn giản: chồng một iframe lên trên để khiến người dùng vô tình nhấp chuột
  • Clickjacking SVG mới được đề xuất sử dụng bộ lọc SVG để cho phép tương tác phức tạp và rò rỉ dữ liệu
  • Các bộ lọc như feColorMatrixfeDisplacementMap có thể được áp dụng lên cả tài liệu cross-origin, nên có thể thao túng trực quan nội dung bên ngoài

Các thành phần của bộ lọc SVG

  • Các phần tử bộ lọc chính gồm <feImage> , <feFlood> , <feOffset> , <feDisplacementMap> , <feGaussianBlur> , <feTile> , <feMorphology> , <feBlend> , <feComposite> , <feColorMatrix> ...
  • Chúng kết hợp và biến đổi ảnh đầu vào để tạo ra ảnh mới, và có thể nối với nhau theo dạng chuỗi
  • Thông qua các tổ hợp này, kẻ tấn công có thể tự do triển khai hiệu ứng hình ảnh, masking và thao tác màu sắc

Ví dụ tấn công

  • Captcha giả (fake captcha): dùng feDisplacementMap để làm méo văn bản, dụ người dùng nhập mã nhạy cảm
  • Ẩn chữ màu xám (grey text hiding): dùng feCompositefeMorphology để xóa phần hướng dẫn hoặc thông báo lỗi trong ô nhập, khiến người dùng nhập mật khẩu do kẻ tấn công chỉ định
  • Đọc pixel (pixel reading): phát hiện màu của một pixel cụ thể và điều khiển hoạt động của bộ lọc dựa trên đó, từ đó hiện thực hóa các cuộc tấn công phản ứng động như phát hiện nhấp nút, hover, trạng thái nhập liệu

Phép toán logic và tấn công phức hợp

  • Có thể kết hợp feBlendfeComposite để hiện thực các cổng logic như AND, OR, XOR, NOT
  • Nhờ vậy, có thể xây dựng mạch logic hoàn chỉnh ngay bên trong bộ lọc SVG, từ đó tự động hóa các kịch bản clickjacking nhiều bước
  • Ví dụ, trong cuộc tấn công vào ứng dụng “Securify”, cấu trúc lừa người dùng được triển khai bằng cách điều khiển logic nhiều bước như mở hộp thoại, nhấp checkbox, nhấp nút

Trường hợp thực tế: lỗ hổng Google Docs

  • Trong Google Docs, popup và ô nhập xuất hiện sau khi nhấp nút “Generate Document” được phát hiện và thao túng bằng logic dựa trên bộ lọc SVG
  • Trạng thái focus của ô nhập, chữ màu xám và màn hình loading được phát hiện theo thời gian thực để điều khiển luồng tấn công
  • Cuộc tấn công này đã được báo cáo cho Google và mang lại bug bounty $3133.70

Ứng dụng với mã QR

  • Có thể triển khai logic tạo mã QR ngay trong bộ lọc SVG, mã hóa dữ liệu pixel thành URL rồi hiển thị dưới dạng QR
  • Khi người dùng quét mã QR, dữ liệu sẽ được gửi tới máy chủ do kẻ tấn công kiểm soát
  • Dùng feDisplacementMapsửa lỗi Reed–Solomon để tạo mã QR có thể quét được

Các khả năng khai thác bổ sung

  • Có thể mở rộng sang nhiều kiểu tấn công khác như đọc văn bản, rò rỉ dữ liệu dựa trên thao tác nhấp chuột, chèn con trỏ chuột giả
  • Cuộc tấn công có thể được triển khai chỉ với CSS/SVG mà không cần JavaScript, nên có khả năng vượt qua CSP

Ý nghĩa nghiên cứu

  • Clickjacking dựa trên phép toán logic bằng bộ lọc SVG là một kỹ thuật tấn công mới chưa từng được đề cập trong các nghiên cứu trước đây
  • Các nghiên cứu cũ chỉ nhắc tới SVG như công cụ che phủ trực quan đơn giản, còn nghiên cứu này chứng minh khả năng thực thi logic và điều khiển tương tác
  • Nhà nghiên cứu xem đây là một lớp lỗ hổng mới, đồng thời nhấn mạnh sự cần thiết phải xem xét lại hệ thống bảo mật trình duyệt

Kết luận

  • Nghiên cứu này được đánh giá là trường hợp tấn công bảo mật đầu tiên sử dụng bộ lọc SVG như một ngôn ngữ lập trình
  • Tác giả dự kiến sẽ trình bày nội dung liên quan tại 39c3Disobey 2026 vào cuối năm 2025
  • Bài viết được tạo ra chỉ bằng 42kB HTML/CSS/SVG, không dùng ảnh hay JS, cho thấy tính sáng tạo của nghiên cứu bảo mật thử nghiệm

1 bình luận

 
GN⁺ 2025-12-07
Ý kiến Hacker News
  • Nếu nhà phát triển cấu hình đúng header X-Frame-Options thì vấn đề này sẽ được giải quyết
    Nhưng trên thực tế, có lẽ người ta sẽ phản ứng kiểu đuổi theo các vấn đề bảo mật rồi xóa một nửa đặc tả SVG khỏi trình duyệt

    • Vẫn chưa được giải quyết hoàn toàn. Một số ứng dụng (ví dụ: Google Docs) cần được nhúng trong frame
      Ngoài ra, cuộc tấn công này cũng có thể thực hiện trên các trang cho phép chèn HTML chứ không chỉ qua frame
    • SVG có quá nhiều bãi mìn bảo mật. Đặc biệt khi không đáng tin cậy, như SVG do người dùng cung cấp, thì cách đơn giản nhất là cứ vô hiệu hóa nó
  • Tôi đã tắt SVG từ trước vì lý do bảo mật
    Nhưng dạo này tôi còn nghĩ có lẽ phải vô hiệu hóa cả CSS
    Giá mà CSS vẫn chỉ là thứ dùng để trang trí văn bản thì tốt biết mấy, giờ nó đã biến thành gần như một ngôn ngữ lập trình, rất dễ bị hacker hay nhà quảng cáo lạm dụng

    • Tôi đồng cảm với ý “giá mà CSS cứ đơn giản”, nhưng thật ra các kiểu tấn công như thế này còn dễ hơn nhiều vào cuối những năm 2000
      Bây giờ thì gần như không thể nữa
    • Tôi nghĩ thay vì làm hỏng trình duyệt để tăng cường bảo mật, tốt hơn là giữ chính dữ liệu nhạy cảm ở ngoài trình duyệt
    • Cốt lõi vấn đề không phải CSS mà là iFrame. Nó đã là nguồn gốc của các lỗ hổng bảo mật liên miên từ thuở đầu của trình duyệt
    • Ngoài bản demo này ra, tôi tò mò không biết còn lý do bảo mật nào khác không. Trên hầu hết nền tảng, cuộc tấn công này không hoạt động
    • Đó là phản ứng thái quá. Xác suất dính kiểu tấn công này là rất thấp, và nó cũng không thể vượt qua sandbox hay session cookie
  • Khi xem “ví dụ phát hiện xem pixel có phải màu đen thuần túy hay không để bật hoặc tắt bộ lọc”, tôi thực sự thấy rối hoàn toàn
    Tôi không hiểu vì sao HTML/CSS lại trở nên phức tạp đến vậy
    <checkbox><label> ẩn, khi bấm thì checkbox được bật/tắt, rồi chỉ bằng CSS mà style thay đổi theo trạng thái
    SVG thực ra không vẽ gì cả mà chỉ định nghĩa bộ lọc
    Việc dùng tới hai <feTile> để tách riêng vùng lát gạch và vùng đầu ra cũng rất kỳ lạ
    Mấy phần tử như <fake-frame> hay <art-frame> lại là cái gì nữa?

    • Tôi thấy cấu trúc này khá ngầu. Có thể tạo nội dung tương tác mà không cần JavaScript
      Việc bấm <label> để bật/tắt checkbox là hành vi mặc định của HTML
      Nó dùng bộ chọn :has() của CSS để phát hiện trạng thái
      <feTile> là một phần tử bộ lọc đơn, dùng để lát ảnh đầu vào hoặc crop nó
      <fake-frame><art-frame> là các custom element do tác giả tự định nghĩa
      Nội dung liên quan đã được tổng hợp trong bài blog
    • Thật ra phần lớn các tính năng này không hẳn là “hiện đại” mà là đã tồn tại từ thập niên 90
      Việc bấm <label> để chuyển focus là truyền thống từ desktop UI
      Chức năng đổi style theo trạng thái checkbox cũng đã có từ thời Firefox 1
      Việc nhúng trực tiếp bộ lọc SVG vào HTML cũng là tính năng có từ lâu
      Nói cách khác, đây không phải vấn đề của HTML mới mà là sự kết hợp của các tính năng cũ
  • Bản demo này khiến tôi nhớ đến kiểu hack Flash Player ngày xưa
    Nó giống cách lừa người dùng cho phép truy cập bộ nhớ hệ thống
    Đồ họa vector đúng là thứ dường như không thể tự kiểm soát chính mình

  • SVG adder đúng là một tác phẩm nghệ thuật. Thật sự rất ấn tượng

    • Đây là một demo cực kỳ mạnh. Hôm nay tôi mới biết rằng để có Turing completeness thì chỉ có tính hoàn chỉnh hàm là chưa đủ, mà còn cần bộ nhớ và truy cập tùy ý
      Tôi tham khảo thêm trong bài viết trên Stack Overflow
  • Trên Chrome Android của tôi (chính xác hơn là trình duyệt Kiwi), màn hình bị vỡ hoặc hiển thị lạ, có lẽ do dark mode
    Tôi tò mò không biết người khác có gặp hiện tượng này không

    • Trên Firefox, phải tắt Dark Reader thì ví dụ mới hiển thị đúng
    • Khi mức zoom không phải 100% thì ví dụ liên quan đến QR bị lỗi
  • Bài này làm tôi nhớ đến demo tính toán bằng CSS mà tôi từng xem trước đây

  • Thật sự là một công trình rất ấn tượng. Tôi chưa biết nên giải quyết thế nào, nhưng cần được vá sớm

  • Một bài đăng quá hay. Tôi đã rất thích thú trong suốt lúc đọc