最近、マルチポイントBluetoothヘッドホンで奇妙な問題が発生した。AliExpressのホームページをFirefoxやChromeで開くと、電話からの音声再生が停止するのだ。調査の結果、AliExpressのセキュリティスクリプト(collina.jsとfireyejs.js)が、ゼロゲインのオーディオグラフを2つ作成し、システムのオーディオ出力に接続していることが判明した。これはブラウザのミュートでは止まらず、Bluetoothオーディオパスを占有してしまう。このスクリプトは、Canvas、WebGL、オーディオなどを使用した包括的なブラウザフィンガープリンティングの一部であり、不正防止や追跡を目的としている。uBlock Originでこれらのスクリプトをブロックすることで問題は解決するが、ログインや支払い時にCAPTCHAが表示される可能性がある。筆者は、このような隠れたフィンガープリンティングがハードウェアに影響を与えるのは許容できないと結論付けている。
最近、私のBluetoothヘッドホンで奇妙な問題に遭遇しました。このヘッドホンはマルチポイントBluetoothオーディオに対応しているため、PCとスマホに同時に接続できます。通常はPCが優先的に音声を再生し、PCで何も再生していないときはスマホが音声を再生できる仕組みです。
普段はスマホで音楽を聴いていますが、PC経由で通知やYouTubeを再生するときは、FirefoxかChromeでAliExpressのページを開くまでは問題なく動作していました(他のブラウザは未テスト)。
AliExpressのホームページを読み込んですぐに、スマホからの音声が停止しました。AliExpressのタブを閉じると即座に直ります。タブ/Firefox/Windowsをミュートしても効果はなく、ページ上に動画、音楽、その他のメディアが再生されている様子はありませんでした。
これは調査する価値があるほど疑わしく思えました。
隠れたメディアを探す
まず最初に思い浮かんだのは自動再生される商品動画や広告でした。そこで、通常の容疑者をチェックしました:
どれも有用なものは見つかりませんでした。オーディオ要素もビデオ要素もなく、メディア再生の呼び出しもなく、navigator.mediaSession.playbackStateはnoneのままでした。
手がかりとなったのは、問題がすぐに発生しなかったことです。ページが数秒間アイドル状態になった後に現れました。ページを読み込む前に計測コードを仕込み、従来のメディア要素だけを見るのではなく、Web Audio APIも監視しました。
基本アイデアは、AudioContextコンストラクタをラップして、ページがオーディオ処理コンテキストを作成したときに記録するというものです:
また、AudioNode.prototype.connect() もラップして、コンテキストのオーディオ出力先に何かが接続されているかどうかを確認できるようにしました。
それがついに原因を見つけました。2つの隠れたオーディオコンテキストです!
AliExpressホームページのアイドル状態での計測中に、ページは2つのAudioContextオブジェクトを作成しました。両方ともrunning状態に入り、両方ともノードをAudioContext.destinationに接続しました。
同時に、依然として:
コンストラクタのスタックトレースは2つのスクリプトを指し示していました:
最初のコンテキストはcollina.jsによって作成され、2番目はfireyejs.jsから来ていました。両方ともAWSCディレクトリの下にあり、Alibabaのブラウザセキュリティおよび不正利用対策ツールの一部であるようです。
これらのスクリプトは極めて難読化されていますが、AIがオーディオコードの動作を解明するのに十分な名前と操作が残っていました。
オーディオコードが行っていること
両方のスクリプトは、次のようなWebAudioグラフを構築します:
オシレーターが既知の波形を生成します。アナライザーは、それがブラウザのオーディオ実装を通過した後の結果を測定し、スクリプトはそこから周波数データを読み取ります。
ゲインはゼロに設定されているため、ユーザーには何も聞こえません。しかし、グラフは依然としてシステムのオーディオ出力先に接続されています。出力先に接続することで、最終音量がゼロであってもブラウザはグラフを積極的に処理します。
これは自動再生動画とは大きく異なります。ブラウザの通常のタブミュート機能が停止できるメディア要素がありません。ページの観点からすると、ライブのオーディオ処理を実行しているだけです。
私の環境では、FirefoxまたはWindowsがBluetoothオーディオ経路をアクティブに保つのにそれで十分だったようで、マルチポイントヘッドホンがスマホにきれいに切り替わらなくなっていました。
これはフィンガープリンティングのように見える
WebAudioテストはこれらのスクリプトの唯一の測定ではありません。バンドルを検査すると、以下のクエリや測定を行うコードが見つかりました:
また、結果をシリアライズして暗号化し、Alibabaのテレメトリサービスにリクエストを送り、fetch() や sendBeacon() でデータを送信するコードもあります。
これはかなり包括的なブラウザおよびデバイスのフィンガープリントです。
オーディオフィンガープリンティングが機能するのは、ブラウザのバージョン、オペレーティングシステム、オーディオライブラリ、ハードウェアのわずかな違いが、同じ生成信号からわずかに異なる結果を生み出す可能性があるためです。それ自体がデバイスを一意に識別するのに十分とは限りませんが、canvas、WebGL、ハードウェア、タイミング、インタラクションデータと組み合わせるとはるかに有用になります。
結果のデータがAliExpressのサーバーに到達した後、AliExpressがそれをどう使うのかは私には見えません。永続的なデバイス識別子として使われるかもしれませんが、不正利用またはボット検出スコアへの入力の1つである可能性もあります。
AliExpressがこれを望む理由
AliExpressには、通常の買い物客と自動化または疑わしいクライアントを区別する理由が数多くあり、ユーザーの閲覧習慣を追跡する理由もあります。このサイトは、アカウント乗っ取り、偽アカウント、スクレイピング、自動購入、決済詐欺、レビュー操作、クーポンや新規顧客プロモーションの悪用に対処する必要があります。また、ほとんどの大企業と同様に、製品やサービスのマーケティングを向上させるために、ユーザー行動の大規模データセットを利用しています。
Cookieは、消去、コピー、置換が可能なため、この目的には特に信頼できるものではありません。多数の独立したブラウザ測定から作られたフィンガープリントは、一貫して操作するのがより困難です。
インタラクションデータは、ブラウザが人間と自動化のどちらによって制御されているかを判断するのにも役立ちます。AliExpressの観点からは、これによって不正を減らし、数ページごとにCAPTCHAを表示せずに信頼できる顧客を通過させることができます。AliExpressがAI生成のCAPTCHAを躊躇しているわけではありませんが。
個人的には、ショッピングのホームページが私の行動を追跡するために、グラフィックス、オーディオ、WebRTC、ハードウェア、モーションAPIなどを静かに実行してほしくありません。特に、音楽を遮断するような厄介な影響があるならなおさらです。おそらくAliExpressが私の音楽を遮断していなければ、サイトが何をしていたのか調べることはなかったでしょう。
uBlock Originでブロックする
特定した2つのスクリプトファミリーのブロックをテストしました。両方のリクエストをブロックした状態では、AliExpressのホームページは引き続きレンダリングされ、対照測定中にAudioContextオブジェクトや出力先への接続は現れませんでした。
Firefoxでは、Raymond Hillによる公式のuBlock Origin拡張機能を使用しています。スクリプトをブロックするには、uBlockのダッシュボードを開き、[My filters]を選択して、以下を追加します:
[Apply changes]をクリックし、既存のAliExpressタブをすべて閉じて、サイトを再度開きます。既存のタブを閉じる必要があるのは、スクリプトをブロックしても、すでに作成されたオーディオコンテキストはシャットダウンされないためです。
これらのルールは意図的に狭く設定されています。2つの観測されたスクリプトファミリーだけを、しかもAliExpressから要求された場合にのみブロックします。将来これが機能しなくなることは驚きではありませんが、その時はその時で対処します。
これらのスクリプトは不正防止システムに関連しているように見えるため、ブロックすると追加のCAPTCHAや、ログインやチェックアウト時の問題が発生する可能性があります。今のところホームページと通常の商品閲覧は機能しますが、AliExpressが正当なログインや支払いを拒否した場合は、ルールを一時的に無効にするつもりです。
私がこれをブロックする理由
不正防止の用途は理解できますが、この実装には現実世界の問題があります。
敏感な操作を行う前に、一般的なショッピングのホームページ上で実行されます。幅広いデバイスおよび行動測定を収集し、実装は意図的に検査を困難にしており、ページがライブのオーディオ処理グラフを開始したという目に見える兆候もありません。
また、非常に現実的なハードウェアの副作用も生み出しました。静かなフィンガープリンティングテストがBluetoothマルチポイント切り替えに干渉できた一方で、ブラウザのミュート機能は何もしませんでした!
隠れたアナリティクスまたはセキュリティ機能が、外部ハードウェアの動作を変えるほど強力にオーディオ経路の所有権を取得できるなら、それをブロックすることは合理的なトレードオフに思えます。
また、AliExpressがフィンガープリントをどのくらいの期間保存するのか、他のAlibabaプロパティで使用されるのかも証明できません。クライアントコードは広範囲のフィンガープリント的な測定が収集・送信されていることを証明しますが、サーバー側の保持期間やIDの関連付けはブラウザからは見えません。あなたの最善の利益を心から考えてくれる誰かを本当にインターネット上で信頼できますか?
要約
AliExpressのホームページは、高度に難読化されたAlibabaのセキュリティスクリプトから、2つの動作中のWebAudioグラフを静かに作成します。グラフは、はるかに大きなブラウザフィンガープリントの一部として波形を生成・解析し、ゼロゲインノードを介してシステムのオーディオ出力先に接続するため、ユーザーには何も聞こえません。
私の環境では、これによってPCのBluetoothオーディオ経路がアクティブに保たれ、マルチポイントヘッドホンがスマホに切り替わらなくなっているようです。ミュートできる従来のメディア要素がないため、タブをミュートしても直りません。
上記の2つのuBlock Originルールでcollina.jsとfireyejs.jsをブロックすると、隠れたオーディオコンテキストの作成が防止され、AliExpressを閲覧しながら音楽を中断されずに楽しめるようになりました。
著作権
:WebAudioでマルチポイントBluetoothヘッドホンを作動させ続けるAliExpressのウェブページ