BadBlocker――Chrome拡張「Adblock for YouTube」(1,100万ユーザー)に休眠状態のリモート操作可能なスクリプト注入経路

この記事は約16分で読めます。

2026年6月25日、エンタープライズブラウザ企業のIslandが、Chrome Web Storeで1,100万を超えるインストール数を持つ広告ブロック拡張機能「Adblock for YouTube」(Extension ID: cmedhionkhpnakcndndgjdbohmhepckk)について、サーバー側設定の1回の変更だけで、URLチェックを通過させた任意のWebサイト上でJavaScriptを注入できる「アーキテクチャ的な仕組み」が組み込まれているとするレポート「BadBlocker」を公開しました。同社の研究者Oleg Zaytsev氏とShachar Gritzman氏は、現時点で実際の悪用は観測されていないものの、機能自体はサーバー側の応答を変えるだけで発動可能な「休眠状態」にあると指摘しています。Chrome Web StoreにはFeaturedバッジ付きで掲載されており、本稿執筆時点でも残存しています。

BadBlockerの全体像

BadBlockerは、サーバー側の変更だけで悪用可能になり得る構造を指摘するレポートです。Adblock for YouTubeは、その名のとおりYouTubeの広告ブロック機能を実際に提供しており、4.4の評価と37万4,000件のレビューを獲得しているChrome Web Store全体で31位とされる人気拡張機能です。問題は、この拡張機能が宣伝されている機能を提供しつつ、サーバー側の応答変更だけで任意JavaScript実行へ転用できる「アーキテクチャ上の素材」も同梱している点にあります。

項目内容
対象拡張機能Adblock for YouTube(Chrome Web Store、Featuredバッジ付き)
Extension IDcmedhionkhpnakcndndgjdbohmhepckk
インストール数1,100万+(評価4.4、レビュー37万4,000件)
発見者Oleg Zaytsev氏(Product Security Researcher)、Shachar Gritzman氏(Senior Security Researcher)――Island
命名BadBlocker(Islandによる命名)
レポート公開日2026年6月25日
リスクの性質休眠状態のリモート操作可能なスクリプト注入経路。実際の悪用は未観測
発動条件サーバー側設定の1回の変更(拡張機能アップデート不要、Chrome Web Storeレビュー不要、利用者からは不可視)
Chrome Web Store現状本稿執筆時点で残存(live状態)

権限と動作範囲の不整合

BadBlockerの起点は、宣言されている権限と、それを抑止するはずの実装チェックとの間に大きな乖離がある点です。Islandは、広告ブロッカーというカテゴリは性質上、リクエスト検査、ページ書き換え、要素非表示などのために幅広い権限が必要となるため、強力な権限要求が正当化されやすく、Chrome Web Storeの審査でも許容されやすい構造があると指摘しています。問題は、その権限を抑止するゲートが脆い場合に何が起きるかです。

Adblock for YouTubeはマニフェストの先頭で次のように宣言しています。

"host_permissions": ["<all_urls>"]Code language: JavaScript (javascript)

<all_urls>は、Webメール、銀行、SaaSアプリ、管理コンソール、社内ツールなど、ブラウザが訪問するあらゆるWebサイトでの実行を許可する記述です。YouTube専用と銘打つ拡張機能がこの権限を必要とする理由は本来あまりありませんが、YouTube動画が外部サイトに埋め込まれることなどを念頭に、ある程度の柔軟性は理解できるとIslandは述べています。問題は、その柔軟性がYouTube由来のオリジン、フレーム、リクエストパターンに紐づけられていない点です。

拡張機能側にはYouTube判定らしきチェックが入っており、注入処理の前にURLを検査します。

var isAdBlockWorksOnPage = function(url) {
    return /youtube\.com/.test(url);
};Code language: JavaScript (javascript)

このチェックは、URL全体のどこかに「youtube.com」という文字列が含まれていれば通過します。ホスト名、フレームオリジン、埋め込みプレーヤーのコンテキストは検証されません。Islandの例示によれば、次のいずれもチェックを通過します。

