1 ポイント 投稿者 GN⁺ 2025-07-13 | 4件のコメント | WhatsAppで共有
  • 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件のコメント

 
hhcrux 2025-07-14

おそらくそのアップデート以降、広告ブロック業者の売上はさらに伸びたでしょう。
ネットワーク段で完全にブロックしてしまうスタンドアロンアプリは有料でしか使えないので、かなり売れたはずです。

 
crawler 2025-07-14

2年も経ってすっかり無意味になった脆弱性を持ち出して、わざわざ金を払わなかったと言うとは……個人的にはあまりクールではないですね。
とはいえ、こういうこともブログに書いてこそ自分の価値を証明できるのでしょう。
心から、私もこういうマインドを学んでブログにもっとたくさん記事を書きたいですね

 
ndrgrd 2025-07-14

Firefoxを使えばいいだけです。ここ1〜2年でかなり高速化して、悪くありません。
私は何年もFirefoxをメインで使い、ときどきChromeと比較していますが、特に最近はFirefoxが十分実用になると感じています。
韓国の銀行のようにWeb標準を無視していたWebページも、最近はかなり改善されて、ほとんどはFirefoxでも問題なく動作します。
カスタマイズのしやすさはFirefoxのほうがずっと上です。

 
GN⁺ 2025-07-13
Hacker Newsの意見
  • Firefoxを一度使ってみたいとは思っているものの、たまに発生するWebサイトの読み込みバグに加えて、PWA(Progressive Web Apps)をインストールできない点が最大の障害になっている。Chromeとその系統のブラウザはずっと前からこの機能をサポートしてきたのに、なぜFirefoxがまだ実装していないのかよく分からない。サードパーティ拡張機能(PWAs for Firefox)は見つけたが、プライバシー面で使うのはためらわれる

  • Googleの振る舞いを回避する方法があるとしても、それは正しい方向ではないと思う。もし人々がGoogleの動きに同意しないなら、ChromeおよびChromiumベースのブラウザをすべて捨てるのが唯一正しい方法だ。Googleの独占に打撃を与え、Webの未来の方向性に対する支配力を奪うことが重要だ

    • 今日の独占は、みんながIEから学ぶべきだった教訓を忘れたせいだと思う。Web標準を学ばず、Chromeをアプリケーションに同梱して配布するようなやり方が原因だ
    • 記事の要点はそこではなく、実際の記事ではこの回避策がChrome 118で修正されたと言及している
    • 「独占に打撃を与えるべきだ」と言って、実際に何か変わったことがあるのかと皮肉を言いたくなる
    • 現実的にはそんなことは起こらないだろう
    • 多くの人はGoogleの追跡機能を除去したChromiumブラウザへ乗り換えるだけでは不十分だと考えているが、実際にはそれこそGoogleがむしろ望んでいるフレームだと思う。FirefoxはChromeとは明確に違い、Chromeから移るのも簡単ではない。一方でBrave、カスタムChromium、Vivaldiなどは、Googleの追跡がないChrome程度でほぼ同じだ。「Googleが依然としてChromiumを支配しているからだめだ」という主張こそ、Googleの立場から広めたくなるFUD(恐怖、不確実性、疑念)だと思う
  • 本当の回避策はFirefoxを使うことだ。uBlock OriginはFirefoxで最もよく動作する
    uBlock Origin works best on Firefox

    • 自分はずっとFirefoxを使ってきたので、こんなことが起きているとは知らなかった。妻がYouTubeで広告を見ていると言うので確認したら、以前uBlockを入れてあげたのにそうなっていた
  • GoogleがMV3のほうがMV2より本当に安全なのかも疑わしい。MV3に変えたからといって、本質的にセキュリティが強化されるようには思えない

    • 正直、これを本気で信じる人がいるのか驚く。記事自体も明白な利益相反から始まっている。ある拡張機能がユーザーの訪問先サイトやリクエスト情報を把握できるようにしておくのは、確かに脆弱な環境だ。それでも、自分は広告会社やデータ収集業者よりuBOのほうを信頼しているので、そのまま使っている
  • 誰かがadblockerの回避策を見つけてGoogleに知らせた件について、「見つけてすぐGoogleに告げ口するのか、すごいな」という反応がある

    • 実際、adblockerがこれを使い始めていたらGoogleは即座に修正していただろうし、その開発者は何の利益も得られなかったはずだ。結局何も得られないのは同じだったというのが皮肉だ
  • OPがGoogleに何の問題もない「issue」を報告したせいで、アドオン開発者がMV3の制限を回避できる方法が塞がれてしまった。0ドルの価値があったことを願う

    • こうした回避策は長くても1日以内にGoogleにすぐ消されていただろう。むしろOPが金銭的報酬を得られた可能性もあったので、十分やる価値はあったと思う。非難したくはない
    • その結論には同意しない。責任はすべてGoogleが負うべきだ。もしOPがissueを知らせていなかったとしても、後で別のadblockerがこの方法を使えばGoogleはすぐこれを禁止しただろう。ひょっとすると、その拡張機能自体をWeb Storeから完全に削除するような極端な措置を取ったかもしれない
    • 実際に人々が使っているadblockerがこの方法を実装していたなら、Googleは当然すぐ塞いでいただろう。無限に使えるチートコードのようなものではない
    • 自分も同じ考えだ。OPは大企業のために無償で働いたようなもので、結果としてWeb環境をさらに不便にした。理由はまあ……「セキュリティのため」なんだろう。ご立派なことだ
  • Braveを使い始めてから、Chromeがまったく恋しくならない
    Brave

    • むしろBraveのほうがChromeより使いづらい。Brendan Eichの問題もあるが、ブラウザ内に各種の余計な機能があり、広告ブロック(Brave Shields)も完全にはオフにできず、暗号資産関連の要素、オフにできないWebアプリのダウンロードボタン、消せないUIなど、がらくたが多すぎる
    • Braveも結局は営利企業であり、デフォルトで不要な機能が過剰に多いという点で拒否感を抱かざるを得ない。ただ、「Braveをダイエットする方法」のように設定をスリム化するコツを紹介するコンテンツも少なくない
    • エンジンは結局Blinkなので、見た目だけ変えたようなものだ。Manifest V2を維持し続けるBlinkブラウザは見たことがない。仮にあったとしても、それはソフトフォークなので長くは持たない
    • Braveも結局Chromiumベースなのだから、Chromeと実質的に同じだ。Manifest V3はいずれ適用されるしかない
    • Braveブラウザを使うべきではないという批判的な見方もある
      Stop using Brave browser
  • 「adblockerにはwebRequestBlockingが必須で、Googleは広告で収益を得ているのだからこの機能を外したのは非常に意図的だ」という主張に対して、「それは事実ではなく、誰でもuBlock Origin LiteをChromeとmanifest v3で使えるし、性能も良く従来のuBlock Originとの差を感じない。すべてC++でフィルタリングされるのでずっと速い。もちろんルール最大数の制限はあるが、今は十分対処可能なレベルだ」という意見もある

    • とはいえLiteはLiteなので、可能性は制限されている。それ自体が本来のadblockerではないため、完全に同じではない
  • 仕事用ノートPC以外ではChromeを使うことはなく、普段はFirefoxを使い続けている。それでも、仕事でのWeb閲覧(資料調査、文書作成など)に役立っていたuBlock Originが使えなくなるのは残念だ

  • 単に回避したいだけならFirefoxをインストールすればいい

    • FirefoxはWebブラウザとしても、ベースとしてもいまいちだと思う。ZenがChromiumを使わなかったのは残念だ