
CVE-2026-31431 "Copy Fail" および CVE-2026-43284 "Dirty Frag" 向けの安全な検出ツール — Linux カーネルの algif_aead モジュールにおけるローカル権限昇格で、2017年以降、主要な全ディストリビューションに影響します。
関連するLinuxカーネルのローカル権限昇格(LPE)脆弱性ファミリー — Copy Fail(CVE-2026-31431)と Dirty Frag(CVE-2026-43284 / CVE-2026-43500)— に対する安全な検出ツールです。いずれも2017年以降、主要なすべてのディストリビューションに影響し、権限のないローカルユーザーであれば誰でも悪用可能で、かつ個別の緩和策が必要です。
これらのプローブはソケットを開かず、暗号化操作やネットワーク操作も行いません。 検出はカーネルバージョン、ディストリビューションのパッケージメタデータ、モジュールの状態、有効な緩和フラグのみに基づいています — すべて
sudoなしでワールドリーダブルです。
Copy Failの緩和策を適用してもDirty Fragは防御されません。 両方のプローブを実行し、両方の緩和策をそれぞれ個別に適用する必要があります。
.
├── cve-2026-31431-check.sh Copy Fail probe (all output modes)
├── copy_fail_userparameter.conf Zabbix agent UserParameter — Copy Fail
├── zabbix_template_copy_fail.yaml Zabbix 6.4 template — Copy Fail
├── copy_fail_auditd.rules auditd behavioral detection — Copy Fail
├── cve-2026-43284-check.sh Dirty Frag probe (all output modes)
├── dirty_frag_userparameter.conf Zabbix agent UserParameter — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Wazuh SCA compliance policy
└── ansible/
└── copy_fall_scan.yml Fleet-wide Ansible scan playbook
このエクスプロイトには、以下の正確なsyscallチェーンが必要です:
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authesn(hmac(sha256),cbc(aes))"})
accept(fd, ...)
splice(suid_binary_fd, op_fd) ← page cache fed into crypto subsystem
sendmsg / recvmsg ← 4-byte scratch write lands in page cache
プローブはこれらに一切触れません。検出の基準は次のとおりです:
.ko(自動ロード可能)modprobe.dブラックリストとinitcall_blacklistコマンドラインフラグchmod +x cve-2026-31431-check.sh
./cve-2026-31431-check.sh # human-readable
./cve-2026-31431-check.sh --json # machine-readable
./cve-2026-31431-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-31431-check.sh --zabbix # integer 0/1/2 for Zabbix item
終了コード: 0 = PATCHED(修正済み)またはMITIGATED(緩和済み) · 1 = VULNERABLE(脆弱) · 2 = UNKNOWN(不明)
スクリプトはこれらの閾値と自動的に比較し、実行中のパッケージが閾値以上の場合、判定をPATCHEDに設定します。
RHEL、AlmaLinux、Rocky Linuxおよびその派生ディストリビューションでは、algif_aeadはカーネルにコンパイル済みです。modprobe.dによる回避策は効果がありません。 カーネルコマンドラインのinitcall_blacklist=algif_aead_initのみが有効です。プローブはこの状態を検出し、明示的に警告します。
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Fragは、Hyunwoo Kim(@v4bel)氏によって発見された2つのインプレース復号化ファストパスバグを連鎖させるものです。Copy Failの1週間後、2026年5月7日頃に公開されました:
esp4、esp6);上流修正 f4c50a4034e6rxrpc);上流修正 aa54b1d27fe0このエクスプロイトは、/usr/bin/suのページキャッシュからパイプページをページ化されたソケットバッファフラグメントとしてアタッチし、攻撃者が選択したキーでインプレース復号化を実行します — ディスク上のファイルに触れることなく、setuidバイナリのキャッシュされたコピーに任意のバイトを直接書き込みます。
Copy Failの緩和策(algif_aeadブラックリスト)ではDirty Fragを防げません。
chmod +x cve-2026-43284-check.sh
./cve-2026-43284-check.sh # human-readable
./cve-2026-43284-check.sh --json # machine-readable
./cve-2026-43284-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-43284-check.sh --zabbix # integer 0/1/2 for Zabbix item
プローブはesp4、esp6、rxrpcを個別にチェックし、JSON出力ではcve_43284_safe / cve_43500_safeの別々のブール値を報告します。
esp4とesp6は、IPsec(strongSwan、Libreswan)で使用されるカーネル側のESP変換です。これらをブラックリストに登録するとIPsecトンネルが機能しなくなります。プローブはip xfrm stateとデーモン検出によってIPsecのアクティブな使用状況を検出し、それに応じて修復アドバイスを調整します:
modprobe.dブラックリストを適用します。rxrpcも個別にブラックリスト化):
# RHEL-family
sysctl -w user.max_user_namespaces=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
# Ubuntu / Debian
sysctl -w kernel.unprivileged_userns_clone=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
| ディストリビューション | CVE-2026-43284 | CVE-2026-43500(rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/A — RHEL 8ではrxrpcは提供されていません |
| RHEL / Rocky / Alma 9.x | 未定 | 未定 |
修正済みカーネルを待つシステムでは、IPsecの注意事項を考慮した上で、modprobe.dブラックリストを直ちに適用してください。
AlmaLinux / RHEL 8はrxrpcモジュールを一切ビルドしません。プローブはRHEL/Rocky/Alma 8.xでkernel_vuln_rxrpc=not_affectedを自動的にマークします。
両方のプローブを監視対象の各ホストにデプロイします:
mkdir -p /etc/zabbix/scripts
install -m 750 -o zabbix -g zabbix cve-2026-31431-check.sh /etc/zabbix/scripts/
install -m 750 -o zabbix -g zabbix cve-2026-43284-check.sh /etc/zabbix/scripts/
cp copy_fail_userparameter.conf /etc/zabbix/zabbix_agentd.d/
cp dirty_frag_userparameter.conf /etc/zabbix/zabbix_agentd.d/
systemctl restart zabbix-agent # or zabbix-agent2
zabbix_template_copy_fail.yamlは設定 → テンプレート → インポートからインポートします。
提供されるUserParameterアイテム:
Copy Failテンプレートには、status=1に対するHIGHトリガーと、status=2に対するWARNINGトリガーが含まれます。sudoは不要です — 両スクリプトが読み取るすべてのファイルはワールドリーダブルです。
install -m 755 cve-2026-31431-check.sh /usr/lib/nagios/plugins/
install -m 755 cve-2026-43284-check.sh /usr/lib/nagios/plugins/
# NRPE — add to /etc/nagios/nrpe.cfg:
command[check_copy_fail]=/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios
command[check_dirty_frag]=/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios
# CheckMK local checks:
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios); RC=$?
echo "$RC CVE-2026-31431 - $OUT"' > /usr/lib/check_mk_agent/local/copy_fail
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios); RC=$?
echo "$RC CVE-2026-43284 - $OUT"' > /usr/lib/check_mk_agent/local/dirty_frag
chmod +x /usr/lib/check_mk_agent/local/copy_fail \
/usr/lib/check_mk_agent/local/dirty_frag
進行中のアクティブなエクスプロイト試行を検出し、2つの静的プローブを補完します。
cp copy_fail_auditd.rules /etc/audit/rules.d/
augenrules --load
# Watch for unexpected AF_ALG callers:
ausearch -k copy_fail_af_alg --interpret | \
grep -v -E 'cryptsetup|veritysetup|systemd-crypt|kcapi'
Wazuhルールのスタブ(レベル13 / 15)は.rulesファイルのコメントに埋め込まれています。
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
結果: セキュリティ → SCA → ポリシーcve_2026_31431_copy_failでフィルタ
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml
# Limit to a subset:
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml --limit webservers
コントローラー上の/tmp/copy_fail_results/にホストごとのJSONとsummary.txtを書き込みます。いずれかのホストがVULNERABLE(脆弱)の場合、プレイは非ゼロの終了コードで終了します。
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| 対象モジュール | algif_aead | esp4, esp6, rxrpc |
| 導入時期 | 2017年8月(カーネル4.14) | 2017年1月 / 2023年6月 |
| 緩和策 | algif_aead向けのmodprobe.dブラックリスト | esp4/esp6/rxrpc向けのmodprobe.dブラックリスト |
| プローブスクリプト | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| ディストリビューション | 修正バージョン | 勧告 |
|---|
| RHEL / Rocky / Alma 8.10 | kernel-4.18.0-553.123.1.el8_10 | Rocky 2026-05-11 |
| RHEL / Rocky / Alma 9.7 | kernel-5.14.0-611.54.1.el9_7 | 同上 |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | 同上 |
| Debian 11 (bullseye) | linux 5.10.251-3 | DLA-4560-1 |
| Debian 12 (bookworm) | linux 6.1.170-1 | DSA-6243-1 |
| Debian 13 (trixie) | linux 6.12.85-1 | DSA-6238-1 |
| Ubuntu 22.04 / 24.04 | 修正済みカーネルはまだなし — USN-8226-1によるkmod緩和策 | USN-8226-1 |
| SLES 12 SP5 | kernel-default 4.12.14-122.299.1 | SUSE-SU-2026:1669-1 |
| SLES 15 SP5 | kernel-default 5.14.21-150500.55.144.1 | SUSE-SU-2026:1670-1 |
| SLES 15 SP6 | kernel-default 6.4.0-150600.23.92.1 | SUSE-SU-2026:1671-1 |
| SLES 15 SP7 | kernel-default 6.4.0-150700.53.40.1 | SUSE-SU-2026:1669-1 |
| SLES 16.0 | kernel-default 6.12.0-160000.29.1 | SUSE勧告 |
| Debian / Ubuntu / SLES | 未定 | 未定 |
| キー | タイプ | 意味 |
|---|
copy_fail.status | int | 0=安全 · 1=脆弱 · 2=不明 |
copy_fail.detail | str | Copy Failの判定(人間が読める形式) |
dirty_frag.status | int | 0=安全 · 1=脆弱 · 2=不明 |
dirty_frag.detail | str | Dirty Fragの判定(人間が読める形式) |
| ディストリビューション | Copy Fail | Dirty Frag |
|---|