https://www.facebook.com/page?ref=youtube.com         ✓ 通過
https://bank.example.com/search?q=youtube.com         ✓ 通過
https://internal.corp.com/redirect?from=youtube.com   ✓ 通過Code language: JavaScript (javascript)

すなわち、全Webサイトへのアクセスを要求しておきながら、それを抑止するゲートはURLクエリ文字列に「youtube.com」を含めるだけで迂回できる、という構造です。

リモート制御されるスクリプト注入経路

拡張機能は24時間ごとに、自身のリモート設定を取得します。

fetch("https://api.adblock-for-youtube.com/api/v2/rules?version=7.2.1")Code language: JavaScript (javascript)

応答にはネットワークフィルタやCSSセレクタといった通常の広告ブロックルールに加えて、scripletsRulesというフィールドが含まれます。広告ブロッカーが「スクリプトレット」(広告除去のための小さなJavaScript関数群)を持つこと自体は珍しくありません。危険な境界線は、リモートサーバーが強力なスクリプトレットを選択し、インストール後に実行可能なコードを供給できるかどうかにあります。

Islandの解析によれば、拡張機能は静的なフィルタールールを取得するだけでなく、MAIN worldへのJavaScript注入を引き起こす「指示」を取得します。注入処理のコードは概略次のような構造を持ちます。

function injectedFunction(script, scriptId) {
    if (window[scriptId])
        return;
    var policy = window.trustedTypes.createPolicy('default', {
        createScript: function (input) { return input; },
    });
    var safeScriptContent = policy.createScript(script);
    window[scriptId] = true;
    var scriptTag = document.createElement('script');
    scriptTag.setAttribute('type', 'text/javascript');
    scriptTag.textContent = safeScriptContent;
    var parent = document.head || document.documentElement;
    parent.appendChild(scriptTag);
    parent.removeChild(scriptTag);
}

function executeScriptOnPage(tabId, script) {
    injectionString = "(()=>{try {".concat(
        script,
        ";} catch (e) {console.log(e)}})();"
    );
    return [4, chrome.scripting.executeScript({
        target: { tabId: tabId },
        func: injectedFunction,
        injectImmediately: true,
        world: 'MAIN',
        args: [injectionString, 'aby-38oj8EJVO3Uu7t4G9PdfI'],
    })];
}Code language: JavaScript (javascript)

注目すべきはworld: 'MAIN'の指定です。これはページ自体のJavaScript実行コンテキスト(MAIN world)にスクリプトを注入することを意味し、注入されたコードはアプリケーション自身のJavaScriptと並んでDOM、セッション状態、フォーム、可視データすべてにアクセスできます。

スクリプトレットの1つにtrusted-create-elementがあり、これはHTML要素をページ上に作成する処理です。サーバーが次のような応答を返した場合を考えてみます。

{
    "name": "trusted-create-element",
    "args": ["body", "script", "", "/* any JavaScript here */"]
}Code language: JSON / JSON with Comments (json)

このシナリオでは、作成される要素が<script>タグであり、その内容はサーバーから直接供給されます。DOMに追加された時点でページのコンテキストで実行され、サーバーから完全に制御される任意スクリプトの注入経路が成立します。

Islandは「我々の分析時点ではtrusted-create-elementはサーバー応答内でアクティブではなかった。能力は休眠状態であって、欠如しているわけではない。これを発動させるにはサーバー側の1回の変更で済む。拡張機能アップデートも、Chrome Web Storeレビューも不要」と述べています。これがBadBlockerという命名の核心です。

PoC:YouTubeからSalesforceへのクロスサイト実証

