Clickjacking: Quá khứ, hiện tại và tương lai

12:02 | 22/05/2012

Clickjacking là một loại hình tấn công liên quan trực tiếp với người dùng và không thể diễn ra nếu không có sự tham gia của người dùng. Theo nghĩa nào đó, Clickjacking một kỹ thuật nhằm đánh cắp các “cú click” của người dùng.

Clickjacking là gì?
Khi thực hiện một cú click, người dùng nghĩ là mình nhấn chuột lên một đối tượng đang hiển thị trên màn hình, nhưng thực ra lại đang truy cập vào một trang web hoàn toàn khác. Điều đó xảy ra là do một số tính chất của ngôn ngữ HTML đã bị lợi dụng, như: Một trang web có thể chứa một trang web khác bằng cách sử dụng thẻ iframe Các phần tử của trang web (HTML element) có thể tồn tại ở dạng hiện rõ, bị làm mờ, hoặc bị ẩn hoàn toàn; Nếu các HTML element chồng lên nhau thì thứ tự chồng chất được quyết định bởi một tham số đặc biệt, gọi là z- index.
Như vậy, một phần tử HTML có thể được thiết lập để đặt trước tất cả mọi phần tử HTML khác, nhưng lại tồn tại ở dạng ẩn và phần tử  HTML đó có thể là một trang web được tải về nhờ thẻ iframe. Trong cách thức tiến hành tấn công Clickjacking, kẻ tấn công sẽ dùng thẻ iframe để mở một trang web mà chúng muốn người dùng nhấn chuột vào, đồng thời đặt iframe (được thiết lập ở chế độ ẩn) đó phía trên trang web đang được hiển thị trên trình duyệt của người dùng. Việc này có thể thực hiện được bằng cách sử dụng Cascading Style Streets (CSS), với tham số opacity để thiết lập tính ẩn và tham số z-index để thiết lập thứ tự xếp chồng. Kết quả là khi người dùng nhấn chuột vào trang web mà anh ta đang xem thì cú nhấn chuột đó lại được tính là thực hiện trên trang web (ẩn) của kẻ tấn công. Để người dùng nhấn chuột vào đúng vị trí mà kẻ tấn công mong muốn, chúng sẽ sử dụng tính năng định vị tuyệt đối của CSS để thiết lập cho vị trí đó trùng với vị trí của vùng trên trang web đang hiện mà có nhiều khả năng người dùng sẽ nhấn chuột vào.

Thực hiện tấn công Clickjacking
Ban đầu, Clickjacking được hacker sử dụng để kiếm tiền quảng cáo trên mạng. Để thực hiện Clickjacking, kẻ tấn công sẽ lôi kéo người dùng truy cập vào trang web đã bị cài mã Clickjacking. Cách sơ đẳng nhất (nhưng vẫn được dùng khá phổ biến hiện nay) để khiến người dùng nhấp chuột, đó là hiển thị một thông báo trên trang web mà người dùng đang xem, rằng anh ta đã trúng một giải thưởng nào đó, rồi yêu cầu người dùng truy cập vào đường link nhất định để xem chi tiết chương trình trúng thưởng đó.
Nếu người dùng tin vào thông báo và nhấn chuột có thể vào đường link “Cách nhận giải thưởng” thì cú nhấn chuột được tính là nhấn vào dòng quảng cáo cho Amazon của Bing (được đặt ở chế độ ẩn). Kết qủa là kẻ tấn công sẽ được trả một khoản tiền nhất định.
Tuy nhiên, hình thức tấn công này cũng có thể được sử dụng với mục đích khác, ví dụ như lừa người dùng nhấn vào nút “Retwit” hay nút “Like” cho những dòng tin của kẻ tấn công, hoặc quy mô hơn, như cài một Web Shell server lên máy chủ web.
Việc sử dụng Clickjacking có thể cài (trái phép) một Web Shell server lên một máy chu
web. Tấn công này thực ra chỉ hướng đến một ứng dụng cụ thể, nhưng rất phổ biến hiện nay, đó là WordPress. Nguyên nhân dẫn đến khả năng tấn công không chỉ nằm trong bản thân WordPress mà còn do các môđun mở rộng (plugin). Việc mở trang để cài đặt plugin là quá đơn giản. Trong trang quản trị website, chỉ cần mở kho lưu trữ ra, chọn một plugin và nhấn nút Install Now (tương tự như trong FireFox). Như vậy, không gì có thể ngăn cản tải trang web này vào một iframe ẩn và đánh lừa cho nạn nhân nhấn lên nút Install Now. Tuy nhiên, bằng cách đó thì plugin mới chỉ được cài đặt chứ chưa được kích hoạt. Nhưng có thể biết chính xác rằng file plugin đó (được phân phối dưới dạng file nén ZIP) nằm ở một thư mục nhất định và có thể truy cập được. Vấn đề là ở chỗ, cần phải cài plugin nào để đạt được mục đích. Có hai sự lựa chọn là: đưa vào kho chứa một plugin có tính năng Trojan (và thực hiện Clickjacking để plugin đó được cài đặt) hoặc tìm một plugin có lỗ hổng bảo mật và khai thác nó. Phương án hai dường như đơn giản hơn, và đã được khai thác. WordPress cũng đã vá lỗ hổng Clickjacking trên đây vào tháng 5/2011 (phiên bản 3.1.3).

