2021年4月18日 星期日

藏在 qrcode 產生器裡的 fingerprinting

這篇是一個不完整實驗的摘要, 順便想要請教讀者兩個問題: (1) Canvas Fingerprint Defender 可信任嗎? (2) 誰可以幫解說 David Shim 的 qrcodejs 的程式碼嗎?

"Browser fingerprinting" 的追蹤方式很難阻擋。 你可以到 EFF 製作的 "Cover Your Trackes" 網站測試。 點下 "Test Your Browser" 之後, 畫面會自動重新載入幾次, 等好一陣子終於出現判讀結果。 我的 Firefox 的 "容易被識別度" 為 16-17 bits; 我的 chrome 則為 18-19 bits (越大越糟)。 Firefox 號稱可以封鎖這類追蹤; 不過其實效果很有限。 另一個持完全相反立場的自由軟體計畫 FingerprintJS 積極開發 fingerprinting 技術以便辨識瀏覽器。 原來 firefox 只是把提供追蹤程式碼的網站列入黑名單封鎖掉。 所以你到 FingerprintJS 的首頁, 會發現即使關掉瀏覽器再開, 照樣會被指定一個獨一無而的固定 ID ==> Firefox 哭哭~ 於是搜尋到 Canvas Fingerprint Defender (還有另兩個相關的 AudioContext Fingerprint Defender 跟 WebGL Fingerprint Defender, 不過暫且先忽略) 裝好之後再去 FingerprintJS, 就會發現它的追蹤僅限於此次開啟瀏覽器; 關掉 firefox 再重開, 它就會把你認成另外一個瀏覽器 ==> CFD 勝! 在 EFF 的網站上, 也會看到 canvas fingerprinting 的 bits 數從 16-17 降到 2-3。 (但不知為什麼我的整體識別度還是很高...)

可惜 CFD 並沒有一個明顯的原始碼官網, 我暫時也沒有力氣研究 *.xpi 檔裡面的原始碼。 那麼... 它值得信賴嗎? 要請大家提供意見。

安裝了 CFD 之後, 每次逛到有採用 canvas fingerprinting 技術的網站 (例如上述的 EFF 測試頁及 FingerprintJS 首頁), CFD 都會在螢幕上出現警告訊息。 然後我突然發現自己在 cyut 的首頁竟然也有! (現在已移除, 下詳) 逐一測試之後, 發現是 QRCode 產生器觸發了 CFD。 原先採用 google 到的第一名 David Shim 的 QRCode.js; CFD 指認它有問題之後, 我查看原始碼, 其中一段果然看起來就是 obfuscaed code (故意讓人看不懂的程式碼) 在做一堆奇怪的測試, 還有一個 "1px data" 看起來就像是一個 spy pixel。 拜求讀者高手寫一篇文章解說他的程式碼 orz 或是研究一下 github 上 pull/merge 的歷史應該也很有趣。

根據註解, 更上游的版本是 Jerome Etienne 的 QRCode.js。 程式碼超級舊, 連 utf8 跟 canvas 都不支援。 還好如果只是想放網址, 其實也不在乎。 測試了一下, 沒有問題, 所以就改用他的版本了。

如果想測試, 可以下載我打包的版本: qrfp.tgz。 請在某個網頁目錄解壓縮, 並透過 web server 查看。 (用 File => Open 也可以看得到圖, 但 CFD 不會跳出來警告。) 左邊的圖是用 JE 版的 QRCode.js 畫的, 需要用到三個 js: jquery.js、 JE/qrcode.js、 JE/jquery.qrcode.js; 右邊的圖是用 DS 版的 QRCode.js 畫的, 只用到一個 js: DS/qrcode.js 。 為了避免變數名稱衝突, 我把 DS/qrcode.js 裡面的 QRCode 類別通通改成 DSQRCode, 除此之外沒有更動。 如果把 new DSQRCode(...) 那一句註解掉, CFD 就不會警告。

這個年代, 想要不被追蹤, 幾乎是不可能的任務? 就連鼓吹網路隱私的站長, 也會不小心把內含追蹤程式碼的好用套件拿來 "服務" 不知情的訪客 (遮臉) 還有啊, 像 fingerprintjs vs [firefox + ublock origin + CFD] 這種針鋒相對的自由軟體計畫... 真不知道該如何評論? 唉沒空研究了, 今天快結束了, 應該要開始做正事了~

1 則留言:

  1. 噗友們的看法: https://www.plurk.com/p/obkl5o 其中 UGP 推有原始碼的 CanvasBlocker

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。