Islandはこの注入経路を検証するため、ローカルモックサーバーを使ったコントロール下のPoCを構築しました。拡張機能本体は一切改変せず、同じパッケージ、同じ権限、同じURLチェック、同じスクリプトレットライブラリ、同じ注入ロジックのまま、モックサーバーのみが応答を制御するという構成です。

  1. ステップ1:拡張機能がサーバー選択スクリプトレットを取得。インストール後、拡張機能は通常のルール設定を要求し、モックサーバーは1件のscripletsRulesエントリを返します。拡張機能はこれを保存し、後のページ注入で使用します。
  2. ステップ2:スクリプトレットがYouTubeで実行される。ユーザーがyoutube.comを開くと、拡張機能の/youtube\.com/チェックが自然に通過します。サーバー選択スクリプトレットがYouTubeタブに注入され、クエリ文字列に「youtube.com」を含むSalesforce URLを開きます。
  3. ステップ3:同じスクリプトレットがSalesforceで実行される。Salesforceのページはユーザーの認証済みブラウザセッション下で開き、フルURLにまだ「youtube.com」が含まれているため、拡張機能のURLチェックが再度通過します。Salesforceにもスクリプトレットが注入されます。
  4. ステップ4:Salesforceのデータがサーバーへ到達する。Salesforce内で動作するスクリプトレットは、ユーザーのセッションコンテキストで操作可能となり、PoCではユーザーに見えるアカウントデータを読み取ってモックサーバーへ送信しました。

この一連の流れに必要なのはサーバー側設定の1回の変更のみで、拡張機能のアップデートも、新たなChrome Web Storeレビューも、ユーザーから見える変更も発生しません。

拡張機能の経歴と関連拡張機能

BadBlockerが警鐘を鳴らしている本質は、単一の不審なコードではなく、複数の要素が組み合わさったときに生まれるリスクプロファイルです。Adblock for YouTubeは2014年以降10年以上Chrome Web Storeに掲載されており、その間にオーナーシップとコードベースが大きく変化しています。

  • 2014年:小規模な独立開発者が公開した、ストレートなYouTube広告ブロッカーとして登場。初期版にはリモート制御スクリプト注入のアーキテクチャは確認されない
  • 2018年:オーナーシップが変更され、コードベースが実質的に書き直される。Chrome Web Storeのメタデータアーカイブ、過去の拡張機能パッケージ、バージョン間のコード差分に変化が現れる。この変更以降、ユーザー数が数十万から1,000万超まで成長
  • 2024年6月以前:Bitdefenderがアドウェア活動と関連付けてフラグしていた広告注入SDK「Unistream」を同梱していた。2024年6月までに削除
  • 2025年2月:現在のリモート制御スクリプト注入経路が確認される

同じ開発インフラから配信されていた関連拡張機能群が、過去にChrome Web Storeから削除されている点も重要です。Islandは、get.adblock-for-youtube.comupdate.adblock-for-y.comといった過去のランディングページが、Adblock for ChromeやAdblock for Youへの誘導に使われていたと説明しています。

  • Adblock for Chromeonomjaelhagjjojbkcafidnepbfkpnee):Adblock for YouTubeと同時期に同じインフラに登場。過去版には、ページに注入されたコードが特権的なchrome.* APIを呼び出せる「ブリッジ」が含まれていた。Googleがマルウェアとして削除(GitLabのThreat Intelligenceチームによる文書化あり)
  • Adblock for Youogcaehilgakehloljjmajoempaflmdci):同じアップセル経路、全Webサイトアクセス権限、リモート設定、CSP書き換え、MAIN world注入というパターン。リモート設定ドメインはabu-xt.comを使用。Chrome Web Storeから削除済み

さらに、IslandはAppendixで、過去にChrome Web Storeから削除された関連拡張機能としてAdBlock Suite(gekoepiplklhniacchbbgbhilidiojmb、2023年9月にGoogleが削除)も挙げています。

Islandは結論として「1行の怪しいコードではなく、組み合わせが問題である。1,100万ユーザーを抱える拡張機能、全Webサイトへのアクセス権、リモート制御の注入経路、過去の広告注入インフラ、大規模なオーナーシップとコードベース変更、マルウェアでChrome Web Storeから削除された関連拡張機能。これらが揃ったとき、観測すべきリスクプロファイルが立ち上がる」と述べています。

対処方法

