Kiểm tra chéo: tiết lộ các nỗ lực che giấu dấu vân tay tiêm JavaScript

Bất kỳ ai đang tìm kiếm các giải pháp che giấu dấu vân tay của họ trực tuyến đều có thể bắt gặp những giải pháp sử dụng JavaScript injection: đó là một phương pháp tương đối dễ sử dụng và rẻ tiền. Tuy nhiên, điều đó có nghĩa là nó cũng kém an toàn hơn? Theo nghiên cứu của chúng tôi, câu trả lời đơn giản là có. Hãy tham gia cùng chúng tôi khi chúng tôi giải thích các điểm yếu của nó và chỉ ra phương pháp phát hiện của chúng tôi – bao gồm một đoạn mã liên kết để bạn tự kiểm tra.

Mặt nạ thông qua tiêm JavaScript là gì?

Có ba phương pháp chính để tiếp cận mặt nạ dấu vân tay của trình duyệt. Đó là:

  • tiêm JavaScript
  • cách tiếp cận bản địa
  • lai của hai loại trên
Thông tin: Chúng tôi có ý nghĩa gì khi lấy dấu vân tay?

Các hệ thống phát hiện xem chúng ta có phải là người mà chúng ta nói hay không sẽ thu thập và xây dựng thông tin về chúng ta thành một dấu vân tay riêng biệt, một giá trị xác định chúng ta là duy nhất có thể. Các hệ thống phát hiện có thể đặt câu hỏi bằng cách sử dụng một số chức năng của trình duyệt, được gọi là API. Chẳng hạn, họ có thể hỏi trình duyệt bạn đang sử dụng, hệ điều hành của bạn, ngôn ngữ mà nó hỗ trợ, sau đó kết hợp những điều này để tạo dấu vân tay của bạn. Nếu có sự không nhất quán hoặc thiếu thông tin, đó là một lá cờ đỏ.

Là một tổng quan ngắn gọn, cách tiếp cận gốc sử dụng các tệp thực thi của trình duyệt mới dựa trên các trình duyệt gốc (chưa được tùy chỉnh) như Chromium. Phương pháp này thay thế các giá trị nhất định của dấu vân tay của bạn bằng các giá trị khác cho mục đích che dấu. Đúng như tên gọi, nó chân thực hơn và khó phát hiện hơn, nhưng cần nhiều thời gian và nguồn lực hơn để tồn tại bền vững.

Đối với việc tiêm JavaScript (JS), đó là việc chèn mã vào một trang để ghi đè lên các giá trị của một số thuộc tính nhất định. Hãy giải thích nó bằng một phép loại suy. Nhóm nghiên cứu của chúng tôi thích so sánh việc tiêm JS với luật sư trong cuộc thẩm vấn của cảnh sát. Hình ảnh Saul, luật sư con-of-a-gun trong Better Call Saul của TV ; anh ta bị chen vào giữa bị cáo và cảnh sát, trả lời các câu hỏi của cảnh sát với danh nghĩa của nghi phạm – với mục đích che giấu danh tính của họ. Thay vì phản ánh nghi phạm là ai, các câu trả lời phản ánh người khác mà họ đang bắt chước. Để trở thành một vòng tròn đầy đủ, anh ta đã ghi đè một số thuộc tính.

Theo cách tương tự, việc tiêm JS có thể che giấu các thuộc tính của trình duyệt để làm cho nó trông như thể nó khác với thực tế.

Nó có lẽ được sử dụng phổ biến nhất, vì nó rẻ và dễ dàng, nhưng, như chúng tôi sẽ chỉ ra, sự đánh đổi là nó có thể dễ dàng bị phát hiện.

JS injection được triển khai theo những cách nào?

Các giải pháp che dấu vân tay thích một trong số các cách để tiêm JS. Một số áp dụng nó thông qua các khung tự động hóa trình duyệt như Selenium và Puppeteer. Những người khác vẫn sử dụng tiện ích mở rộng trình duyệt, có lẽ là cách thuận tiện nhất để làm như vậy. Nghiên cứu của chúng tôi cũng cho thấy có thể sử dụng mitmproxy, một proxy HTTPS mã nguồn mở; tuy nhiên, chúng tôi không biết về các giải pháp làm điều này trong tự nhiên.

Nỗ lực tiêm JS thông qua khung tự động hóa trình duyệt, PuppeteerSau đó, phương pháp dễ dàng và khả thi nhất cho một giải pháp để thực hiện tiêm JS là thông qua các tiện ích mở rộng của trình duyệt.

