FlawOpen

flawopen.com/Incidents/bluemoon-chrome-v8-windows-alpc-september-2026

● BlueMoon · CVE-2026-85046 · September 2026 · 高
セキュリティ研究 · FlawOpen

BlueMoon:三つの欠陥が Chrome と Windows の隔離境界を越えた

Proofpointは、CVE-2026-85046(V8の型混同)、CVE-2026-87491(V8サンドボックス脱出)、CVE-2026-85880(Windowsカーネルのローカル権限昇格)を連鎖させる標的型BlueMoon攻撃を報告しました。GoogleとMicrosoftは、それぞれの修正前に悪用があったと確認しています。ChromiumブラウザーとWindowsは別々に更新してください。[1], [2], [3], [4]

💡 わかりやすい解説 (ELI5)

仕分け係が箱の中身はすべて本だと確認した後、古いラベルで仕分ける前に来客が中身を入れ替えられると想像してください。最初の失敗で施錠された仕分け場へ入り、次の失敗で柵を越え、さらに別の失敗で建物の入館証を改ざんします。それぞれの鍵を直す必要があります。[1]

主要な概念と専門用語

V8 / type confusion
V8 は JavaScript を実行します。CVE-2026-85046 では fill() が要素の種類を変えたため、Array.prototype.sort の最適化時の前提が崩れました。[1], [2]
V8 sandbox / WebAssembly
V8 サンドボックスはレンダラー内のエンジン管理メモリを隔離します。CVE-2026-87491 は WebAssembly のメタデータ破損で越境しました。レンダラープロセスのサンドボックスとは別です。[1], [3]
ALPC / WNF / privilege
ALPC と WNF は CVE-2026-85880 に関わる Windows カーネル機構です。報告された連鎖はプロセスのデバッグ権限 SeDebugPrivilege を有効にしました。[1], [4]

フレームワーク対応

BlueMoonの攻撃段階とパッチ判断

段階 / CVE / 境界情報源が裏付ける内容防御側の対応
V8 JIT型混同 — CVE-2026-85046Proofpointは、Array.prototype.sortの比較関数がfill()で配列を変更し、要素種別の前提を無効にする問題を説明しています。Googleは実環境での悪用を確認しました。Chrome/Chromium 152.0.7977.82/.83(Windows/Mac)または .82(Linux)以降をインストールし、ブラウザーを再起動してください。Googleの9月3日リリースに修正が含まれます。
V8サンドボックス脱出 — CVE-2026-87491ProofpointはV8メモリーサンドボックスを越えるWebAssemblyメタデータ破損を報告しています。rendererプロセスサンドボックスとは別の境界です。Googleは実環境での悪用を確認しました。Chrome/Chromium 153.0.8010.36/.37(Windows/Mac)または .36(Linux)以降をインストールし、ブラウザーを再起動してください。Googleの9月8日リリースに修正が含まれます。
WindowsカーネルLPE — CVE-2026-85880ProofpointはSeDebugPrivilegeに至るALPC/WNF経路と、キットが標的にした古いWindowsビルドを列挙しています。Microsoftは9月8日の更新前の悪用を確認しました。この標的一覧は影響を受ける全バージョンの一覧ではありません。サポート対象の最新Windowsセキュリティ更新を適用してください。2026年9月8日以降の更新を含め、OS別パッケージをMSRCで確認して必要な再起動を完了します。WindowsとChromeは別々に修正します。

インシデントのタイムライン

2026-08-28

Proofpoint が BlueMoon の活動を初めて観測しました。[1]

2026-09-03

Chrome Stable は Windows と Mac の 152.0.7977.82/.83、Linux の .82 で CVE-2026-85046 を修正しました。[2]

2026-09-08

Chrome Stable は Windows と Mac の 153.0.8010.36/.37、Linux の .36 で CVE-2026-87491 を修正し、Microsoft は九月の更新で CVE-2026-85880 を修正しました。 Microsoftは、CVE-2026-85880が9月8日のWindows更新前に悪用されていたと確認しました。[3], [4], [5]

ステップ・バイ・ステップの攻撃フロー

ステップ 1

観測された配信

Proofpointは、エクスプロイトキットへのリンクを含む標的型スピアフィッシングを観測しました。ブラウザー段階では、脆弱なChromiumベースのブラウザーでリンクを開く必要がありました。[1]

ステップ 2

V8の型混同 — CVE-2026-85046

Proofpointによると、最適化されたArray.prototype.sortの経路で、比較関数がfill()により配列を変更すると型の前提が無効になる可能性がありました。この型混同がrenderer段階の最初の脆弱性で、Googleは実環境での悪用を確認しました。[1], [2]

ステップ 3

V8サンドボックス脱出 — CVE-2026-87491

Proofpointは、WebAssemblyモジュールのメタデータ破損によりV8のメモリーサンドボックスを越える手法を報告しています。これはChromeのrendererプロセスサンドボックスとは別の境界です。Googleも実環境での悪用を確認しました。[1], [3]

ステップ 4

WindowsカーネルLPE — CVE-2026-85880

Proofpointは、特定の古いWindowsビルドでrendererのSeDebugPrivilegeを有効にするALPC/WNFカーネル経路を報告しています。Microsoftも2026年9月8日のセキュリティ更新前の悪用を確認しました。[1], [4]

ステップ 5

rendererプロセスからの脱出

ブラウザー段階と対象となるWindows環境が揃うと、報告されたチェーンはWindowsのLPEを経由してrendererからブラウザー親プロセスに到達し得ます。下のPython例は古い前提の教訓だけを示し、攻撃チェーンではありません。[1], [4]

ソースコード比較:脆弱 vs 堅牢化

これは前提の失効を示す安全な Python の例であり、V8 のコード、攻撃コード、製品の修正ではありません。無害なコールバックで最初の確認後に整数を文字列へ変えられます。改善例は呼び出し後に長さを制限した複製を検証し、使用中に再び呼び出しません。脆弱例で Python は例外を出すだけで、ネイティブのメモリ破損を再現しません。同期して動く信頼可能で上限のあるコールバックを前提とします。

脆弱な実装
def numeric_total(values, callback):
    if type(values) is not list or len(values) > 1024:
        raise ValueError("Invalid batch")
    if any(type(x) is not int for x in values):
        raise ValueError("Expected integers")
    callback(values)
    # コールバックによって型の前提が無効になった可能性があります。
    return sum(values)
堅牢化されたセキュアパッチ
def numeric_total(values, callback):
    if type(values) is not list or len(values) > 1024:
        raise ValueError("Invalid batch")
    callback(values)
    if len(values) > 1024:
        raise ValueError("Invalid batch")
    snapshot = tuple(values)
    if any(type(x) is not int or abs(x) > 1_000_000
           for x in snapshot):
        raise ValueError("Expected bounded integers")
    # 検証済みのスナップショットを使い、コールバックを再度呼び出さないでください。
    return sum(snapshot)

エンジニアリング&システム堅牢化チェックリスト

参考資料