技術 約6分で読めます

Chrome 146のDawnにuse-after-free、2026年4件目のゼロデイが実環境悪用

Googleが2026年3月31日、Chrome向けの緊急セキュリティアップデートをリリースした。修正件数は21件、そのうちCVE-2026-5281が実環境での悪用(in-the-wild exploit)が確認されているゼロデイだ。2026年に入ってからのChrome緊急ゼロデイパッチはこれで4件目になる。

CVE-2026-5281の概要

脆弱性はDawnのuse-after-free(解放済みメモリ参照、CWE-416)。DawnはオープンソースのクロスプラットフォームWebGPU実装で、ChromeがWebGPU APIを提供するために使っているグラフィックス抽象化レイヤーだ。

CVSSスコアは現時点で未確定(N/A)だが、高深刻度(High)に分類されている。

発見者は「86ac1f1587b71893ed2ad792cd7dde32」というハッシュ文字列を名乗る匿名の研究者で、同じ研究者がこのパッチサイクルで修正されたCVE-2026-5284(別のDawnのUAF)も報告している。さらにこの研究者は3月23日のChrome更新で修正されたCVE-2026-4675とCVE-2026-4676も発見しており、2026年だけでDawnに複数の脆弱性を発見し続けている。

Googleは「このゼロデイに対するエクスプロイトが実環境に存在することを認識している」と表明した上で、「大多数のユーザーにパッチが行き渡るまでバグの詳細とリンクへのアクセスを制限する」という従来通りの方針をとっている。攻撃に使われた具体的な手口や背後の攻撃グループは非公開だ。

Dawnとは何か

DawnはChromeのWebGPUアーキテクチャの中核にある。

WebGPUはブラウザからGPUを低レベルで制御するためのWeb標準APIだ。GPUベースの機械学習推論(TensorFlow.js等)、リアルタイム3Dレンダリング、データビジュアライゼーション、画像処理などをブラウザ上で実行できるようにする。

Dawnはこの「WebGPUのChromeにおける実装」を担う。アプリケーションがWebGPU APIを呼ぶと、DawnがそれをOSやGPUハードウェアに対応したネイティブグラフィックスAPIに変換する。

プラットフォーム使用するネイティブAPI
WindowsDirect3D 12 (D3D12) / D3D11
macOS / iOSMetal
Linux / AndroidVulkan
フォールバックOpenGL

同一のWebGPUコードがWindowsではD3D12命令に、macOSではMetal命令に変換されて実行される。開発者はプラットフォームごとの差異を意識しなくてよい。

ChromeにおけるDawnのプロセス境界

Chromeはプロセスを分離してサンドボックスを構成している。Dawnはこのアーキテクチャの中で2つに分割して動いている。

graph TD
    A[Webページ<br/>レンダラプロセス] -->|WebGPU API呼び出し| B[Dawn Wire Client<br/>レンダラプロセス内]
    B -->|IPC経由でコマンド送信| C[Dawn Wire Server<br/>GPUプロセス内]
    C -->|ネイティブAPI呼び出し| D[Dawn Native Object<br/>GPUプロセス内]
    D -->|D3D12 / Metal / Vulkan| E[GPU ドライバ / ハードウェア]

レンダラプロセス内の Dawn Wire Client がオブジェクトへの参照カウントを管理し、オブジェクトの生成・破棄のIPC(プロセス間通信)コマンドをGPUプロセスに送る。GPUプロセス側の Dawn Wire Server が実際のネイティブオブジェクトを保持する。

この設計ではGPUドライバへの直接アクセスはGPUプロセスに隔離されているが、レンダラプロセスとGPUプロセスの境界をまたぐIPC通信が複雑な状態管理を生み出す。use-after-freeはこの状態管理の隙間で発生した。

Use-After-Freeの仕組み

use-after-free(UAF)はメモリ管理の欠陥で、いったんfree(解放)したメモリ領域へのポインタ(dangling pointer、宙に浮いたポインタ)が残り続けるときに発生する。

