
CVE-2026-46331(別名 pedit COW)向けの読み取り専用監査スクリプト — Linux カーネルの net/sched にある act_pedit アクションにおける部分的なコピーオンライトのバグで、ローカルの非特権ユーザーがページキャッシュのメモリを破壊し、root 権限へ昇格できる脆弱性です。
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() はキーループの前に skb_ensure_writable() の COW 範囲を tcfp_off_max_hint を使って一度だけ計算します。型付きキーはヒントがカバーしないランタイムヘッダーオフセットを追加するため、最終的な書き込みの一部が COW された領域の外側に着地します。結果として、共有ページキャッシュページが書き換えられ、キャッシュされた setuid バイナリ(古典的な標的: /bin/su)がメモリ上で汚染される可能性があります。ディスク上のハッシュはクリーンのままです。ファイル整合性モニターはこれを検知できません。
Dirty COW (CVE-2016-5195)、Dirty Pipe (CVE-2022-0847)、Copy Fail (CVE-2026-31431)、Dirty Frag (CVE-2026-46300) と同じバグファミリーです。エントリポイントは異なりますが、ページ所有権の失敗は同じです。
| CVE | CVE-2026-46331 |
| コンポーネント | Linux カーネル net/sched / act_pedit |
| クラス | 部分 COW → ページキャッシュ破壊 → LPE |
| 攻撃ベクトル | ローカル (CAP_NET_ADMIN、通常は非特権 userns 経由で取得) |
| 上流の影響範囲 | 5.18 .. 7.1-rc6 |
| 上流の修正 | 7.1-rc7 |
| 公開 PoC | packet_edit_meme (RHEL 10、Debian 13、Ubuntu 24.04.4 で検証済み) |
| Red Hat 深刻度 | Important |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
厳密に読み取り専用のトリアージです。モジュールをロードすることはなく、sysctl に触れることもなく、PoC を実行することもありません。本番環境で安全に実行できるよう設計されています。
act_pedit の到達可能性を調査します:
lsmod)modinfo)/boot/config-$(uname -r)、/proc/config.gz、modules.builtin)modprobe.d 内の install ... /bin/true オーバーライドによってブロックされているか、または net-act-pedit エイリアス経由で act_pedit を自動ロードするカーネル (6.9+) における blacklist によってブロックされているか (古いカーネルは名前で要求するため、blacklist では止められません)tc action pedit ルールを一覧表示します (情報提供のみ、変更なし)。user.max_user_namespaces、kernel.unprivileged_userns_clone、user.max_net_namespaces、および Ubuntu AppArmor の userns 制限。/etc/os-release に基づくベンダーパッチマトリックスのヒューリスティック (RHEL 8/9/10、Debian 11/12/13/14、Ubuntu 18.04→26.04、SUSE、Amazon Linux、Arch 系ローリング)。auditd と journalctl によるオプションの行動的 IoC ハント (--since と --until で設定可能なウィンドウ)。PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN。sudo ./cve-2026-46331-audit.sh # full text report
sudo ./cve-2026-46331-audit.sh --json # machine-readable JSON, no banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # one-line verdict for mass scans
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # widen IoC hunt window
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 --until 2026-09-01 # bounded IoC window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
./cve-2026-46331-audit.sh --version # print script version and exit
| コード | 意味 |
|---|---|
| 0 | PATCHED または NOT_APPLICABLE(カーネルがバグより前のもの) |
| 1 | MITIGATED(緩和策が有効、カーネルは依然として脆弱、それでもパッチを適用) |
| 2 | VULNERABLE(必要な前提条件のうち1つ以上が満たされている、修正済みカーネルなし) |
| 3 | UNKNOWN(共有環境 / CI / Kubernetes コンテキストでは疑わしいものとして扱う) |
| 4 | ERROR(スクリプトを実行できなかった、ツールの欠如または不正な環境) |
完全な実行結果については examples/sample-output.txt を、JSON 形式については examples/sample-output.json を参照してください。
スコアは以下を重み付けして組み合わせたものです:
| シグナル | 重み |
|---|---|
ベンダーの判定 VULNERABLE | +50 |
ベンダーの判定 UNKNOWN | +30 |
act_pedit がカーネルに組み込み済み | +25 |
act_pedit がロード可能、オーバーライドなし | +20 |
act_pedit がロード可能、オーバーライドまたはブラックリストが有効 | +5 |
act_pedit が現在ロード済み | +5 |
| 非特権の userns+netns に到達可能、AppArmor ゲートなし | +15 |
| 非特権の userns+netns に到達可能、AppArmor ゲート有効 | +8 |
| ハントウィンドウ内で IoC を検出 | +10 |
上限は 100 です。約 70 を超える場合はマルチテナント / CI / Kubernetes ノードにおいて緊急対応として扱うべきです。約 20 未満は通常、ホストが問題ないことの確認となります。
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
次に、jq で集約します:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: audit CVE-2026-46331
ansible.builtin.script: cve-2026-46331-audit.sh --quiet --no-hunt
register: audit
failed_when: audit.rc == 2
changed_when: false
優先順位の高い順に記載します。スクリプトは検出結果に基づいて適切なものを推奨します。
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
# 1a) Hard block via modprobe install override (strongest).
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
# 1b) `blacklist act_pedit` only stops the autoload on kernels 6.9+, which
# request the "net-act-pedit" alias. Older kernels load it by name and
# ignore the blacklist, so prefer 1a. Check your kernel:
modinfo -F alias act_pedit | grep -qx net-act-pedit && echo "blacklist works here"
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Option 2: restrict unprivileged user namespaces.
# Will break rootless Podman/Docker, browser sandboxes, Flatpak, unprivileged unshare, some CI sandboxes.
sudo sysctl -w user.max_user_namespaces=0 # EL-family
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
# Option 2b: restrict network namespaces (breaks the CAP_NET_ADMIN acquisition path).
# Less disruptive than disabling all user namespaces, but still breaks some container tooling.
sudo sysctl -w user.max_net_namespaces=0
本当の修正はベンダーのカーネル更新と再起動です。再起動後に uname -r を確認することが、それを証明する唯一の方法です。
これは同じアーキテクチャ上の失敗の5回目の反復です。いずれも直接的な原因は修正されましたが、根本原因は修正されていません。すなわち、所有権の境界を越えてページを共有するゼロコピーのファストパスであり、そこではすべての書き手がバイトを変更する前にプライバシーを証明しなければならず、それが数百の呼び出し箇所に存在します。
| CVE | 年 | サブシステム | プリミティブ |
|---|---|---|---|
| CVE-2016-5195 | 2016 | mm | 読み取り専用マッピングにおける COW 競合 |
| CVE-2022-0847 | 2022 | pipe / splice | pipe_buffer フラグのページキャッシュへの漏洩 |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | 読み取り専用ファイルキャッシュ上でのインプレース暗号処理 |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | skbuff 共有フラグメントマーカーの喪失 |
| CVE-2026-46331 | 2026 | net/sched act_pedit | 遅延解決された型付きキーオフセットによる部分的な COW |
カーネル内 Rust は、所有権型によってまさにこの種のクラスに対処します。明日 net/sched に登場することはないでしょう。
MIT。LICENSE を参照してください。