
Pythonによるcopyfail(CVE-2026-31431)の実装
badsectorlabs/copyfail-go(CVE-2026-31431)のPython移植版です。Linuxのみ対応。Python 3.10+(os.splice)が必要です。
このツールは、/etc/passwdのページキャッシュを利用する手法は使用しません。
suバイナリのページキャッシュを、埋め込まれたシェルコード(Go版main.goと同じペイロード)で上書きし、その後**suを実行**します。suのキャッシュイメージをsetuid rootプログラムとして実行することで得られます。/etc/passwd経由でgetpwnam()にUIDが0だと認識させる手法ではありません。同じCVEに対する他の公開Python PoCは、ページキャッシュ内の**/etc/passwdを書き換え、その後su <user>を実行するよう指示する場合があります。これは、このスクリプトとは対象ファイルも後続処理も異なります**。
認可されたテストのみを対象としています。自分が所有するホスト、または明示的に評価を許可されたホストでのみ使用してください。
chmod +x copyfail_su.py
# 対話型スタイルのフロー(--execなしのcopyfail-goと同じ考え方)
./copyfail_su.py --backup /tmp/su.bak
# 別のプログラムを昇格して実行(パスをargvとしてsuに渡し、exec-argv1ペイロードを使用)
./copyfail_su.py --backup /tmp/su.bak --exec /full/path/to/binary
実行が成功したら、実際のsuを復元してください。
--backupなしでの復旧このPoCは、/usr/bin/suのページキャッシュを破損させます。検証または再インストールを行うまで、ディスク上のファイルがまだ信頼できると想定しないでください。
/usr/bin/suを所有するパッケージを再インストールします(最初に特定し、その後再インストール):
rpm -qf /usr/bin/su を実行し、次に sudo dnf reinstall shadow-utils を実行します(報告されたパッケージ名を使用)。dpkg -S /usr/bin/su を実行し、次に sudo apt install --reinstall <パッケージ> を実行します。検証: /usr/bin/suに予期しない変更がないか sudo rpm -V <パッケージ> を実行するか、Debian系システムではdebsumsを実行します。
任意: 古いキャッシュの想定を避けるため、再インストール後に再起動します。
rootとして再インストールできない場合: リカバリブート、Live USB、または同じディストリビューション/バージョン/アーキテクチャの既知の正常なイメージから/usr/bin/suを置き換えます。所有権が**root:root、モードが4755**(-rwsr-xr-x)であることを確認してください。