graph TD
    A[オブジェクトをヒープに確保<br/>アドレス 0x1234] --> B[オブジェクトへの参照を<br/>ポインタAに保存]
    B --> C[オブジェクトを解放<br/>free 0x1234]
    C --> D[ポインタAはまだ 0x1234 を指している<br/>dangling pointer]
    D --> E[別の目的でヒープが<br/>0x1234 に割り当てられる]
    E --> F[攻撃者がポインタA経由で<br/>0x1234 にアクセス]
    F --> G[別オブジェクトのメモリを読み書き<br/>型混同 / 任意コード実行]

具体的な悪用手順はおおむね以下の流れになる。

  1. 攻撃者がWebGPUの特定の操作シーケンスを含む細工済みHTMLページを用意する
  2. ブラウザがそのページを開くと、DawnのWebGPUオブジェクト管理コードが実行される
  3. 特定の操作順序により、オブジェクトのメモリが解放された後も内部のdangling pointerが残る
  4. 攻撃者はその後のヒープ操作でdangling pointerが指す領域に意図したデータを配置する(heap grooming、ヒープ領域の配置を意図通りに操作する手法)
  5. dangling pointer経由でそのデータにアクセスされると、型混同(type confusion)が発生し、本来の権限を超えたメモリ読み書きが可能になる
  6. この時点でレンダラプロセス内での任意コード実行が成立する

今回のCVE-2026-5281の技術的な前提条件として「レンダラプロセスへの侵入済み(compromised renderer process)」が挙げられている。CVE単体だとレンダラプロセス内での悪用に限定されるが、実際の攻撃では別のrendering系の脆弱性と組み合わせて使われるケースが多い。

パッチの適用バージョン

今回の緊急アップデートで修正されたバージョンは以下の通り。

OSパッチ適用バージョン
Windows / macOS146.0.7680.177 または 146.0.7680.178
Linux146.0.7680.177

更新は「Chromeメニュー → ヘルプ → Google Chrome について」で確認・適用できる。再起動が必要。ChromiumベースのVivaldiはすでにパッチをリリース済みで、Microsoft EdgeとBraveは対応パッチを準備中。Chromiumのレンダリングエンジンを共有するブラウザは全般的に影響を受けるため、各ブラウザの更新情報を確認する必要がある。

2026年のChromeゼロデイ全体像

今回のパッチで2026年に入ってからの実環境悪用が確認されたChrome緊急ゼロデイは4件になった。

CVEコンポーネント脆弱性タイプCVSSスコアパッチ時期
CVE-2026-2441CSS/Blinkuse-after-free8.82026年2月
CVE-2026-3909Skiaout-of-bounds write8.82026年3月
CVE-2026-3910V8inappropriate implementation8.82026年3月
CVE-2026-5281Dawnuse-after-freeN/A(High)2026年3月31日

Skia(2Dグラフィクス)とV8(JavaScriptエンジン)の3月パッチの解説でも書いたが、CSS、V8、Skia、Mojo、そして今回のDawnと攻撃対象のコンポーネントがブラウザ全体に分散している。Chromiumのコードベースは巨大で、セキュリティレビューが全層に行き届かない構造的な問題がある。

特に注目すべきは今回のDawnが過去に同種の脆弱性を抱えていた点だ。同じ発見者が2026年3月にCVE-2026-4676(DawnのUAF、CVSS 8.8、サンドボックスエスケープにつながるもの)も報告している。一人の研究者が短期間にDawnだけで4件のCVEを発見しているという事実は、このコンポーネントのメモリ管理が根本的に脆いことを裏付けている。

DevTools MCPとの組み合わせリスク

余談になるが、Chrome DevTools MCPの—autoConnect機能のセキュリティ分析で書いた「Chromeのゼロデイとの複合リスク」がここで現実になった形だ。

コーディングエージェントがChrome DevTools MCPを通じて自律的にURLを開く設計では、エージェントが開いたページにこのDawnゼロデイのようなexploitが仕込まれていても、人間はリアルタイムで気づけない。—autoConnectで既存の認証済みセッションを使っている場合、認証情報を含むブラウザが攻撃にさらされる可能性がある。

Chromeのゼロデイはパッチが出た時点でも大多数のユーザーには届いていない。緊急アップデートの適用は手動で「Google Chromeについて」を開いて確認するか、ブラウザを再起動してバックグラウンド更新を完了させる必要がある。