Googleの大規模なアンチアドブロック更新を回避する方法
(0x44.xyz)- ChromeのMV3アップデートでは、既存のアドブロッカーの機能を弱めるために
webRequestBlocking権限が削除された - 筆者はMV3環境でも
webRequestBlockingを回避できるバグを2023年に発見した - このバグは、JavaScriptバインディングの甘い構造と古いコードがそのまま残っていたために発生した
- WebViewインスタンスIDを操作して権限チェックを回避することで、MV3環境でもブロッキング機能を使うことができた
- 現在はパッチが適用されており、この回避方法はもう動作しない
MV3とアドブロッカーの変化
- ChromeはMV2拡張機能を段階的に廃止し、代わりにMV3への移行を進めている
- MV3ではwebRequestBlocking権限が削除され、アドブロッカーがネットワークリクエストをスクリプトで動的に遮断することができなくなった
- その代わりにdeclarativeNetRequest APIが追加されたが、同じレベルの柔軟性はサポートしていない
- この変更によって、アドブロッカーの性能が大きく低下する現象が起きた
JavaScriptバインディング構造の限界
- Chromeのコアは**C++**で開発されているが、拡張機能はJavaScriptで動作し、拡張APIもJSバインディングを通じてアクセスする
- 2015〜2016年までは、サイトにJSファイル(拡張機能バインディングモジュール)を挿入してAPIを初期化・検証していた
- この方式はJSのグローバル関数・プロトタイプのオーバーライドに弱く、Universal XSSバグが複数発生した
- その後Googleは主要なバインディングをC++へ移行したが、一部のJSバインディングファイルは今も残っている
- 現在でもchrome.webRequestのような特定のAPIはJSバインディング構造を使っている
Webリクエストイベントクラスを利用した回避
-
MV2ではWebリクエストのブロックは以下のコードで実装できた
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
MV3では
blockingオプションが禁止されており、通常の方法ではブロックできない -
しかし、webRequestイベントの
.constructorを通じて任意のイベントオブジェクトを生成できる -
内部的には、JSバインディングの特殊なラッパークラスがこのイベントオブジェクトを管理している
-
コンストラクタ引数の1つであるopt_webViewInstanceIdを指定すると、プラットフォームアプリ専用の許可ロジックを回避し、ブロッキング権限チェックをすり抜けられる
let WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
もともとはプラットフォームアプリだけが使えるように設計されていたが、WebView IDの検証が不十分で、一般の拡張機能から悪用できた
結果とセキュリティパッチ
- この脆弱性により、MV3環境でも完全なアドブロッカーの開発が実際に可能だった
- 筆者はこのバグを2023年にGoogleへ報告し、Chrome 118でWebView権限の所有有無を正しく確認する方式に修正された
- 報奨金は支払われなかったが、これは追加のデータ露出なしに権限回避しかできなかったという構造的な特性による
- 本件は、数十行のコード修正が巨大企業のセキュリティ更新を無力化しうることを示している
結論と参考
- このバグは現在修正済みで、もはや動作しない
- 同様に興味深いChrome拡張機能関連の脆弱性の事例として、実際にCVE番号と1万ドルの報奨金を受けた問題も存在する(別のブログ記事を参照)
4件のコメント
おそらくそのアップデート以降、広告ブロック業者の売上はさらに伸びたでしょう。
ネットワーク段で完全にブロックしてしまうスタンドアロンアプリは有料でしか使えないので、かなり売れたはずです。
2年も経ってすっかり無意味になった脆弱性を持ち出して、わざわざ金を払わなかったと言うとは……個人的にはあまりクールではないですね。
とはいえ、こういうこともブログに書いてこそ自分の価値を証明できるのでしょう。
心から、私もこういうマインドを学んでブログにもっとたくさん記事を書きたいですね
Firefoxを使えばいいだけです。ここ1〜2年でかなり高速化して、悪くありません。
私は何年もFirefoxをメインで使い、ときどきChromeと比較していますが、特に最近はFirefoxが十分実用になると感じています。
韓国の銀行のようにWeb標準を無視していたWebページも、最近はかなり改善されて、ほとんどはFirefoxでも問題なく動作します。
カスタマイズのしやすさはFirefoxのほうがずっと上です。
Hacker Newsの意見
Firefoxを一度使ってみたいとは思っているものの、たまに発生するWebサイトの読み込みバグに加えて、PWA(Progressive Web Apps)をインストールできない点が最大の障害になっている。Chromeとその系統のブラウザはずっと前からこの機能をサポートしてきたのに、なぜFirefoxがまだ実装していないのかよく分からない。サードパーティ拡張機能(PWAs for Firefox)は見つけたが、プライバシー面で使うのはためらわれる
Googleの振る舞いを回避する方法があるとしても、それは正しい方向ではないと思う。もし人々がGoogleの動きに同意しないなら、ChromeおよびChromiumベースのブラウザをすべて捨てるのが唯一正しい方法だ。Googleの独占に打撃を与え、Webの未来の方向性に対する支配力を奪うことが重要だ
本当の回避策はFirefoxを使うことだ。uBlock OriginはFirefoxで最もよく動作する
uBlock Origin works best on Firefox
GoogleがMV3のほうがMV2より本当に安全なのかも疑わしい。MV3に変えたからといって、本質的にセキュリティが強化されるようには思えない
誰かがadblockerの回避策を見つけてGoogleに知らせた件について、「見つけてすぐGoogleに告げ口するのか、すごいな」という反応がある
OPがGoogleに何の問題もない「issue」を報告したせいで、アドオン開発者がMV3の制限を回避できる方法が塞がれてしまった。0ドルの価値があったことを願う
Braveを使い始めてから、Chromeがまったく恋しくならない
Brave
Stop using Brave browser
「adblockerにはwebRequestBlockingが必須で、Googleは広告で収益を得ているのだからこの機能を外したのは非常に意図的だ」という主張に対して、「それは事実ではなく、誰でもuBlock Origin LiteをChromeとmanifest v3で使えるし、性能も良く従来のuBlock Originとの差を感じない。すべてC++でフィルタリングされるのでずっと速い。もちろんルール最大数の制限はあるが、今は十分対処可能なレベルだ」という意見もある
仕事用ノートPC以外ではChromeを使うことはなく、普段はFirefoxを使い続けている。それでも、仕事でのWeb閲覧(資料調査、文書作成など)に役立っていたuBlock Originが使えなくなるのは残念だ
単に回避したいだけならFirefoxをインストールすればいい