
GhostLock:15年間潜伏したLinuxカーネルの深刻な脆弱性#
あなたが今使っているLinuxシステムは、15年以上にわたって深刻な脆弱性を抱えていたかもしれない。 その脆弱性の名は GhostLock(CVE-2026-43499)。 Nebula Securityのセキュリティ研究チーム「VEGA」が発見し、2026年7月に詳細が公開された。
この記事でわかること:
- GhostLockとは何か、どのような脆弱性なのか
- 影響を受けるLinuxのバージョン範囲
- 攻撃者がどのように悪用できるか(技術概要)
- 対処・緩和のために何をすべきか
約8分で読めます。
この記事を読むことで、GhostLockの本質的なリスクと対応策を把握できる。
【結論】押さえるべき重要ポイント4選#
忙しい方のために、まず核心を整理する。
- 15年以上存在した脆弱性 — Linux 2.6.39(2011年)から Linux 7.1 まで全バージョンが対象。
- 特権不要で悪用可能 — 特殊なカーネル設定や権限がなくても、ローカルの非特権ユーザーが攻撃できる。
- 権限昇格とコンテナ脱出が可能 — Googleのkernelバグバウンティ(kernelCTF)でroot権限取得・コンテナエスケープに成功し、97%の安定性が確認された。
- 対処はカーネルの最新LTSへのアップグレード — パッチは 2026年4月にLinux 7.1-rc1 以前向けに提供済み。
各ポイントの詳細は以下のセクションで掘り下げる。
GhostLockとは?基本概念の解説#
GhostLock は、Linuxカーネルのロック機構(rtmutex)に存在する スタックUAF(Use-After-Free) 脆弱性だ。
UAF(Use-After-Free) とは、一度解放されたメモリ領域を誤って再参照してしまうバグの総称。攻撃者がその領域に偽データを置くことで、カーネルの動作を乗っ取れる可能性がある。
「スタックUAF」という点がこの脆弱性の特徴だ。 メモリはカーネルのスタック領域に存在する。 スタックはシステムコールが終了した瞬間に「解放」されるため、攻撃ウィンドウの管理が通常のヒープUAFとは異なる。
Nebula Securityの公開情報によると、脆弱性の正式名称は CVE-2026-43499 であり、研究チームは「GhostLock」と命名している。
GhostLockの技術的な根本原因#
このセクションでは、バグがなぜ発生したかを技術的に解説する。
問題の発端:remove_waiter() の誤用#
GhostLockは、Linux 2.6.39 で導入された rtmutex(リアルタイムミューテックス)の改修(コミット 8161239a8bcc)に起因する。
Linuxカーネルには remove_waiter() というヘルパー関数が存在する。
この関数はもともと、「あるスレッドが自分自身のロック待ち状態を解除する」という1つのシナリオのみを想定して書かれていた。
そのため remove_waiter() は、「現在実行中のスレッド(current)がウェイター本人である」 という前提で current->pi_blocked_on をクリアする。
しかし Requeue-PI と呼ばれる操作がこの前提を壊す。
FUTEX_CMP_REQUEUE_PI を使うと、ある別のスレッド(ウェイター)のロック待ち状態を、第三者(リキュアラー)が代理で操作できる。
この代理経路では、current はリキュアラーであり、ウェイター本人ではない。
デッドロック(-EDEADLK)が検出されてロールバックが走ると、remove_waiter() は リキュアラー(current)の pi_blocked_on を誤ってクリア してしまう。
一方、本来クリアされるべきウェイターの pi_blocked_on は スタック上のウェイターオブジェクトを指し続けたまま残る。
そのウェイタースレッドがユーザー空間に戻ると、スタックフレームはポップされて「解放」されるが、ポインタは残る。
これが ダングリングポインタ(dangling pointer)、すなわちスタックUAFの本質だ。
この問題はlockdepでも検出できなかった。lockdepは「
pi_lockが保持されているか」しかチェックせず、「誰のpi_lockか」までは検証しないためだ。
修正内容#
2026年4月のパッチ(コミット 3bfdc63936dd、“rtmutex: Use waiter::task instead of current in remove_waiter()")で、waiter->task->pi_lock をロックし、waiter->task->pi_blocked_on をクリアするよう修正された。
影響範囲:どのLinuxが対象か#
| 項目 | 内容 |
|---|---|
| 影響バージョン | Linux v2.6.39-rc1 〜 v7.1-rc1 |
| 導入時期 | 2011年(約15年前) |
| 修正バージョン | Linux 7.1 以降 |
| 必要な設定 | CONFIG_FUTEX_PI=y(デフォルト有効の場合が多い) |
| 必要な権限 | 不要(ローカル非特権ユーザーで攻撃可能) |
| 影響範囲 | パッチ未適用の 全Linuxディストリビューション |
Nebula Securityはパッチ未適用のすべてのLinuxディストリビューションが影響を受けると明記している。
攻撃者はどのように悪用できるか#
攻撃手法の技術概要を整理する。
悪用の前提条件#
- 攻撃者はローカルの非特権ユーザーであれば足りる。
- 特別なカーネル設定やユーザー名前空間(user namespace)は不要。
- CPUコアは1つでも悪用可能(Nebula Securityが明記)。
デッドロックを引き起こす手順#
Nebula Securityが公開した情報によると、攻撃には 3つのfutexワード と 3つのスレッド を組み合わせたPI依存サイクルが必要だ。
- ウェイタースレッド が
f_pi_chain(PIフューテックス)を取得し、FUTEX_WAIT_REQUEUE_PIでブロックする。 - オーナースレッド が
f_pi_targetを取得し、f_pi_chainでブロックする。 - メインスレッド が
FUTEX_CMP_REQUEUE_PIを呼び出す。
これにより、waiter → f_pi_target → owner → f_pi_chain → waiter という循環依存が形成される。
カーネルは -EDEADLK を返してロールバックし、バグのある remove_waiter() が実行される。
悪用で得られるプリミティブ#
研究チームは、ダングリングポインタを利用して以下の2つの主要な攻撃プリミティブを得られることを示した。
- 任意(ただし制約あり)アドレスへのポインタ書き込み
- 任意(ただし制約あり)アドレスへの8バイトゼロ書き込み
これらを組み合わせることで、最終的に root権限の取得 および コンテナエスケープ が実証された。
GoogleのkernelCTFプログラムにおいて、この脆弱性の悪用は 97%の安定性 で動作することが確認され、$92,337の報奨金 が支払われた。
対処方法と緩和策#
このセクションでは、実際に何をすべきかを整理する。
推奨対処:最新LTSへのアップグレード#
Nebula Securityは、パッチ未適用のすべてのディストリビューションに対し、最新のLTS(Long Term Support)バージョンへのアップグレードを推奨している。
パッチはコミット 3bfdc63936dd として提供されており、Linux 7.1 以降に含まれる。
緩和オプション(補助的措置)#
Nebula Securityの記事では、以下のカーネル設定が緩和策として言及されている。
RANDOMIZE_KSTACK_OFFSET— カーネルスタックオフセットのランダム化STATIC_USERMODE_HELPER— ユーザーモードヘルパーの静的化
これらの設定が具体的にどの程度の緩和効果をもたらすかの詳細は元記事を参照のこと。
まとめ:GhostLockが示すLinuxセキュリティへの示唆#
GhostLock(CVE-2026-43499)は、以下の点で際立った脆弱性だ。
- 15年以上 にわたってすべてのLinuxディストリビューションに潜伏していた。
- 特権不要・特別設定不要で、ローカル非特権ユーザーが悪用可能。
- 97%の安定性で root権限取得とコンテナエスケープ が実証された。
- lockdepのような既存の検証ツールでも検出できなかった。
対処の第一歩は Linuxカーネルの最新LTSバージョンへのアップグレードだ。
技術的な詳細(エクスプロイトの各ステップ、ASLR回避手法、ROPチェーンなど)については、Nebula Securityの元記事(https://nebusec.ai/research/ionstack-part-2/)を参照してほしい。
出典:Nebula Security「IonStack part II: GhostLock, a stack-UAF that has existed in ALL Linux distributions for 15 years」(2026年7月7日公開)




