15年前から存在するLinuxカーネルの脆弱性「GhostLock」、攻撃者がroot権限を取得可能に

CVE-2026-43499として新たに採番されたLinuxカーネルの権限昇格の脆弱性が、主要ディストリビューションに15年以上にわたって影響を及ぼしていたことが判明しました。権限を持たないローカルの攻撃者がこの脆弱性を悪用すると、root権限を取得したり、コンテナから脱出したりできる恐れがあります。

この脆弱性はVEGA氏によって発見され、NebuSecの研究者らによって文書化されました。原因は、Linuxカーネルのrtmutex優先度継承コードにおける不適切なクリーンアップ処理にあります。

この不具合はLinux 2.6.39-rc1で混入し、CONFIG_FUTEX_PIが有効になっている環境であれば、7.1-rc1に至るまで悪用可能な状態が続いていました。

Nebula Securityによると、この脆弱性を引き起こすには特別なカーネル設定も、特権も、ユーザー名前空間も必要ないとのことで、幅広いLinux環境に関係する問題だとしています。

GhostLockの核心にあるのは、Requeue-PIフューテックスのパス処理において、カーネルがウェイター(waiter)オブジェクトを扱う際の不整合です。脆弱なコードでは、remove_waiter()current->pi_blocked_onをクリアしますが、これはタスクが自分自身のためにブロックしている場合には正しい処理です。

しかし、プロキシロックのパスでは、実際に動作しているタスクは元のウェイターではなく、リクエスターです。そのため誤ったタスクの状態がクリーンアップされてしまい、本来のウェイターは、すでにスコープ外となったカーネルスタックオブジェクトを指す古いポインタを保持し続けることになります。

この不具合は、攻撃者が3つのフューテックスと3つのスレッドから成る依存関係のサイクルを構築し、-EDEADLKによるロールバックを強制的に発生させることで悪用可能になります。

ロールバック後、スリープ状態にあったタスクはユーザー空間へ復帰しますが、この時点でpi_blocked_onポインタは、カーネルスタック上にあった古いrt_mutex_waiter構造体を指したままの、いわゆるダングリング状態になっています。

続いて、prctl(PR_SET_MM, PR_SET_MM_MAP, ...)を使い、解放済みのそのスタック領域を制御可能なデータで再取得することで、後続のカーネル参照処理を通過できる偽のウェイターオブジェクトを偽造します。これにより、実質的にこのエクスプロイトは、古いスタック参照を制御可能なカーネルオブジェクトへと変換してしまいます。

ここから研究者らは、rtmutexの赤黒木(rb-tree)における削除処理の挙動を利用して、このプリミティブを制約付きのカーネル書き込みへと発展させました。偽造されたオブジェクトによって、慎重に選定したカーネル上のターゲットへのポインタ書き込みが可能になります。公開されたエクスプロイトでは、そのターゲットとしてinet6_protos[IPPROTO_UDP]が使われています。

この関数テーブルのエントリを、CPUエントリエリア(CEA)に用意した攻撃者制御下のデータへリダイレクトすることで、ループバックのIPv6 UDPパケットが処理された際に制御フローの乗っ取りを実現しています。

その後、短いROPチェーンによってcore_patternのsysctlパスの権限を書き換え、最終的にユーザー空間側での操作によってroot権限でのコード実行に至ります。

Nebula Securityによると、このエクスプロイトはローカル権限昇格およびコンテナ脱出の手法として97%という高い安定性を達成し、Google kernelCTFを通じて92,337ドルの報奨金を獲得したとのことです。

研究者らはまた、プリフェッチを利用したサイドチャネル攻撃を用いて、カーネルイメージのスライド値とphysmapのベースアドレスを復元し、検証対象システムにおけるアドレスランダム化という主要な障壁を回避しています。

Linuxは2026年4月にこの問題を修正しました。修正内容は、remove_waiter()内のクリーンアップ処理でcurrentの代わりにwaiter->taskを使用するというものです。ただし研究者らは、最初のパッチが、追加の対応を要する別のヌルポインタ参照のコーナーケースを新たに生んでしまった点も指摘しています。

影響を受けるカーネルを実行している組織は、パッチが適用されたLTSリリースへのアップグレードを優先すべきです。

また防御側は、RANDOMIZE_KSTACK_OFFSETSTATIC_USERMODE_HELPERといった緩和策によって、実証されたエクスプロイトチェーンの一部を複雑化したり阻止したりできる点にも留意すべきですが、完全な対策となるのはパッチ適用のみです。

翻訳元: https://cyberpress.org/15-year-old-ghostlock-linux-kernel-flaw/

ソース: cyberpress.org