Linuxカーネルで2011年から存在していた脆弱性が明らかになった。特別な権限を必要とせず、一般ユーザー権限から権限昇格やコンテナ脱出につながる可能性があるという。GoogleのkernelCTFでも高く評価された攻撃は、どのような仕組みで成立するのか。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Nebula Securityは2026年7月7日(現地時間)、「Linuxカーネル」の脆弱(ぜいじゃく)性「GhostLock」(CVE-2026-43499)に関する技術解説を公開した。
発見者はVEGAで同社によると、この脆弱性は2011年以降、多くの主要Linuxディストリビューションに影響してきたという。一般ユーザー権限だけで攻撃を開始でき、特別なカーネル設定を必要としない点が特徴だ。Nebula Securityは、この脆弱性を悪用して97%の成功率で権限昇格およびコンテナ脱出を実現する実証コードを開発し、Googleの「kernelCTF」から9万2337ドルの報奨金を受け取った。
GhostLockは、非特権のローカル攻撃者がカーネルスタックにダングリングポインタを作り出し、限定的ながら任意のアドレスに書き込みを実行できるようにする脆弱性だ。これを足掛かりとして関数テーブルを書き換え、最終的にカーネルの制御フローを奪取できる。
この脆弱性はLinuxカーネル2.6.39で導入され、Linuxカーネル7.1で修正された。影響を受けるのはv2.6.39-rc1からv7.1-rc1までのカーネルで、必要条件はCONFIG_FUTEX_PI=yが有効になっていることのみだ。ユーザー名前空間や特別なケイパビリティは不要で、影響を受ける環境では、ディストリビューションが提供する修正版カーネルへの更新が推奨される。
原因は、Linuxカーネルのリアルタイムミューテックス(rtmutex)の待機処理における後片付けの不整合にある。
rtmutexで利用されるremove_waiter()は、本来、待機しているスレッド自身が後片付けを実施することを前提として設計されている。このため、current->pi_blocked_onをクリアする処理は通常の低速パスでは正しく動作する。
一方、Requeue-PIでは事情が異なる。rt_mutex_start_proxy_lock()は別スレッドのためにrt_mutex_waiterを登録するが、エラー時には巻き戻し処理が必要になる。この経路ではcurrentは実際の待機スレッドではなく、FUTEX_CMP_REQUEUE_PIを発行したスレッドを指している。
問題は、__rt_mutex_start_proxy_lock()が-EDEADLKを返した場合の巻き戻し処理で発生する。remove_waiter()はwaiterではなくcurrentのpi_blocked_onだけをNULLに戻すため、本来クリアされるべき待機スレッド側には古いrt_mutex_waiterへのポインタが残ってしまう。
waiterオブジェクトはFUTEX_WAIT_REQUEUE_PIで待機しているスレッドのカーネルスタックに存在するため、待機スレッドがユーザー空間に復帰すると、そのスタック領域は解放済みとなる。それにもかかわらず、後続のPIチェーン探索では解放済みメモリへのポインタを参照し続けるため、ダングリングポインタが発生する。
攻撃では3つのfutexと3つのスレッドを利用してPI依存関係の循環を意図的に作り出す。待機スレッドはPI futexであるf_pi_chainを取得した後、通常のfutexであるf_waitからf_pi_targetに再キューされる。所有者スレッドはf_pi_targetを保持した状態でf_pi_chainの解放を待機し、メインスレッドがFUTEX_CMP_REQUEUE_PIを実行すると循環依存が成立する。この結果、PIチェーン探索は-EDEADLKを返し、問題のある巻き戻し処理が実行される。
その後、待機スレッドは解放済みのrt_mutex_waiterを指したままユーザー空間に戻る。攻撃者はsched_setattr()などを利用してPIチェーン探索を任意のタイミングで再実行させることで、このダングリングポインタを悪用できる。
Nebula Securityは、解放済みとなったカーネルスタック領域を再利用するため、待機スレッド自身にprctl(PR_SET_MM, PR_SET_MM_MAP, ...)を実行させる手法を採用した。prctl_set_mm_map()ではユーザーが指定したauxvが固定サイズのスタックバッファーにコピーされるため、その内容を利用して偽のrt_mutex_waiterを配置できる。
この偽オブジェクトによってrtmutexのrb-tree削除処理を悪用し、限定的な任意アドレス書き込み能力を獲得する。Nebula Securityは、この条件を満たす対象としてinet6_protos[IPPROTO_UDP]を選択した。
さらに、prefetch命令のタイミング差を利用してKASLRベースやphysmapベースを漏えいさせた後、CPU Entry Area(CEA)のdirect-mapエイリアス上に偽のオブジェクトやROPスタックを配置する。inet6_protos[IPPROTO_UDP]を書き換えた状態でIPv6 UDPパケットを送信すると、カーネルは攻撃者が用意した偽のhandlerを実行し、制御フローが奪われる。
最終的には「DirtyMode」と呼ばれる手法を利用してcore_pattern sysctlのアクセス権限を書き換える。これにより、通常は管理者しか変更できない/proc/sys/kernel/core_patternを非特権ユーザーでも編集可能となり、クラッシュ時に任意のプログラムをroot権限で実行させることで権限昇格を実現する。
Nebula Securityは2026年4月18日にsecurity@kernel.orgに脆弱性を報告し、パッチ案を提出した。その後、同年4月20日に別パッチで修正が取り込まれ、同年5月4日には修正版が各ブランチへバックポートされた。Googleは同年6月30日にkernelCTFへの投稿を承認し、Nebula Securityは同年7月7日に技術解説を公開した。
影響を受ける環境では、各Linuxディストリビューションが提供する修正版カーネルへの更新を速やかに適用することが望まれる。
悪用成功率99%、Linuxカーネルに新ゼロデイ「Bad Epoll」が見つかる
KDDIメール漏えいの全容判明 ゼロデイ悪用で761万人分パスワードが流出
「ランサムウェア」侵入手順を徹底解説 もう知ったかぶりからは卒業しよう
KDDIの最大1422万件の情報漏えい事件 その裏には陸自USB問題と同様に中国の影?
パスキー神話崩壊 Google Password Managerの同期機能を狙う新攻撃手法Copyright © ITmedia, Inc. All Rights Reserved.
編集部からのお知らせ