JS injection thông qua tiện ích mở rộng của trình duyệt hoạt động như thế nào?

Như chúng tôi đã giải thích sâu hơn nhiều trong bài viết trước , tiện ích mở rộng là một cách quan trọng để mở rộng chức năng của trình duyệt của chúng tôi. Tiện ích mở rộng được tạo thành từ một số thành phần, như bạn có thể thấy trong sơ đồ bên dưới. Điêu nay bao gôm:

  • manifest.json: tệp mô tả tiện ích mở rộng của chúng tôi
  • tập tin kịch bản nội dung
  • cốt lõi được tạo thành từ các tập lệnh nền

Thử nghiệm tiêm JS trong tự nhiên

Giới thiệu tiện ích mở rộng của chúng tôi

Bây giờ cho phần thú vị! Hãy giới thiệu tiện ích mở rộng trình duyệt rất riêng của chúng tôi, mà chúng tôi sẽ sử dụng làm chuột lang thử nghiệm. Meet Better JS Injection Call – Saul – một giải pháp nghệ thuật để che giấu dấu vân tay.

Đối với những người có đầu óc viết mã, trước tiên, chúng tôi có trung tâm của tiện ích mở rộng, tệp manifest.json. Nó xác định tất cả các khả năng của tiện ích mở rộng của chúng tôi.

{
  "manifest_version": 2,
  "name": "Better JS Injection Call - Saul - A artistic solution for fingerprint masking",
  "version": "1.0.0",
  "content_scripts": [
    {
      "matches": [""],
      "js": ["bettercall.js"],
      "run_at": "document_end",
      "all_frames": true,
      "match_about_blank": true
    }
  ]
}

Sau đó, chúng tôi có tập lệnh nội dung của tiện ích mở rộng, bettercall.js. Đó là điều duy nhất chúng ta cần đưa vào mã JavaScript của mình để che giấu dấu vân tay của trình duyệt. Trong  khối content_script của tệp kê khai ở trên (dòng thứ năm trở đi), bạn sẽ thấy một số hướng dẫn có vẻ vô nghĩa. Về cơ bản, chúng có nghĩa là tập lệnh nội dung của chúng tôi sẽ được thêm vào tất cả các trang web và khung (nói cách khác, một số thành phần HTML tải các trang web hoặc trang HTML khác bên trong trang web mà chúng tôi đang truy cập).

Bây giờ đến logic kinh doanh của tiện ích mở rộng của chúng tôi. Tôi xin giới thiệu với bạn bettercall.js của chúng tôi:


const maskLanguage = (language) => {
  Object.defineProperty(navigator, 'language', {
    get: () => language,
  });
};

const doMask = (method, ...args) => {  
  const stringifiedMethod = method instanceof Function
    ? method.toString()
    : `() => { ${method} }`;
  
  const stringifiedArgs = JSON.stringify(args);

  const scriptContent = `
  (${stringifiedMethod})(...${stringifiedArgs});
    document.currentScript.parentElement
      .removeChild(document.currentScript);
   `;

  const scriptElement = document.createElement('script');
  scriptElement.textContent = scriptContent;
  document.documentElement.append(scriptElement);  
  
  const scriptElement2 = document.createElement('script');
  scriptElement2.textContent = "document.body.innerHTML += 'Injected';";
  document.documentElement.append(scriptElement2);  
  
};

doMask(maskLanguage, 'eo-Multilogin');

Điều này có nghĩa là tiện ích mở rộng của chúng tôi sẽ ghi đè thuộc tính navigator.language, thay đổi nó khỏi ngôn ngữ mà chúng tôi đã đặt thành eo-Multilogin. EO là ký hiệu ngôn ngữ của Esperanto, một ngôn ngữ xây dựng được thiết kế để giúp mọi người giao tiếp toàn cầu dễ dàng.

Mã logic nghiệp vụ này cũng thêm một chuỗi “Đã tiêm” vào phần thân của tất cả các ngữ cảnh được đưa vào, chúng tôi sẽ sử dụng một cờ để giúp chúng tôi hiểu tính toàn diện của tiện ích mở rộng của mình.

Đưa nó vào thực tế

Hãy bật tiện ích mở rộng của chúng ta từ menu chrome://extension và xem điều gì đã xảy ra với navigator.language của chúng ta.