Tấn công Clickjacking nâng cao
Dù rằng tấn công trên đây đã mang lại hiệu quả ấn tượng (lấy được shell), nhưng kỹ thuật Clickjacking được sử dụng trong đó là quá đơn giản. Có những kỹ thuật Clickjacking phức tạp hơn nhiều, giúp mở rộng khả năng mà kẻ tấn công có thể đạt được, ví dụ như:
- Có thể khiến người dùng không chỉ đơn giản là nhấn chuột, mà còn thực hiện kéo - thả các đối tượng. Ví dụ, dịch chuyển một đoạn text vào form. Hoặc có thể dịch chuyển text ra khỏi iframe, qua đó kẻ tấn công đạt được khả năng thu được các dữ liệu hữu ích (như thông tin ẩn trên các mạng xã hội chẳng hạn).
- Khiến người dùng nhập dữ liệu (mật khẩu) vào form.
- Có thể điều khiển vùng hiển thị trong iframe thông qua anchor để định vị thuận tiện hơn.
- Có thể thiết kế một iframe ẩn dõi theo sự di chuyển của con trỏ chuột để “cướp lấy” sự kiện nhấn chuột, không cần biết người dùng đã nhấn chuột ở vị trí nào. Và như thế, không phải quan tâm đến vấn đề định vị nữa.
- Có thể thiết kế để người dùng thực hiện nhiều cú nhấn chuột ở các vị trí nhất định. Cách đây không lâu, bằng cách này, hacker đã tấn công lên Flash Player và giành được quyền truy cập tới webcam và microphone trên máy tính của người dùng.

Truy cập trái phép webcam và microphone
Chúng ta đã biết rằng Flash Player có khả năng truy cập đến webcam và microphone. Tính năng này được sử dụng trong rất nhiều ứng dụng web.


Mô hình tấn công Clickjacking

Việc thiết lập cấu hình cho Flash Player có thể được thực hiện ngay từ trang web bằng cách nhấn chuột phải lên đối tượng SWF và chọn “Options...” trong menu ngữ cảnh; Ý tưởng sử dụng Clickjacking để truy cập webcam đã xuất hiện từ một số năm trước. Tác giả của PoC (Proof of Concept) khi đó đã đưa trang cấu hình Flash Player vào trong iframe ẩn; tiếp đó đề nghị người dùng tham gia vào một trò chơi đơn giản: mỗi cú nhấn chuột của người dùng sẽ giúp kẻ tấn công tiến gần hơn đến khả năng truy cập webcam và microphone. Ngay sau đó, Adobe đã nhanh chóng sửa lỗi này bằng cách thêm mã bảo vệ (gọi là framebusting) vào trang cấu hình. Kể từ đó kiểu tấn công này dần bị lãng quên.



