編按:本文綜合整理自 laserphile 部落格原文(m-c-tech)、Firefox 工程師 Tom Ritter 的技術回應、Hacker News 討論串(910 分、295 則留言),並加入 Siami 編輯部觀點與分析。
一位 Blogger 工程師 m-c-tech 近日發現,只要在 Firefox 或 Chrome 開啟 AliExpress(阿里巴巴旗下跨境電商)首頁,瀏覽器就會在背景偷偷啟動兩個 WebAudio 圖(Audio Graph),用零音量卻仍在運作的方式,產生可供指紋追蹤(fingerprinting)的訊號——而這個訊號強到可以讓 Windows 的藍牙音訊路由「卡住」,直接干擾支援 multipoint 多點連線的耳機。
這則調查在 Hacker News 上線 24 小時衝到 910 分、295 則留言,連 Firefox 核心工程師 Tom Ritter 都親自下場回應,是近期瀏覽器隱私與指紋追蹤領域最熱門的實戰案例之一。
從一個奇怪 bug 開始追
m-c-tech 擁有一副支援 multipoint 藍牙音訊的耳機,可以同時連 PC 與手機。原本的行為是:PC 沒在播音樂時,耳機會自動切回手機當音源;PC 一播 YouTube 或通知音效,又會切回 PC。
但他最近觀察到,只要 Firefox 或 Chrome 開著 AliExpress 首頁,這個自動切換就壞了——手機的音樂完全沒聲音,即使電腦上沒有任何媒體正在播放。
「我通常用手機聽音樂,PC 端跑通知跟 YouTube,過去切換都很順,直到我某天打開 AliExpress 首頁——手機音訊就再也回不來了。關掉分頁,馬上恢復。」—— m-c-tech
第一輪排查很直觀:是不是有隱藏的影片或音樂在自動播放?他用 DevTools 檢查 <audio>、<video> 元素、HTMLMediaElement.play() 呼叫、MediaSession 狀態——全部都是空的。分頁靜音、整個瀏覽器靜音、Windows 系統層靜音,三層都壓不下來。
把 AudioContext 包起來才看見真相
他換了一條路:用 JavaScript 攔截 AudioContext 建構子與 AudioNode.prototype.connect(),把每一個音訊節點的建立與連線都記錄下來。
const OriginalAudioContext = window.AudioContext;
window.AudioContext = class extends OriginalAudioContext {
constructor(...args) {
super(...args);
console.log("AudioContext created", {
state: this.state,
stack: new Error().stack
});
}
};
結果發現,AliExpress 首頁在沒人點任何東西的情況下,建立了兩個 AudioContext 物件,都進入 running 狀態,並且都串接到了 AudioContext.destination——也就是系統音訊輸出的根節點。
建構時的 stack trace 指向兩個極度混淆(obfuscated)的 Alibaba 自有腳本:
https://assets.aliexpress-media.com/g/AWSC/uab/1.140.0/collina.jshttps://assets.aliexpress-media.com/g/AWSC/fireyejs/1.231.67/fireyejs.js
兩個檔案都放在 /AWSC/ 這個資料夾底下,從命名與行為推測,屬於阿里巴巴內部的「Anti-Abuse Web Security Client」(反濫用網頁安全客戶端)元件。
音訊圖長這樣:鋸齒波 → 分析 → 零增益
兩個 script 各自建構了幾乎相同的 WebAudio 圖:
鋸齒波振盪器(Sawtooth Oscillator)
→ AnalyserNode
→ ScriptProcessorNode
→ 增益為零的 GainNode
→ AudioContext.destination
振盪器產生已知波形,AnalyserNode 量測瀏覽器音訊實作處理後的結果,script 從中讀取頻率資料。增益歸零,使用者聽不到聲音——但這個圖仍然真實地接到系統音訊出口,瀏覽器會持續主動處理它。
關鍵差異在於:這不是一個 <audio> 元素,沒有任何「媒體播放」標記可供瀏覽器的分頁靜音機制攔截。對作業系統與藍牙驅動程式來說,這就是一個「active audio processing graph」——足以讓 Windows 認為 PC 端正在佔用音訊路由。
這也解釋了為什麼 multipoint 耳機一直不放手機音樂:PC 端的音訊路徑被一個零聲音的指紋腳本佔住了。
這不是單純音訊指紋,是整套瀏覽器指紋
m-c-tech 進一步拆解兩個 bundle 後發現,WebAudio 只是冰山一角。這兩個 script 還會查詢或量測:
- Canvas 渲染與
toDataURL()結果 - WebGL renderer 資訊、擴充功能、shader precision
- 螢幕與 viewport 尺寸、device pixel ratio
- 硬體並行數(hardware concurrency)、device memory
- 已安裝的瀏覽器外掛、支援的音訊/視訊格式
- WebRTC 行為
- 瀏覽器效能時序(performance timing)
- 滑鼠、觸控、焦點、捲動事件
- 裝置動作感測(device motion / orientation)
- 常被自動化框架改動的屬性
加上序列化、加密、發送到 Alibaba telemetry endpoint 的程式碼,這構成了一套相當完整的瀏覽器與裝置指紋。
Audio fingerprinting 之所以有效,是因為不同瀏覽器版本、作業系統、音訊函式庫、硬體在處理同一個訊號時會產生細微差異。單獨看 WebAudio 不一定能唯一識別一台裝置,但跟 canvas、WebGL、硬體、時序、互動資料組合起來,識別力就高很多。
m-c-tech 同時引用了 Firefox 工程師 Tom Ritter 的獨立驗證文章 WebAudio fingerprinting on Alibaba,指出他用 Claude 把 Alibaba 的 WebAudio 邏輯抽成獨立頁面重現,計算出的 fingerprint 值是 sha256:9a388c0dd04cfdc54314f9d961c7e2d247b972067e28d1cea76bd6060cf1392e,另一個內部調查看到的是 sha256:16d3191880ce01f726015ec6a1f9a072a81ebd04bf489098d4685d1d1c0b2711。
為什麼 AliExpress 要做這件事
從電商角度,這套機制的商業邏輯其實不難理解:
- 反詐欺:帳號盜用、假帳號、自動化搶購、付款詐欺、評價造假、新客優惠券濫用——都需要把「真人瀏覽器」跟「自動化腳本」區分開。
- 行為追蹤:跟多數大型平台一樣,把使用者瀏覽行為彙整進行銷資料庫。
- 降低 CAPTCHA 摩擦:對信任分數高的裝置,可以少跳 CAPTCHA,提升轉換率。
Cookie 不夠可靠,因為使用者會清、會複製、會被置換。指紋是用很多獨立測量值組成的偽身分,更難一致性地偽造。
從 AliExpress 的立場,這是合理的 anti-fraud 投資。但 m-c-tech 與社群的反彈來自兩件事:
- 這發生在首頁、發生在你做任何敏感操作之前——多數人連商品頁都還沒打開,就已經被量測了。
- 沒有任何可見的 UI 提示:使用者完全無法知道首頁正在跑一個零聲音的音訊處理圖。
「一個隱藏的分析或安全功能可以強到改變外部硬體的行為,這件事本身就是個警訊。封鎖它看起來是合理的權衡。」—— m-c-tech
用兩行 uBlock 規則就能擋下
m-c-tech 在 Firefox + uBlock Origin(Raymond Hill 官方版)驗證,只要擋掉兩個 script 家族,AliExpress 首頁照常運作、零 AudioContext、零 destination 連線。
! AliExpress AWSC fingerprinting scripts
||assets.aliexpress-media.com/g/AWSC/uab/*/collina.js$script,domain=aliexpress.com
||assets.aliexpress-media.com/g/AWSC/fireyejs/*/fireyejs.js$script,domain=aliexpress.com
操作步驟:
- 打開 uBlock Origin 儀表板 → 「我的過濾規則」(My filters)
- 貼上以上兩行
- 點「套用」
- 關掉所有現有的 AliExpress 分頁——舊分頁已建立的 AudioContext 不會因為你事後擋 script 而被關閉
- 重新打開 AliExpress
⚠️ 這兩條規則刻意寫得很窄:只擋被觀察到的兩個 script 家族,且只在
aliexpress.com網域生效。如果未來 Alibaba 換檔名或路徑,規則會失效,到時候再更新。
副作用:因為這兩個 script 與 anti-fraud 系統有關,封鎖後登入或結帳時可能會跳出更多 CAPTCHA。日常瀏覽目前不受影響;遇到正常操作被擋時再暫時關閉規則。
🚨 為什麼這件事重要(Siami 觀點)
這不是單一公司的單一 bug,而是一個系統性趨勢的具體案例:瀏覽器 fingerprinting 從「被動的環境偵測」演進到「主動運算以取得更穩定的訊號」。WebAudio 指紋並不是新東西——2017 年的 Princeton 學術研究就把它列為主要追蹤向量之一——但它在 2026 年仍被阿里巴巴大規模部署在電商首頁,背後反映的是三件事:
第一,指紋追蹤在主流瀏覽器上的防禦沒有想像中完整。 Tom Ritter 自己證實 Firefox 118 之後 WebAudio 結果被刻意常數化、99.24% 的使用者只會落到三個值(x86、x64+FMA、ARM/NEON),但 CPU 架構仍會洩漏。Chrome / Brave / Safari 各自有部分緩解,但產業整體沒有共識。如果一個主流電商仍能穩定蒐集到「至少三個 bucket」的 CPU 資訊,那就是可用的追蹤 token。
第二,「零音量但仍在處理」這個模式繞過了所有以「媒體播放」為前提的隱私保護機制。 分頁靜音、瀏覽器靜音、系統靜音——全部失效。對 multipoint 藍牙耳機使用者,硬體端被卡住的副作用才讓這個現象被注意到;對一般耳機使用者,這個 fingerprint 早就被默默蒐集了,只是沒人發現。
第三,這是 Web 平台「Anti-Abuse SDK」這個灰色地帶的縮影。 Cloudflare、Akamai、FingerprintJS、阿里 AWSC——這些工具介於「資安」與「追蹤」之間,缺乏統一揭露標準,使用者完全無法事前知道某個網站正在用哪一套、量測什麼、保留多久。GDPR 與 CCPA 要求「知情同意」,但實務上,這些 SDK 沒有任何視覺提示,也沒有退出機制,只能靠封鎖 script 事後處理。
對一般使用者:裝 uBlock Origin,把上面兩條規則加進去。對資安 / 隱私團隊:這是 audit 自家網站是否使用類似 SDK 的好時機。對 Web 標準組織:該討論是否應該要求 Web Audio API 在 destination 被連接時,必須有 UI 層級的指示(例如分頁圖示、favicon 變化)。
數據解讀與質疑
910 分、295 則留言並不代表「所有人都會遇到音訊卡頓」。 多數留言者(如 yetanotherdev42)確認 DevTools 看得到 CPU 持續被吃,但只有「使用 multipoint 藍牙耳機 + 預期 PC 沒在播音樂」的少數情境會觸發明顯的音訊路由問題。對大多數裝置,這套 fingerprint 仍會被默默蒐集,只是副作用不明顯。
「這是 fingerprinting」的證據是充分的,「這是用於跨站追蹤」的證據則是缺乏的。 m-c-tech 自己明確承認看不到 server-side 行為——可能只用作 fraud score 的其中一個輸入,也可能真的用作 persistent identifier。Tom Ritter 的獨立驗證只證明「WebAudio fingerprinting 邏輯存在」,沒證明「Alibaba 用它跨站追蹤使用者」。在沒有內部資料前,這條推論鏈必須標清楚:技術上是 fingerprinting,用途上是「可能」用於跨站追蹤,也「可能」只是 anti-fraud。
uBlock 規則不是永久解方。 Alibaba 一旦換檔名或路徑就會失效。社群維護的過濾規則列表通常會延遲數小時到數天才跟上。對自動化掃描(例如企業資安 SOC)來說,建議在 DNS 層或 proxy 層直接擋 assets.aliexpress-media.com/g/AWSC/ 整個目錄,比依賴使用者端的 uBlock 更穩。
Tom Ritter 的「99.24% 三個 bucket」是 Firefox 的結果。 Chrome / Safari / Brave 不一定同樣常數化;對這些瀏覽器,WebAudio fingerprinting 的識別力可能仍然偏高。對中國常見的 360 瀏覽器、QQ 瀏覽器、UC 瀏覽器,這些優化更是完全沒有保證。
完整技術分析請見 laserphile 部落格原文、Tom Ritter 的 Firefox 視角分析,以及 Hacker News 討論串。Mozilla 內部 telemetry 細節與 fingerprint 常數化策略在 Firefox 118 之後的 release notes 中可查到。
網友熱門留言 (5)