Kỳ vọng của chúng tôi, nếu quá trình tiêm hoạt động, là tiện ích mở rộng của chúng tôi sẽ tự đưa vào tất cả các trang mà trình duyệt của chúng tôi tải, bao gồm cả các khung. Nếu không, thì một hệ thống phát hiện thông minh sẽ hiểu rằng một số thuộc tính đã bị thay đổi.

Hãy tiếp tục ví dụ thẩm vấn của cảnh sát và hình dung các khung mà trang chính mà chúng tôi truy cập tải đến các phòng thẩm vấn trong đồn cảnh sát. Lý tưởng nhất là chúng tôi mong đợi luật sư của mình sẽ ở bên chúng tôi trong suốt quá trình điều tra, giống như chúng tôi mong đợi được tiêm đầy đủ…

<html>
<head>
</head>
<body>
<br>http://www.iframetest.test/iframe.html<br>
<iframe width="100" height="55" id="normalFrame" src="http://www.iframetest.test/iframe.html"></iframe><br>
<br>about:blank<br>
<iframe width="100" height="55" id="aboutBlankFrame" src="about:blank"></iframe><br>
<br>data://<br>
<iframe width="100" height="55" id="dataFrame" src="data:text/html,<html><body></body></html>"></iframe><br>
<br>javascript:<br>
<iframe width="100" height="55" id="jsFrame" src='javascript:const a=0;'></iframe><br>
<br>sandbox<br>
<iframe width="100" height="55" id="sandboxFrame" sandbox src="http://www.iframetest.test/iframe.html"></iframe><br>
<br>srcdoc<br>
<iframe width="100" height="55" id="srcdocFrame" srcdoc="<html><head></head><body></body></html>"></iframe><br>
</body>
</html>

Dưới đây chúng ta thấy kết quả.

Như chúng ta có thể thấy từ cờ “Đã tiêm” tiện dụng của mình, hầu hết đều hiển thị việc tiêm. Tuy nhiên, các khung sử dụng data:// và javascript:// URL thì không. Thật không may, Saul giả định của chúng tôi là một luật sư rất bận rộn và không phải lúc nào cũng ở bên chúng tôi. Vì vậy, trong các phòng thẩm vấn data:// và javascript:// của chúng tôi, trình duyệt của chúng tôi sẽ trả lời một số câu hỏi về chính nó mà không cần luật sư của nó bao quát. Hãy xem điều đó diễn ra như thế nào…

Kiểm tra chéo bằng một cú nhấp chuột

Tất cả chúng ta đều quen thuộc (ít nhất là từ truyền hình) với kỹ thuật kiểm tra chéo của cảnh sát: hỏi đi hỏi lại cùng một câu hỏi cho cùng một người hoặc các thành phần trong một vụ án và theo một thứ tự khác. Nhiều người bị nghi ngờ không thể chịu đựng được và cuối cùng đã tự bỏ cuộc.

Điều này cũng tương tự với trình duyệt nghèo nàn của chúng tôi đã tự tìm thấy mà không có luật sư của mình. Mã JavaScript bên dưới bắt đầu kiểm tra chéo, đặt các câu hỏi tương tự cho trang web và trang phụ mà trang của chúng tôi tải bằng cách sử dụng phần tử khung nội tuyến.

Đây là một trang chứa javascript:// iframe:


<html/>
<iframe id="jsFrame" src="javascript:console.log('hello');"/></iframe/> 
</body/>

Chúng tôi có thể chứng minh rằng người bị thẩm vấn nói dối sau khi kiểm tra chéo. Tập lệnh nội dung của chúng tôi, mặc dù được thiết kế để đưa JavaScript vào để che dấu vân tay, không thể tự đưa vào bên trong khung data:// và javascript://. Vì vậy, kết quả đáng lẽ phải bằng nhau, nhưng không phải vậy.

Nhìn vào phía dưới bên trái và bạn sẽ thấy cái thứ hai hiển thị không phải eo-Multilogin hoặc Esperanto như chúng ta mong đợi, mà là en-US. mắt bò!Vì vậy, sau khi so sánh các câu trả lời được đưa ra bởi navigator.language  của cửa sổ trên cùng  và các khung javascript://, sự khác biệt cho thấy có sự bất thường và nó xứng đáng được báo cáo là một nỗ lực tiêm JavaScript . Và chúng tôi bắt đầu từ đầu, khi chúng tôi nhấn mạnh rằng sự không nhất quán hoặc bất thường trong dấu vân tay của bạn là một dấu hiệu cảnh báo ngay lập tức.

Đối với bạn: thử nghiệm của riêng bạn

Điều gì khác có thể gây ra những điều trên?

