
copyfail(CVE-2026-31431)のBash実装
レースなし。オフセットなし。盲目的に信頼するプレビルドバイナリもなし。
CVE-2026-31431(Copy Fail)の bash 実装です。このスクリプトは、実行時にインラインで最小限の C ヘルパーをコンパイルします。bash 層はアーキテクチャ検出、ペイロード展開、ターゲット選択を担当し、C 層は bash 単体では到達できない実際のカーネル操作(AF_ALG ソケット、splice、sendmsg)を実行します。
完全な技術解説は copy.fail を参照してください。
バグはカーネルの AF_ALG AEAD ソケットインターフェースである algif_aead にあります。2017 年に導入されたインプレース最適化により、ページキャッシュのページが authencesn 復号操作の書き込み可能な宛先 scatterlist に紛れ込む可能性があります。splice() 経由で適切な入力を与えると、所有していない setuid バイナリを含む、読み取り可能な任意のファイルのページキャッシュへの決定論的な 4 バイト書き込みが発生します。
/usr/bin/su にシェルコードを 4 バイトずつ上書きし、実行すると root シェルが得られます。レースウィンドウなし、カーネル固有シンボルなし、リトライなし。
chmod +x copyfail.sh
# 何かを行う前にシステムが脆弱かどうかを確認
./copyfail.sh -c
# エクスプロイトを実行(root 以外である必要があります)
./copyfail.sh
# 別の setuid ターゲットを指定
./copyfail.sh -t /usr/bin/passwd
# システム上のすべての setuid-root 候補を一覧表示
./copyfail.sh -s
このエクスプロイトはページキャッシュのみをメモリ上で上書きするため、ディスク上のファイルは無傷です。再起動すればすべて元に戻ります。すぐにクリーンアップしたい場合:
# root シェル内で
/usr/bin/su --version # ページキャッシュが追い出されていればディスクから正常に動作
# または単に再起動
-t で su 以外を指定した場合も同じです。ページキャッシュのみで、ディスクはクリーンです。
gccpython3(ワンライナー、追加パッケージ不要)algif_aead、authencesn、hmac、cbcアルゴリズムが利用できない場合:
sudo modprobe algif_aead authencesn hmac cbc
一部のディストリビューションでは、一時的な回避策として /etc/modprobe.d/ にブロック設定が含まれています。存在する場合は削除してください:
sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
下限: torvalds/linux 72548b093ee3 2017年8月、v4.14
(AF_ALG iov_iter 再設計により、
splice 経由のファイルページ書き込みプリミティブが
AEAD scatterlist に導入された)
上限: torvalds/linux a664bf3d603d 2026年4月、mainline
(2017年のインプレース最適化を revert。
ソースと宛先の scatterlist が分離され、
ページキャッシュのページが書き込み可能な
暗号出力にならないようになった)
これら 2 つのコミットの間: 修正をバックポートしなかった major ディストリビューションすべて。Ubuntu、RHEL、SUSE、Amazon Linux、Debian はすべて開示時に脆弱であることが確認されました。ディストリビューションのバックポートは 2026-04-29 頃から始まりました。特定のカーネルを確認するには、changelog で a664bf3d603d(またはそのディストリビューションのバックポート)を探してください。
| Arch | Status |
|---|---|
| x86_64 | ✓ |
| aarch64 | ✓ |
| i386 / i686 | ✓ |
| armv7l | ✓ |
恒久対策: カーネルを更新してください。
回避策(AF_ALG ソケットをブロックします。カーネル暗号 API を直接使用する IPsec/XFRM には影響しません):
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null
コンテナ: AF_ALG ソケット作成をブロックする seccomp プロファイルを追加し、Pod のセキュリティコンテキストで allowPrivilegeEscalation: false を設定してください。これにより no_new_privs が有効になり、カーネルが execve() で setuid ビットを尊重しなくなります。
bash バージョンは依存関係の点で劣りますが、実行前に最初から最後まで読める単一のスクリプトです。C ヘルパーは heredoc から実行時に生成・コンパイルされるため、別途監査するバイナリブロブはありません。
許可されたセキュリティテストおよび研究専用です。所有していないシステム、または明示的な書面によるテスト許可がないシステムでは実行しないでください。
| Python | Go | Bash |
|---|
| 依存関係 | python3 | なし(静的バイナリ) | gcc + python3 |
| プレビルドバイナリ | なし | あり | なし |
| 単一ファイル | あり | なし | あり |
| コンパイルステップ | なし | なし | あり(インライン、自動) |