世界を動かす技術を、日本語で。

Googleの大規模なアンチ広告ブロックアップデートを回避する方法

概要

  • Google ChromeManifest V2 (MV2)から Manifest V3 (MV3)へ移行
  • MV3adblocker などの拡張機能に影響
  • webRequestBlocking 権限の廃止とそのバグ
  • JavaScriptバインディング の脆弱性利用例
  • バグ報告と 修正対応、報酬の話

Chrome Manifest V3とAdblocker問題

  • MVManifest Version の略称
  • MV3 導入により、拡張機能の webRequestBlocking 権限が廃止
  • webRequestBlocking は、リクエスト内容に応じて 動的に通信をブロック する機能
  • adblocker はこの権限に依存しており、MV3で 機能制限 を受ける
  • Google が広告収入主体であるため、意図的な変更と見る声も

Chrome拡張APIのJavaScriptバインディングの歴史

  • Chrome本体C++ で記述
  • 拡張機能は JavaScript で記述し、API呼び出しもJS風
  • かつては「 extension binding modules」というJSファイルをページに注入
  • グローバル関数やプロトタイプの 上書きXSS脆弱性 が多発(2015〜2016年)
  • Google はその後、APIバインディングの多くを C++ へ移行
    • ただし一部は現在も JavaScriptバインディング を使用

webRequest APIの特殊性とバグ概要

  • chrome.webRequest APIは今も JavaScriptバインディング 利用
  • 本来、MV3では blocking オプションが使えず、 cancel: true は無効化
  • しかし、 webRequestEvent のラッパークラスの constructor が公開状態
  • 独自イベントを生成可能
    • 例:let fooEvent = new WebRequestEvent("foo")
  • opt_webViewInstanceId パラメータを悪用し、 webRequestBlocking の権限チェックを回避可能
    • 本来は Platform Apps 用の仕組み
    • イベント名やIDを偽装し、 blocking 機能を利用できるバグ

バグの実例コード

  • 偽装イベント 生成例
    • let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337)
    • fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking'])
  • Platform Apps は2020年に廃止済みだが、2025年時点でもコードが残存

バグの影響と修正対応

  • このバグを使えば、 MV3 でも adblocker が完全動作可能
  • 報告者は2023年に Google へ報告、 Chrome 118 で修正
    • opt_webViewInstanceId 利用時に WebView権限 チェックを追加
  • 報酬は 0ドル (セキュリティ上の重大性が低いと判断)
  • 脆弱性 の本質は、 古いコード の残存によるもの

総括・教訓

  • 数行のコード で大規模なアップデートの回避が可能な事例
  • 古い設計レガシーコード のリスク
  • 興味深い脆弱性体験談として紹介

参考・関連情報

  • さらに興味があれば、同年に発見された Chrome拡張バグ (CVE付き・1万ドル報酬)の記事も参照推奨

Hackerたちの意見

で、結論はどうなるの?別のChromeベースのブラウザを使ってMV3を避けることはできるのかな?これが起こった後、プライバシーに関してはどうなるんだろう?

僕が読んだ限りでは、MV2を維持することも考えられるみたい。他のChromiumベースのブラウザがこの問題を抱えていなければいいけど、時間が経つにつれてYouTubeはMV3がないブラウザをサポートしなくなるだろうね。まだしばらくは大丈夫だと思うけど。

このブログポストでは、MV3の制限を回避するためにMV2でしか利用できない重要な機能にアクセスできるワークアラウンドを発見したことが書かれてる。このワークアラウンドは2023年に修正されて、Googleがセキュリティの脆弱性とは見なさなかったため、$0の支払いになった。つまり、uBO(MV2)は今日、コンピュータを再起動したら動かなくなったってことかな。

彼らはそれがセキュリティの問題ではないと決めたんだけど、正直、僕もそう思う。だって、拡張機能に既に持っているデータ以上のアクセスを与えなかったからね。つまり、MV3はMV2よりも実際には安全じゃないって認めてるってこと?

誰かが本気で彼らを信じているとは思えないよ。このアーティクルは明らかな利害の対立から始まってるしね。もちろん、拡張機能に自分が訪れるウェブサイトやリクエストを知らせるのは不安定なライフスタイルだよ。でも、僕はuBOを広告会社や彼らのデータ収集者よりも信じてるから、まだ使ってる。

OPはGoogleに無害な「問題」を修正させたみたいで、それはアドオン開発者がMV3の制限を回避するために使えるものだった。$0の価値があったといいけど。

