瀏覽器指紋與反追蹤的思考

一直以來我就對網頁瀏覽器的各種 feature creep,還有瀏覽器的設計很有意見。一直以來有個想法就是各種網頁的 Javascript API (例如 WebGL, WebAudio 等等)應該要如同定位服務一樣,預設停用,需要使用時再由網頁向使用者提出請求,這樣的話就會增加網頁開發者的壓力不要去濫用這些功能,因為這些 API 一旦需要使用者批准才能使用,開發者就會一定程度上被迫去解釋為什麼他們需要存取這些 API。並且因為權限是動態給予的,就像手機應用程式的動態權限系統一樣,開發者就會有壓力去讓即使這些權限被拒絕的時候應用程式的其他部分能夠正常運作。

顯然現在的瀏覽器並不是這樣運作的,因此產生了一詭異的現象:瀏覽器開發者所設計的各種厲害功能,被網頁開發者主流所使用的方式,都不是瀏覽器開發者原本設計的目的,而是被拿來追蹤識別使用者。例如,當今 WebGL 的主流應用,並不是拿來在網頁上繪製 3D 圖形,而是讓網頁來獲取瀏覽器的特徵值,用於追蹤使用者。畢竟,實在沒有多少情境下需要讓網頁繪製 3D 圖形,對吧?

綜合上述原因,我自己目前使用者的瀏覽器是刻意停用 WebGL 和 WebAssembly 等功能的。

反追蹤 vs 不爽 feature creep

所以綜合起來我的初始目的有兩個:

  1. 反網頁追蹤
  2. 我就是不爽瀏覽器開一堆功能給網頁去濫用所以我要把這些功能關掉

第二個目的有時候會破壞第一個,因為把這些特定功能關掉的話可能會產生一個獨特的信號讓你變得更容易被追蹤。不過…就我一直以來的觀察,從來沒看過哪個追蹤程式會去慢慢測試每一個功能可不可以用然後回報這項資訊,大部分都是直接用那個 DOM 全域物件,但因為停用的關係全域物件是 undefined,於是整個追蹤器就丟 exception 然後壞掉。¯\_(ツ)_/¯

瀏覽器的反追蹤策略

根據爬文,目前主流瀏覽器的反追蹤策略有兩種

  1. 差異化:讓瀏覽器特徵對每一次瀏覽、每一個網站都看起來不一樣,Brave 採行這種策略,換句話說就是一個人每次看起來都像是不同人。
  2. 一致化:讓用同一個瀏覽器的不同用戶看起來一模一樣,無法分辨,Tor Browser 採行這種策略,換句話說就是每個人看起來都像同一個人。

但這兩種策略都有缺點:

  1. 差異化:
    • 並不是每一個會被收集的資料項目都那麼容易差異化,比如說 CPU 核心數,合理的範圍大概就只有 2~32 ,而且當中的奇數也幾乎不可能,例如 5, 7, 9。但這個說法我覺得不合理,因為本來就不需要去差異化所有資料項目啊,比如說顯然目前幾乎所有瀏覽器都支援 HTML 5,那差異化這個幹嘛?
    • 因為差異化一般是拿資料項目真正的值進行隨機演算,進階的追蹤器有可能可以透過多次收集數據獲得平均值拿來追蹤,因為取多次平均值可以抵消隨機演算的效果。這我覺得合理,但是我猜應該很少有追蹤器願意做到這個地步,因為成本還有效能考慮。
  2. 一致化的缺點就比較明顯了:
    • 有些東西一致化之後會降級使用者體驗,比如說所有人都必須要使用 UTC+0 時區、固定的視窗大小
    • 所屬的一致化群體必須要夠大才有意義

仔細思考

就反追蹤來說,瀏覽時最大的識別資訊其實是 IP 位置,而平常我並無意隱藏這項資訊。而想要隱藏 IP 位置的時候我會直接用另一個 profile (搭配 VPN)。

我想要反制低階追蹤,但不打算反制高階追蹤。但其實這麼說也不對,我其實並不介意讓低階追蹤程式得知我在使用 Linux,所以話說回來其實我介意的只是部分個別資料項目的敏感性,攻擊方想要結合已經公開的資料來追蹤我其實並不介意。甚至,我還蠻樂意讓追蹤程式知道,我正在使用 Linux 上面的 Firefox ,而且不支援 WebGL 呢,因為如果我偽裝成 Chrome + Windows 的話,觀測到的 Firefox 的市佔率不就更低了嗎,這樣廠商可能會覺得支援 Firefox 的必要性更低了。

Feature Creep

那我會在意的資料項目有什麼?

我不喜歡的功能,大致上都是可以讓網頁直接存取低階硬體的功能。例如 WASM, WebGL。如果網頁你說想要用 JavaScript 做一些特效、甚至整個應用程式邏輯(像是 Single Page Application),我甚至也都沒什麼意見。但如果網頁可以直接以接近原生應用程式的方式使用我的硬體,這 RCE(遠端代碼執行)的感覺就強烈了許多。雖然瀏覽器都還是對這些功能有很多限制,避免影響使用者的其他資料,但程式碼終究是在我的硬體上面執行,網頁上的 WASM 程式一開啟即執行的模式,我總有一種沒有被徵詢同意的感覺。

