死なないサービス・ワーカーと、気にも留めないVM
Googleは先週、四年前のChromiumのバグを誤って再公開しました——ブラウザを閉じてもJavaScriptを走らせ続けるサービス・ワーカー、主要なChromium系ブラウザのすべてに存在し、いまだ未修正です。概念実証はすでに野に放たれています。興味深いのは、それがどう動くか、ではありません。タブを閉じれば下に横たわる機械そのものが消えてしまうブラウザにとって、「永続化」とは何を意味するのか、です。
永続化はコードの性質ではありません。コードが住むことを許された場所の性質です。「絶対に死なない」サービス・ワーカーは、ウィンドウを閉じるたびに、自分がインストールされたマシンが破壊されてしまうと、困ったことになります。
2026年5月20日、Chromiumのイシュー・トラッカーは、2022年から制限付きステータスのまま置かれていたあるバグへのアクセス制限を、ひっそりと解除しました。数時間のうちに、そのバグは——動作する概念実証もろとも——ウェブ中でミラーされ、アーカイブされ、書き起こされていきました。Googleは再びそのイシューを閉じに動きました。手遅れでした。ページはすでにWayback Machineに取り込まれており、BleepingComputerの記事は翌日に公開されました。
バグは本物で、概念実証は動き、最初の報告から四年が経った今もなお、Chrome Dev 150でもEdge 148でも修正されていません。影響は、Chromium派生のあらゆるブラウザに及びます——Chrome、Edge、Brave、Opera、Vivaldi、Arc。
このバグがページに許すことを一文で言えば、ありふれた話です——サービス・ワーカーを登録すること。ブラウザがバックグラウンドで走らせ続けると合意する、小さなJavaScriptの断片を。ただし、それはページを閉じても、タブを閉じても、ブラウザを閉じても、マシンを再起動しても、走るのを止めません。2022年12月にこのバグを最初に提出した研究者のLyra Rebaneは、最悪のケースをBleepingComputerに次のように要約しています——Microsoft Edgeではダウンロード・メニューさえ表示されない、結果として「ブラウザを閉じた後も走り続ける、完全に無音のJS RCE」だ、と。
なぜこのバグが存在するのかという技術的細部よりも、それが可能にする攻撃のクラスのほうが重要です。これは永続化の原始要素です。一度だけ訪れた、ことによると何ヶ月も前に、覚えてもいない広告だったかもしれないページが、あなたのコンピュータ上で無期限にコードを走らせ続けることを許されてしまう。ボットネットへの徴用、広告詐欺、クリプトジャッキング、DDoSへの参加、緩慢なデータ流出、同じサイトへ再ログインするたびの日和見的な認証情報の刈り取り——ブラウザを終了しても生き延びる足場さえあれば、これらはすべて些事になります。
良いバグです、啓発的という意味で。悪いバグです、使われるだろうという意味で。
サービス・ワーカーとは実際のところ何か
ウェブ・プラットフォームは、ここ十年ほどのあいだ、ページが「サービス・ワーカー」と呼ばれる小さなJavaScriptプログラムをインストールすることを許してきました。これらはタブとは別に、バックグラウンドで動作します。存在の理由は、ウェブ・アプリにまっとうな振る舞いをさせるためです——オフラインでもサイトが読み込まれるようアセットをキャッシュする、プッシュ通知を配送する、ネットワーク復帰時にデータを同期する。
サービス・ワーカーはオリジン(たとえばhttps、ホスト名example.com、デフォルト・ポートの組み合わせ)に対して登録されます。一度登録されると、ブラウザはそれをディスクに保存し、次にそのオリジン上の何かを訪れたとき——あるいは、プッシュ・メッセージのようなバックグラウンド機能の場合には、ブラウザ自身が定期的に起こす形で——呼び戻します。ユーザーから見れば、ワーカーは不可視です。オペレーティング・システムから見れば、ワーカーはブラウザの一部であり、ブラウザ・プロセスが持つあらゆる権限のもとで動いています。
Rebaneが報告したバグは、おおまかに言って、敵対的なページがバックグラウンドのダウンロードAPIを悪用して、ブラウザが終了を拒むワーカーを登録できる、というものです。同種のChromiumサービス・ワーカー・バグは過去にも出荷されてきました——これは、過去12ヶ月で少なくとも二つ目です。パターン——ページが何かを植え、ブラウザがそれを保存し、ブラウザが後でそれを自分で呼び戻す——こそが、覚えておく価値のある部分です。そして同時に、これは、ブラウザが長寿命のディスクを所有することをやめた瞬間に壁にぶつかるパターンでもあります。
永続化に必要なもの
永続化——ウェブ・プラットフォーム的な意味ではなく、セキュリティの意味で——とは、攻撃者が初期アクセスの直後に行う手のことです。ページかバイナリがあなたのマシンに着地し、何か他の興味深いことをする前に、自分の一部が明白なクリーンアップ手順を生き延びるよう手配します——タブを閉じる、ブラウザを終了する、再起動する、帰りの電車でラップトップをスリープさせる。デスクトップOSにおいて、永続化には独自の語彙があります——macOSのLaunchAgent、Windowsのスケジュールされたタスク、Linuxのsystemdユーザー・ユニット、ブラウザ拡張、自動起動エントリ。
サービス・ワーカーは、事実上、ブラウザ内のLaunchAgentです。ブラウザが制御するスケジュールで、登録され、保存され、生き返らされます。ウェブ・プラットフォームが提供する永続化の原始要素のうち、より優雅なものの一つであり、それこそが、バグを引き寄せ続ける理由の一部です。
決定的に重要なのは、そのリストにあるあらゆる種類の永続化が、三語で言える同じ要件を持っていることです——何かが永続しなければならない。LaunchAgentが永続するのは、そのエージェントの.plistファイルが書かれるファイルシステムがあり、エージェントが起動のたびにそのファイルシステムから読み戻されるからです。サービス・ワーカーが永続するのは、そのワーカーの登録が書かれるブラウザ・プロファイルがあり、ブラウザの起動時にその登録が読み戻されるからです。ストレージ層を取り除けば、「永続化」もそれとともに消えます。
その一文——ストレージ層を取り除けば、永続化はそれとともに消える——こそ、Bromureが中心に据えて設計されたアーキテクチャの一部です。
Bromureがブラウザをどう動かすか
Bromureのセッションはプロセスではありません。仮想マシンです。ブラウザ・ウィンドウを開くと、ホストはApple Siliconのハイパーバイザ上に、小さな使い捨てのLinuxゲストを起動します。あなたのタブが走るのは、そのゲストの中のブラウザ・プロセスです。ゲストは自前のファイルシステム、自前のメモリ、自前のカーネルを持ちます。そのどれも、ホストのものではありません。
このアーキテクチャのうち、特にサービス・ワーカー・バグにとって意味のある部分が二つあります。
第一に、サービス・ワーカー登録が通常住むはずのディスク上のプロファイルは、ゲストのファイルシステムの中にあり、あなたのMacのファイルシステムの中にはありません。ゲストが消えるとき、そのファイルシステムも一緒に消えます。第二に、ゲスト自体には、ユーザーが定める寿命があります——既定では、ゲストはプロファイル(仕事用、個人用、銀行用、LLMコーディング用サンドボックス)に紐付けられ、ユーザーが選んだときにワイプされますが、エフェメラルなタブの場合、ウィンドウを閉じた時点でゲストは破壊されます。プロファイル・モードであっても、ゲストはユーザーがいつでも巻き戻せるディスク・ボリューム・スナップショット一つ分です。
使い捨ての場合、「絶対に死なない」ワーカーには、死なずに居続けるための場所がありません。次のブラウザ起動時に再び読み込まれるはずだったディスク上の行は、もう存在しない仮想マシンの中にあったからです。「ブラウザを閉じた後も走り続けた」JavaScriptが走り続けられたのは、走り続けるための土台があったからにすぎません。ブラウザを閉じることが下の機械を閉じることでもあるとき、ワーカーはブラウザと同時に止まります——元々の仕様が想定していた、まさにその挙動です。
プロファイル・モードの場合——たとえば、セッションを跨いで自分を覚えておくことを_意図して_保持している長寿命の「ソーシャル・メディア」プロファイル——ワーカーは従来通り生き残ります。そのひとつのプロファイルのVMにスコープされた形で。それでも、あなたのDocuments、キーチェーン、他のプロファイル、コンピュータの他の部分を見ることはできません。そしてもし、そのプロファイルが拾うべきでないものを拾ったかもしれないと疑ったときには、VM全体を最後のクリーンなスナップショットへ巻き戻せます——所要時間は、ブラウザを再起動するのとほぼ同じです。
より一般的な論点
上記を「Bromureはたまたまこの特定のサービス・ワーカー・バグを退ける」と読むのは簡単でしょう。それは事実です——が、興味深い主張ではありません。興味深い主張はもっと一般的なものであり、今回の出来事はその小さな一片の証拠にすぎません。
ブラウザのゼロデイは、これからも着地し続けます。これは過去12ヶ月で少なくとも二つ目のChromiumサービス・ワーカー・バグです。2024年と2025年の大物たちはV8の型混同やMojoサンドボックス脱出であり、六桁の値段で買われ、商用スパイウェア・ベンダーや国家寄りのグループに使われました。サービス・ワーカーが存在する前にもレンダラ侵害はありましたし、この個別のバグが修正されたずっと後にもレンダラ侵害はあるでしょう。新しいものを見つける経済学——とりわけ、開示の窓の両側にMythosクラスの AI監査者が回路の中に入った今——は、防御側に有利にではなく、不利に動いています。
ゼロデイが発火したときに問うべきは、ブラウザは無欠だったか、ではありません。無欠ではありませんでした。問うべきは、そのエクスプロイトは実際にどこまで届いたか、です。
Chromiumのサンドボックス脱出——ここ十年、数ヶ月ごとに読んできた、定番の「ブラウザ・ゼロデイ」——は、レンダラのどこか(V8、Skia、WebP、Dawn、libxml2)にあるメモリ・バグから始まり、ブラウザのブローカー・プロセスを説得して、レンダラには本来できないはずのことをやらせる、というチェーンです。これらのバグが六桁で売買されるのは、Chromiumのエンジニアたちが時間の大半を費やして維持している壁——プロセス内のサンドボックス——を横切るからです。
その壁は驚くべきエンジニアリングの所産です。同時に、系譜的には、それを越えてきたバグと同じ種類の素材——C++、共有アドレス空間、Mojoのような IPC 原始要素——でできています。V8か、Chromiumに同梱される百ものパーサーのどれかに新たなメモリ・バグが現れたとき、それは、十分な仕事量さえあれば、サンドボックスをこじ開けることのできる類いのものなのです。
VMは別種の壁です。中で走るブラウザは、ホスト・カーネルに対応する仮想メモリ・アドレスを持ちません。ホスト・カーネルは、ブラウザがパースしているページをパースしません。仮想化スタックの面積は、ブラウザに比べれば極めて小さく、それがパースするもの(vCPUのレジスタ状態、paravirtのハイパーコール、virtioのバッファ・ディスクリプタ)は、ウェブ・ページが配置した敵対的バイトではありません。その境界にもバグは存在します。とはいえ難易度のリーグが違い、数桁単位で希少であり、現れたときには通常、ハイパーバイザのベンダーがCVEを伴って告知します。
これがユーザーにとって何を変えるか
先週公表されたサービス・ワーカー・バグの個別ケースで言えば、Bromureユーザーはパッチを待つ必要がありません。バグはBromureのブラウザの中にも存在します——BromureはChromiumをアップストリームから出荷していますから——が、そのバグが可能にする挙動は、Bromureのアーキテクチャがすでに無効化している挙動です。「永久に生きる」ワーカーは、それが登録されたゲストVMが生きているあいだだけ生きます。すなわち、長くてもあなたが保持するプロファイルと同じだけ、短くてもタブが開いているあいだだけ。
「来月のどこかでブラウザのゼロデイが着地する」というより一般的なケースで言えば、Bromureユーザーは別の形の結末を得ます。最悪の場合、エクスプロイトはゲストの中身に対して発火します——そのブラウザ・セッション、そのプロファイルの中で現在ログイン中のサイトのクッキー、ユーザーがそのブラウザに入力したあらゆるもの。これは本当の損失であり、私たちはそれを覆い隠そうとはしません。失われないのはホストです——SSH鍵もなければ、~/.awsもなく、キーチェーンも、Documentsも、ソース・ツリーも、LLMエージェントのワークスペースもない。
そのトレード——ブラウザ・セッションは侵害されうるが、ホストは侵害されえない、そしてセッション自身が短い——は、新しいブラウザ・バグの速度が上がるにつれ、ますます意味を持ち続けます。
私たちが主張していないこと
率直に、二つの注意点を述べておきます。
使い捨てVMはChromiumにパッチを当てません
今回のサービス・ワーカー・バグはChromiumのバグです。直すべき人はChromiumのエンジニアであり、そうすべきです。Bromureのアーキテクチャは、バグが未修正のままであることのコストを変えはしますが、修正の代わりにはなりません。何かを見つけたら私たちはアップストリームに提出しますし、ほかのみんなが読むのと同じアドバイザリを私たちも読んでいます。
VM脱出は本物のカテゴリです
ハイパーバイザ自体——Appleの仮想化フレームワークや、その周辺のより小さな面のひとつ——のバグは、原理的には、攻撃者にホストへの到達を許します。そういうバグも存在します。同時にそれは、ブラウザのメモリ・バグに比べて数桁単位で希少であり、面積は劇的に小さい。Bromureは、ホストがレンダラ侵害に晒される度合いを、数週間おきに出荷される_あの_クラスのバグではなく、_こちらの_クラスのバグに依存させます。
来月あなたが読むことになる見出し
別のChromiumサービス・ワーカー・バグが出てきます。別のV8型混同が出てきます。別のlibwebpヒープ・オーバーフローが出てきます。極めて潤沢な資源を持つ敵対者が、極めて特定の人々に対して、極めて長い期間使ってきた別のゼロデイが、火曜の朝に緊急パッチのアドバイザリとともに公になります。
その手の朝に役立つ問いは、あなたがすでにブラウザを再起動したかどうか、ではありません。役立つ問いは、バグが着地した箱の中に、実際のところ何があったか、です。今日のほとんどのユーザーにとって、その箱は、彼らのファイルとキーチェーンと保存されたログインを抱える、同じ箱です。Bromureユーザーにとっては、箱は、最悪でも失うのが、どのみち閉じようとしていたウィンドウであるような、ゲスト仮想マシンです。
永続化には、その上で永続するための何かが必要です。その何かを使い捨てにすれば、攻撃のひとつのクラス全体が、攻撃のクラスであることをやめます。