うん、僕もそう思った。OPはメガコープのために無償で働いて、ウェブをちょっと悪化させたって感じかな、「セキュリティ、かな?」って?お疲れ様。

この結論には賛成できないな。GoogleはMV3とその制限に完全に責任がある。責任を彼らから逸らす理由なんてないよ。ちょっと考えてみてよ:もしOPが報告してなかったら、どうなってたと思う?他のアドブロッカーが後で見つけて使ったとしても、Googleはこれを削除してたはず。もしかしたら、(悪用した)拡張機能もChrome Web Storeから削除されるかもね。

本当に?Googleがそんなにバカだと思ってるの?実際に使われているアドブロッカーが実装したら、すぐにパッチが当てられるよ。これを一度悪用してずっと得られるなんてことはないからね。

アドブロッカーをMV3で動かす方法を見つける >Googleにチクる いいね、ありがとう!

まあ、彼を擁護するなら、最初のアドブロッカーが使った後すぐに修正されてたはずだし、結局何も得られなかったんだよね。あ、待って、何も得られなかったのはその通りか ;)

なんてクズなんだ。

https://brave.com/ に切り替えてから、Chromeを一度も恋しく思ったことないよ。

使えるブラウザの中で、怪しいクリプト兄弟にデータを渡すのは絶対にトップには来ないよね。

Twitchが動かないから、時々切り替えちゃうんだよね。

下で動いてるのは同じBlinkエンジンだし、まさに見た目だけの話だよね。Manifest V2を使わないBlinkベースのブラウザは知らないな。それはソフトフォークになるし、長持ちしないだろうね。

「欠点」の欄では、Braveはまだ営利企業だし、いくつかの機能が一部の人には不快感を与えてる。逆に「利点」の欄では、Braveのデフォルト設定を改善するための「Braveをデブロートする方法」みたいなコンテンツがたくさんあるよ。 https://www.youtube.com/watch?v=W6cKFliWW6Q

アドブロッカーは基本的にwebRequestBlockingが必要だよね。広告から収益を上げてる会社がそれを削除するのは、かなり都合がいい(くすっ)。なんでこれが繰り返されるの?それは真実じゃないよ。誰でもuBlock Origin LiteをChromeで使えるし、manifest v3でも問題ない。ちゃんと動くし、むしろ素晴らしいよ。ブロックに関しては古いuBlock Originと違いが分からないけど、今はC++でフィルタリングしてるから速いんだ。YouTubeでもちゃんと動くし。今はルールの最大数に制限があるのは知ってるけど、今のところその制限は十分だと思う。

それは本当だよ。文字通りね。なんで「Lite」って呼ばれてると思う?

Googleのやり方に対抗するためにbigsが存在しても、それが正しい進むべき道ではないよ。もし人々がGoogleの動きに反対するなら、唯一の正しい行動はChrome(とすべてのChromiumブラウザ)を捨てることだよ。彼らが痛い目を見るところを狙って、ウェブの未来に対する独占を奪おう。

そんなことは起こらないよ。

みんな、デグーグル化されたChromiumベースのブラウザに切り替えるのは十分じゃないって思ってるみたいだけど、これはGoogle自身が広めてる心理戦だと思う。FirefoxはChromeとはかなり違うから、Chromeに慣れてる人には大きなジャンプになるよ。BraveやカスタムChromiumビルド、VivaldiなんかはGoogle Chromeに似てるけど、Googleのスパイ機能がないだけなんだ。「GoogleがまだChromiumをコントロールしてるから十分じゃない」っていう主張は、まさにこの手の心理戦を裏付けるためのFUDだと思う。

IEの教訓を忘れたみんなのおかげで達成された独占状態だね。Web標準を学ぶ代わりに、アプリケーションと一緒にChromeを出荷してる。

でも、広告ブロッカーの作り方がわからなかったから、2023年8月にGoogleに問題を報告することにしたんだ。Chrome 118で、拡張機能が使っているかどうかをチェックすることでパッチが当てられた。まあ、何も役に立たなかったね?

作者です、すみません。オープンソースの拡張機能、特に何百万ものユーザーがいる大きな広告ブロッカーがこのバグを使うのは無理だと思うよ。Googleがしっかり監視してるからね。どっちにしてもすぐにパッチが当てられてたはず。

一番のバイパスはFirefoxを使うことだね。uBlock OriginはFirefoxで一番うまく動くよ。