Nhưng gần đây một sinh viên của Đại học Stanford đã thực hiện lại thành công kiểu tấn công trên dựa trên tính toán rằng: nếu Adobe không cho phép đưa toàn bộ trang cấu hình vào trong iframe, vậy thì chỉ cần đưa file SWF có chức năng cấu hình Flash Player vào iframe thôi cũng được. Cách làm này đã đạt được kết quả.
Adobe đã vá lỗ hổng này vào cuối tháng 10/2011, sau khi các ẩn phẩm nổi tiếng như Wired và Gizmodo đăng tải thông tin rằng Flash Player cho phép hacker theo dõi người dùng qua webcam.

Chống lại Clickjacking
Có rất nhiều ứng dụng web có thể bị tấn công bởi Clickjacking. Tuy nhiên, kiểu tấn công này cũng có thể dễ dàng ngăn chặn được. Thông thường, để chống lại Clickjacking, người ta sử dụng những kịch bản JavaScript đặc biệt, nhằm ngăn chặn việc hiển thị trang web trong frame. Những snippet như thế được gọi là framebuster hay framekiller và có dạng đơn giản như sau:
if (top.location != location) top.location = self.location;
Kịch bản framebuster bao gồm một cấu trúc điều kiện, nó kiểm tra xem có phải trang web được tải vào trong một frame hay không, và một đoạn mã để thực thi trong trường hợp điều kiện trên là đúng. Tuy nhiên, cách bảo vệ này có thể bị vượt qua một cách dễ dàng. Do vậy, các nhà phát triển ứng dụng đã đưa ra những cách thức kiểm tra phức tạp hơn để chống lại Clickjacking. Một công trình nghiên cứu của các chuyên gia từ Stanford về các dạng framebuster khác nhau và cách vượt qua chúng được đăng trên (http://w2spconf.com/2010/papers/ p27.pdf). Các chuyên gia cũng khẳng định rằng phương pháp này không thể đảm bảo chống lại hoàn toàn Clickjacking.
Phương pháp phòng chống thứ hai (hiệu quả hơn) thuộc về các nhà phát triển trình duyệt. Họ đã đưa vào một header đặc biệt được gọi là X- FRAME- OPTIONS. Header này cho biết trang web có thể được tải vào trong một frame hay không. Header này lần đầu xuất hiện vào năm 2009 và đến nay thì đã được hỗ trợ bởi hầu hết các trình duyệt (Internet Explorer, Safari, Firefox, Chrome). Header X- FRAME-OPTIONS có hai chế đô: DENY – cấm hoàn toàn việc tải trang web vào trong frame; SAMEORIGIN – cho phép tải trang web vào trong frame nếu trang chứa frame thuộc cùng domain với trang web được tải vào trong frame.
Các dự án lớn (trong đó có WordPress) đang dần chuyển sang sử dụng X- FRAME-OPTIONS. Nhưng cách bảo vệ này cũng có những hạn chế. Thứ nhất, header này cần phải đặt trên từng trang web. Thứ hai, những website đa domain không thể sử dụng cách thức này (hiện nay, X- FRAME- OPTIONS chưa hỗ trợ “danh sách webiste trắng”). Và thứ ba, header có thể bị cắt bỏ khi đi qua proxy.

Kết luận
Clickjacking không nguy hiểm bằng SQL Injection hay XSS. Tuy nhiên, hình thức tấn công này lại liên quan trực tiếp đến người dùng và là một phương tiện bổ trợ đắc lực cho kỹ nghệ xã hội (social engineering) và người ta đã thực hiện tấn công Clickjacking nhằm nhiều mục đích khác nhau.

Cần phải nói thêm rằng, việc chống lại Clickjacking có thể được thực hiện cả từ phía nhà phát triển ứng dụng web và người dùng. Môđun mở rộng NoScript cho FireFox (http://addons.mozilla.org/ru/firefox/addon/noscrip) từ lâu đã cho phép chống lại tấn công này. Việc thiết đặt tham số ClearClick sẽ ngăn chặn việc nhấn chuột lên các đối tượng ẩn. Đáng tiếc là chưa thấy có môđun tương tự cho các trình duyệt khác