現時点で実際の悪用は観測されていないものの、リスクの構造は明確で、サーバー側設定の1回の変更で発動可能です。

  • 該当拡張機能の有無を確認する。Chrome のchrome://extensionsページで「Adblock for YouTube」を検索し、IDがcmedhionkhpnakcndndgjdbohmhepckkと一致する場合は削除を推奨します。同名の別拡張機能も存在するため、IDによる照合が確実です。組織内のChrome拡張機能インベントリを保持している場合は、上記IDに加えて、過去削除済みの関連3拡張機能(onomjaelhagjjojbkcafidnepbfkpneeogcaehilgakehloljjmajoempaflmdcigekoepiplklhniacchbbgbhilidiojmb)もスキャン対象に含めるとよいでしょう。
  • ホスト権限を「宣言された目的」と照らして監査する。YouTube広告ブロックを謳う拡張機能が<all_urls>を要求しているのは過剰です。Islandが推奨するように、*://*.youtube.com/*のような限定的なホスト権限で十分であるはずの拡張機能が、全Webサイトアクセスを要求している場合はレビュー対象にすべきです。
  • リモート設定を取得する拡張機能を注意深く監視する。外部サーバーから設定を取得し、それを使ってページ注入ロジックを制御する拡張機能は、自己完結型のルールセットを持つ拡張機能とはアーキテクチャ的に異なる性質を持ちます。api.adblock-for-youtube.comget.adblock-for-youtube.comのドメインへの通信をネットワーク監視に組み込むことで、影響を受けている端末を特定できます。
  • オーナーシップと権限の変化を継続的に監視する。Adblock for YouTubeの権限拡大は、v5からv7の18ヶ月のあいだに、一見妥当に見える単発の変更を積み重ねる形で起きました。長期間ストアに掲載されている拡張機能でも、コードベースとオーナーシップが静的であるとは限りません。
  • エンタープライズ管理ポリシーで拡張機能を制御する。ChromeのEnterprise Policies(ExtensionInstallBlocklistExtensionInstallAllowlistExtensionSettings)を活用して、業務環境で許可する拡張機能を明示的にホワイトリスト化する方針が、汎用的な対策として有効です。

個人ユーザー向けには、YouTube広告ブロックが目的であれば、より透明性の高い実装の拡張機能や、ブラウザ自体の機能を検討する選択肢があります。ChromeではManifest V2版のuBlock Originが利用しにくくなっており、Manifest V3準拠の別拡張であるuBlock Origin Liteが代替として提供されています。フル機能版を重視する場合は、Firefoxなど別ブラウザの利用も選択肢になります。

監視対象インジケータ(IoC相当)

Islandが公開している調査対象および関連インフラを以下に整理します。なお、Islandは悪意あるペイロード配信を観測していないとしており、以下は侵害確認済みの痕跡というより、組織内に該当拡張機能や関連通信が存在しないかを確認するためのインジケータとして扱うのが適切です。

Extension ID

  • cmedhionkhpnakcndndgjdbohmhepckk ── Adblock for YouTube™ v7.2.2(本稿執筆時点でChrome Web Storeに残存、1,100万ユーザー超)
  • onomjaelhagjjojbkcafidnepbfkpnee ── Adblock for Chrome v3.3.3(Chrome Web Storeからマルウェアで削除済み)
  • ogcaehilgakehloljjmajoempaflmdci ── Adblock for You v3.0.3(Chrome Web Storeからマルウェアで削除済み)
  • gekoepiplklhniacchbbgbhilidiojmb ── AdBlock Suite v1.3.1(2023年9月、Googleが削除)

現用インフラ

  • api.adblock-for-youtube.com ── scripletsRules配布(GET /api/v2/rules)
  • get.adblock-for-youtube.com ── ライフサイクルビーコン(インストール、アップデート、アンインストール)

過去のインフラ

  • unistream.io / cdn.unistream.io / data.unistream.io ── Unistream広告注入SDK(現開発者と関連、Bitdefenderがフラグ)
  • adblock-for-chrome.com ── 削除済みAdblock for Chromeのバックエンドドメインファミリー
  • abfc-extension.com ── Adblock for Chromeが使用していたリモート設定エンドポイント
  • adblock-for-y.com / update.adblock-for-y.com ── Adblock for Youを宣伝する過去のアップセル経路
  • abu-xt.com ── Adblock for Youが使用していたリモート設定エンドポイント

参考情報

コメント

タイトルとURLをコピーしました