Bạn có muốn tự mình thử không?

Đây là mã hoàn toàn mới của chúng tôi, Kiểm tra chéo, để ngăn chặn tất cả những người cố gắng che giấu dấu vân tay của trình duyệt thông qua JS injection.

Hãy tự mình thử: nhấp qua để xem tệp HTML PoC

Mã của chúng tôi thu thập một số thông tin như chuỗi Tác nhân người dùng, dấu vân tay canvas và âm thanh, IP công cộng WebRTC, độ phân giải màn hình, múi giờ từ cả cửa sổ trên cùng và khung nội tuyến, đồng thời tạo giá trị băm từ dữ liệu đã thu thập.

Giá trị băm này được sử dụng làm ID khách truy cập cho cả cửa sổ trên cùng và javascript:// iframe. Sau đó, mã của chúng tôi sẽ so sánh ID khách truy cập thu được từ cả cửa sổ trên cùng và khung nội tuyến. Trong trường hợp các ID khác nhau, nó sẽ báo cáo sự bất thường.

Lưu ý: Chúng tôi sử dụng javascript:// iframe chứ không phải data:// iframe vì các thử nghiệm của chúng tôi cho thấy một số khung tự động hóa trình duyệt đã đưa thành công vào data:// iframe, nhưng không phải với javascript:// iframe.

Tiêm JavaScript trong các tiện ích mở rộng phổ biến

Ngoài các giải pháp thương mại áp dụng phương pháp tiêm JS để che dấu vân tay, cửa hàng Google Chrome trực tuyến có hàng trăm tiện ích mở rộng hứa hẹn ẩn/giả mạo một số thuộc tính trình duyệt như hàm băm canvas, chuỗi Tác nhân người dùng, v.v., thông qua phương pháp tiêm JS.

Chúng tôi đã phân tích một số giải pháp được tải xuống nhiều nhất và nhận thấy rằng chúng có thể được phát hiện bằng phương pháp mà chúng tôi đã đề xuất. Một số tiện ích mở rộng thậm chí còn áp dụng các cách tiếp cận tồi tệ và khó xử hơn như không đưa mã JavaScript vào bên trong khung hình bình thường!

Chúng tôi đã phân tích chúng bằng cách xem phần content_script trong tệp manifest.json của chúng và đã đưa ra kết luận sau:

Đây là một bài học quan trọng cần lưu ý khi bạn xem xét Trình chuyển đổi tác nhân người dùng dành cho Chrome (djflhoibgkdhkhhcedjiklpkjnoahfmg), do Google cung cấp, có hai triệu lượt tải xuống và mặc dù tuyên bố thay đổi chuỗi Tác nhân người dùng, nhưng không ghi đè navigator.userAgent giá trị. Tiện ích mở rộng chỉ chặn yêu cầu HTTP và sửa đổi tiêu đề HTTP Tác nhân người dùng.

Kết luận: Tiêm JavaScript là một rủi ro đáng kể

Chúng tôi chỉ có thể rút ra một kết luận từ các thử nghiệm của mình: sử dụng JavaScript injection để che giấu dấu vân tay của trình duyệt là một rủi ro đáng kể đối với bất kỳ doanh nghiệp nào phụ thuộc vào các giải pháp này để có thể quản lý nhiều tài khoản hoặc hồ sơ.

Áp dụng nó rất dễ dàng và rẻ tiền, vì vậy nó là một giải pháp phổ biến, nhưng như các thí nghiệm của chúng tôi đã chỉ ra, nó đơn giản là không đáng tin cậy và rất dễ bị phát hiện. Ngay cả một giải pháp kết hợp cũng không làm giảm rủi ro này: trong khi một phần của giải pháp có thể được bảo vệ tốt hơn, thì phần sử dụng mặt nạ thông qua tiêm JS cũng dễ dàng bị phát hiện như trong các giải pháp không kết hợp.

Đây là lý do tại sao Multilogin sử dụng các giải pháp gốc của riêng mình: Trình duyệt bắt chước, dựa trên Chromium; và StealthFox, dựa trên cơ sở mã của Mozilla Firefox. Cả hai giải pháp đều không có những rủi ro này do tránh sử dụng JavaScript injection – và đó là cách dễ dàng nhất để tránh những nguy hiểm này. Tại sao phải mạo hiểm khi bạn không cần?

 

Kiểm tra chéo: tiết lộ các nỗ lực che giấu dấu vân tay tiêm JavaScript

Leave a Reply

All in one