Web開発
AliExpressがサイレントなWebAudioフィンガープリンティングでBluetoothマルチポイント接続を妨害
要約
AliExpressのウェブページが、ユーザーに気づかれずにWebAudio APIを使用してフィンガープリンティングを行い、Bluetoothヘッドホンのマルチポイント接続を妨害する問題が発見されました。この手法は、音声や動画要素を使わずにバックグラウンドでオーディオコンテキストをアクティブにし、ブラウザやOSにオーディオパスを維持させ、デバイスの切り替えを阻害します。uBlock Originなどの広告ブロッカーで特定のスクリプトをブロックすることで、この問題を回避できることが示されています。
全文翻訳
2026年8月20日木曜日
AliExpressのウェブページがWebAudioフィンガープリンティングでマルチポイントBluetoothヘッドホンをアクティブに保つ
最近、私のBluetoothヘッドホンで奇妙な問題に遭遇しました。それらはマルチポイントBluetoothオーディオをサポートしており、PCと電話の両方に同時に接続できます。通常、PCがオーディオ再生で優先され、PCで何も再生されていない場合に電話からオーディオを再生できます。
通常、私は電話で音楽を聴きますが、PCから通知やYouTubeが再生される場合、FirefoxまたはChromeでAliExpressのページを開くまで、これは確実に機能します(他のブラウザは未テスト)。
AliExpressのホームページをロードしてからしばらくすると、電話からのオーディオ再生が停止しました。AliExpressのタブを閉じるとすぐに問題は解決しました。タブ/Firefox/Windowsのミュートは役に立たず、ページに表示されるビデオ、音楽、またはその他のメディアは再生されていませんでした。これは調査するのに十分怪しいと思われました。
隠されたメディアを探す
私の最初の考えは、自動再生される製品ビデオまたは広告でしたので、通常の容疑者をチェックしました。
<audio> および <video> 要素
HTMLMediaElement.play() への呼び出し
アクティブなメディアセッションメタデータ
メディアリクエスト
メディアを含む埋め込みフレーム
これらのどれも有用なものは示しませんでした。オーディオまたはビデオ要素はなく、メディア再生の呼び出しもなく、navigator.mediaSession.playbackState は none のままでした。
問題がすぐに始まらなかったという手がかりがありました。ページが数秒間アイドル状態になった後に現れました。ロードする前にページにインストゥルメントを適用し、従来のメディア要素のみを探す代わりにWeb Audio APIを監視しました。
基本的なアイデアは、AudioContextコンストラクタをラップし、ページがオーディオ処理コンテキストを作成するたびに記録することでした。
const OriginalAudioContext = window.AudioContext;
window.AudioContext = class extends OriginalAudioContext {
constructor(...args) {
super(...args);
console.log("AudioContext created", { state: this.state, stack: new Error().stack });
}
};
また、AudioNode.prototype.connect() をラップして、コンテキストのオーディオ宛先に何かが接続されているかどうかを確認できるようにしました。
それがついにそれを見つけました、2つの隠されたオーディオコンテキスト!
AliExpressのホームページのアイドルキャプチャ中に、ページは2つのAudioContextオブジェクトを作成しました。両方ともrunning状態に入り、両方ともAudioContext.destinationにノードを接続しました。
同時に、まだありました。
オーディオまたはビデオ要素がゼロ
メディアのplay()呼び出しがゼロ
アクティブなメディアセッションなし
可聴音なし
コンストラクタのスタックトレースは、2つのスクリプトを指していました。
https://assets.aliexpress-media.com/g/AWSC/uab/1.140.0/collina.js
https://assets.aliexpress-media.com/g/AWSC/fireyejs/1.231.67/fireyejs.js
最初のコンテキストはcollina.jsによって作成され、2番目はfireyejs.jsから来ました。どちらもAWSCディレクトリの下にあり、Alibabaのブラウザセキュリティおよび不正使用防止ツールのようでした。
スクリプトは非常に難読化されていますが、AIがオーディオコードが何をしているかを理解するのに十分な名前と操作が残っています。
オーディオコードの動作
両方のスクリプトは、次のようなWebAudioグラフを構築します。
ノコギリ波オシレータ -> アナライザーノード -> ScriptProcessorNode -> ゼロに設定されたゲインノード -> AudioContext.destination
オシレータは既知の波形を生成します。アナライザーは、ブラウザのオーディオ実装を通過した後の結果を測定し、スクリプトはそこから周波数データを読み取ります。
ゲインはゼロに設定されているため、ユーザーは何も聞くべきではありません。しかし、グラフはまだシステムオーディオ宛先に接続されています。それを宛先に接続すると、最終的な音量がゼロであっても、ブラウザはグラフを積極的に処理します。
これは自動再生ビデオとは大きく異なります。ブラウザの通常のタブミュートコントロールが停止するためのメディア要素はありません。ページに関しては、ライブオーディオ処理を実行しています。
私の場合は、それがFirefoxまたはWindowsがBluetoothオーディオパスをアクティブに保つのに十分であり、マルチポイントヘッドホンが電話にきれいに切り替わるのを防いでいました。
これはフィンガープリンティングのように見えます
WebAudioテストは、これらのスクリプトにおける唯一の測定ではありません。バンドルの検査により、次のものをクエリまたは測定するコードが見つかりました。
キャンバスレンダリングと toDataURL()
WebGLレンダラー情報、拡張機能、およびシェーダー精度
オーディオオシレータとアナライザーの出力
画面とビューポートの寸法
デバイスピクセル比
ハードウェア並列処理とデバイスメモリ
インストールされているブラウザプラグイン
サポートされているオーディオおよびビデオフォーマット
WebRTCの動作
ブラウザのパフォーマンスタイミング
マウス、タッチ、フォーカス、スクロールイベント
デバイスのモーションとオリエンテーション
ブラウザの自動化に一般的に関連付けられるプロパティ
結果をシリアル化および暗号化し、Alibabaのテレメトリサービスにリクエストを送信し、fetch() または sendBeacon() でデータを送信するためのコードもあります。
これはかなり包括的なブラウザおよびデバイスのフィンガープリントです。
オーディオフィンガープリンティングは、ブラウザのバージョン、オペレーティングシステム、オーディオライブラリ、およびハードウェアのわずかな違いが、同じ生成された信号からわずかに異なる結果を生成する可能性があるため機能します。それ自体でデバイスを一意に識別するのに十分ではないかもしれませんが、キャンバス、WebGL、ハードウェア、タイミング、およびインタラクションデータと組み合わせると、はるかに有用になります。
AliExpressがそのサーバーに到達した後の結果データをどのように使用しているかはわかりません。永続的なデバイス識別子として使用される可能性がありますが、不正行為またはボット検出スコアへの1つの入力である可能性もあります。
なぜAliExpressがこれを望むのか
AliExpressは、通常の買い物客と自動化されたまたは疑わしいクライアントを区別するだけでなく、ユーザーの閲覧習慣を追跡するためにも多くの理由があります。このサイトは、アカウントの乗っ取り、偽のアカウント、スクレイピング、自動購入、支払い詐欺、レビュー操作、クーポンや新規顧客プロモーションの悪用に対処する必要があります。また、ほとんどの大企業と同様に、製品やサービスをより良くマーケティングするために、ユーザー行動の大規模なデータセットを利用しています。
Cookieは、クリア、コピー、または置き換えられる可能性があるため、この目的には特に信頼性が高くありません。多くの独立したブラウザ測定から作成されたフィンガープリントは、一貫して操作するのが困難です。
インタラクションデータは、ブラウザが人間によって制御されているか自動化によって制御されているかを判断するのに役立つこともあります。AliExpressの観点からは、これにより不正行為が減少し、信頼できる顧客が数ページごとにCAPTCHAを表示されることなく通過できるようになります。(AliExpressがAI生成CAPTCHAを避けないわけではありません)
個人的には、ショッピングのホームページが私のグラフィックス、オーディオ、WebRTC、ハードウェア、モーションAPIなどをサイレントに実行して私の行動を追跡することを望みません。特に、私の音楽をブロックするという迷惑な効果がある場合はそうです。AliExpressが私の音楽をブロックしていなければ、サイトが何をしているのか調べなかったかもしれません。
uBlock Originでブロックする
特定された2つのスクリプトファミリーをブロックすることをテストしました。両方のリクエストをブロックすると、AliExpressのホームページは引き続きレンダリングされ、制御キャプチャ中にオーディオコンテキストオブジェクトまたは宛先接続は表示されませんでした。
Firefoxでは、Raymond Hillによる公式のuBlock Origin拡張機能を使用しています。スクリプトをブロックするには、uBlockダッシュボードを開き、[マイフィルター]を選択し、次を追加します。
! AliExpress AWSC フィンガープリンティング スクリプト
||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
[変更の適用]をクリックし、既存のAliExpressタブを閉じ、サイトを再度開きます。既に作成されたオーディオコンテキストをブロックしてもシャットダウンされないため、既存のタブを閉じる必要があります。
これらのルールは意図的に狭く設定されています。それらは、観察された2つのスクリプトファミリーのみを、AliExpressによって要求された場合にのみブロックします。将来的に機能しなくなることは驚きではありません。その時はその橋を渡ります。
これらのスクリプトは不正防止システムに関連しているように見えるため、ブロックすると、ログインまたはチェックアウト中に追加のCAPTCHAや問題が発生する可能性があります。これまでのところ、ホームページと通常の製品ブラウジングは引き続き機能していますが、AliExpressが正当なログインまたは支払いを拒否した場合は、一時的にルールを無効にします。
なぜブロックするのか
不正防止のユースケースは理解できますが、