雖然說 Javascript 本身就算是一種 RCE ,不過這麼行之有年而且基本上離硬體很遠我就覺得…好像還可以接受。

啊不過或許 WASM 也離硬體很遠?有這個可能但我還沒仔細研究,但總不會比 Javascript 更遠吧?

難道我真的不在意網頁追蹤嗎?

思考到這個地步,不免問自己這個問題。其實也不是不介意,只是覺得,目前 Firefox 的基礎防跨站追蹤已經夠好了,對於更厲害能夠打敗基礎防追蹤的追蹤器,就日常使用來說,並沒有必要花費更大心思和忍受體驗降級去防它們。而偶爾進行一些不想要被追蹤到的瀏覽,打開 Tor Browser 就幾乎可以完美防禦了。

瀏覽器設定檔用途區分

經過以上思考,我把我的瀏覽行為和反追蹤需求分為下列幾種:

  1. 主要日常瀏覽、工作瀏覽:留下痕跡比較沒有關係的網站。
  2. 不想要跟日常瀏覽被關聯,但是留下本地瀏覽紀錄、維持登入沒關係的網站。主要是任何牽涉到線上付款或是購物的網站,這個設定檔我會打開 VPN(利用 vopono),除了 VPN 之外還要反追蹤。這主要是想要防止我的日常瀏覽行為和關鍵字被拿來推薦我要買什麼東西。
  3. 允許 feature creep (WebGL, WebAudio, etc) 的瀏覽器設定檔,這主要是給合理使用 WebGL, WebAudio 的網頁應用程式。
  4. 完全不想要留下紀錄的瀏覽,這個用 Tor browser 就好了。

實測 Firefox 的 privacy.resistFingerprinting (RFP)

RFP 用起來最大的麻煩就是,他為了要達成一致化,裡面的防追蹤功能是不能個別關閉的,因為如果允許關閉一部分的防追蹤功能,那這個特徵就可以被用於追蹤。

Firefox 開啟了 RFP 基本上就有與 Tor Browser 相同的防護。但以往的經驗是會讓瀏覽器變得很難用,所以這次再實測了一次,使用心得:

  • 不能為個別網站設定不同的放大縮小比率
  • Imperva 的 CAPTCHA 沒辦法正常顯示(拼圖的那個),只能改用聲音
  • 好像沒有了耶?!

其實意外地可用性非常高。

實際修改設定

依照上述的設定檔用途區分,我將他們調成:

  1. 不使用 RFP,啟用一些不影響使用體驗的隱私設定,還有關閉 feature creep
  2. 使用 RFP,使用 VPN
  3. 全預設

這次設定檔管理我改用 arkenfox ,因為他有個方便的 GUI 一次看所有設定。不過他與我之前使用的 pyllyukko/user.js 細節差異在哪還有待研究。

Jshelter

這次設定檔修改我都把 Jshelter 移除了,主要是因為速度變慢太多(可能是因為我同時也停用了 WASM),而且 CPU 使用率提高不少。除此之外幾乎所有 Cloudflare CAPTCHA 都過不去,不同網站的狀況不一樣,但過不去的意思是會直接寫「你的瀏覽器已經過期」,沒機會人工解 CAPTCHA。

當時決定使用 Jshelter 的理由是:

  • 它允許針對不同網站個別開啟和關閉不同防護
  • 網站嘗試收集瀏覽器特徵的時候會跳通知,也可以自己點開來看個別網站是不是有在收集瀏覽器特徵(它會給一個分數
  • 其實最初的理由還是因為我不喜歡 feature creep,但大部分 feature creep 沒辦法針對個別網站開關,如果用 Jshelter 的話就可以

Jshelter 基本上提供了類似於 Brave 的特徵值模糊化功能 (farbling)。

Jshelter 還提供了一個 Network Boundary Shield 功能,Firefox 目前似乎還對此沒有防護?Brave 說沒有,但實情有待研究。

參考資料

思考問題筆記

以下是我思考的時候問自己的一些問題和小結。

  • 如果我用的大部分網站已經是 logged in 狀態使用,那反追蹤似乎不太有需要
    • google
    • reddit
    • twitter
    • github
  • cloudflare 的 fingerprinting 太強制,如果嘗試用 jshelter 阻擋則完全過不了
    • 如果直接允許 cloudflare 做 fingerprinting 的意義是什麼?
    • 但如果讓我知道我被 cloudflare 阻擋了,至少我可以決定這個網站不值得看
  • Web worker 似乎有很多合理用途
  • webgl, webaudio 是被濫用來 fingerprint 的標準,實際上只有少數場合需要用到
    • 可以開另一個支援 webgl 的瀏覽器
  • 瀏覽器市佔率如何影響整件事?
  • 普通 fingerprinter 及 進階 fingerprinter ,何者為我目標?
  • 因為 captcha 太嚴格,沒有fingerprint無法通過,所以其實只要去確認fingerprint的資訊都是你覺得讓對方知道沒關係的資訊就可以了?
    • 比如說我覺得讓網站知道我偏好台灣中文其實沒關係
  • 有什麼 fingerprint 是難以隱藏的?

發表留言