Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-46331 — pedit COW | Kitploit
ツール/GitHubGitHub/v0idnetwork/cve-2026-46331
特権昇格脆弱性分析エクスプロイトCTF論文と研究学習と教育バイナリエクスプロイト
GitHubv0idnetwork/cve-2026-46331

CVE-2026-46331

pedit COW

リポジトリを見る
11ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-46331(pedit COW) – Linux net/sched パケットエディタのページキャッシュポイズニング脆弱性

エグゼクティブサマリー

CVE-2026-46331(通称 「pedit COW」)は、トラフィック制御サブシステムにおけるLinuxカーネルのローカル権限昇格の欠陥です。権限のないユーザー(権限のないネットワーク名前空間内)が act_pedit(パケットエディタ)フィルタを構成して、ページキャッシュへの部分的なコピーオンライト(COW)書き込みを引き起こす可能性があります。実際には、カーネルは攻撃者が制御するデータをファイルのインメモリイメージにページをプライベートとしてマークせずに書き込み、そのファイルのキャッシュされたコピーを破壊します。重要な点として、このエクスプロイトに必要なのはCAP_NET_ADMIN(ユーザー名前空間で取得可能)だけであり、ディスク上のファイルは変更しません。実際には、packet_edit_meme と呼ばれる実証用の概念実証(PoC)が2026年6月17日に公開され、setuidバイナリ(例:/bin/su)のページキャッシュイメージを上書きしてルートシェルを起動する方法を示しました。この脆弱性は、tcf_pedit_act() における誤ったCOW範囲の計算に起因し、上流では(2026年6月4日に)書き込み可能領域のチェックをキーごとのループ内に移動することで修正されています。

  • 影響を受けるバージョン: act_pedit を備えたLinuxカーネル(約v5.18から7.1-rc6)。パッチ未適用の安定版リリース(多くのディストリビューションカーネルを含む)は脆弱です。
  • 影響: ページキャッシュの破壊(ページキャッシュポイズニング)によるrootへのローカル権限昇格。CVSS v3.1: 6.0(中程度、AV:L/AC:L/PR:H/UI:N/C:N/I:H/A:H)。
  • エクスプロイト: このPoCは、権限のないユーザー+ネットワーク名前空間を利用してCAP_NET_ADMINを取得し、tc peditフィルタを設定して、setuidバイナリのメモリ上のELFエントリポイントをシェルコードで上書きします。
  • 緩和策: カーネルを更新する(上流のパッチでは skb_ensure_writable() をキーループ内に移動しました)。回避策として、act_pedit モジュールをブロックまたはアンロードするか、権限のないユーザー名前空間を無効にします(例:sysctl user.max_user_namespaces=0)。緩和後は、キャッシュをドロップして(echo 3 > /proc/sys/vm/drop_caches)汚染されたページを追い出します。

このレポートは、CVE-2026-46331の詳細な技術分析を提供します:その原因、悪用方法、検出、および修復戦略、ベンダー勧告、CVE、公開エクスプロイトへの参照を含みます。

脆弱性の概要

定義: CVE-2026-46331は、LinuxカーネルのTraffic Control(net/sched)サブシステム、具体的には act_pedit(パケットエディタ)アクションにおける範囲外書き込みバグです。関数 tcf_pedit_act() は、型付きキーを反復処理する前に、パケット編集操作の「コピーオンライト」範囲を静的なヒント tcfp_off_max_hint を使用して計算します。ただし、一部のキー(例:TCP/UDPヘッダーの編集)は、最終的なバイトオフセットを実行時のみに決定します。コードはこれらの動的オフセットについて書き込み可能性を再チェックしません。その結果、事前にCOWされた領域の外側で書き込みが発生する可能性があります:パケット書き込みの一部がプライベートにされることはなく、部分的なCOW につながります。この誤った書き込みは、(パケットバッファがたまたまファイルページを参照している場合)ファイルの共有ページキャッシュメモリに伝播し、キャッシュされたファイルイメージを破壊します。

背景: Linuxの**パケットエディタ(pedit)**アクションは、管理者が設定された tc フィルタをパケットが通過する際に、パケットヘッダー(リンク層、ネットワーク層、またはトランスポート層)内の任意のバイトを書き換えることを可能にします。これは、オフセット(ヘッダーに固定される可能性がある)と32ビットの値/マスクを指定することで機能します。内部的には、pedit はソケットバッファ(sk_buff)を操作し、変更する前にターゲットのパケットメモリを書き込み可能にする必要があります(COW方式で skb_ensure_writable() を使用)。理想的には、カーネルは書き込む前に共有ページをクローン(プライベートコピー)して、他の場所で使用されているメモリを変更しないようにする必要があります。

根本原因: tcf_pedit_act() では、コードが誤って tcfp_off_max_hint(最大静的オフセット)を使用して書き込み可能範囲を最初に一度だけ計算します。このヒントには、パケットが処理されるときに型付きキーが追加する実行時ヘッダーオフセットが含まれません。TCPやUDPなどのキーは、実行時にIPヘッダーの位置に基づいてオフセットを計算できます(たとえば、以前のキーがネットワークヘッダーをシフトした場合)。したがって、キーごとのループ中に、キーの実際のオフセットが事前に書き込み可能として割り当てられた範囲を超える可能性があります。その後、コードは skb_store_bits() を介してパケットメモリに書き込みますが、事前にCOWされた領域を超えたページはプライベートにされていないため、その書き込みはページキャッシュとまだ共有されているページを破壊します。つまり、**「書き込み可能なパケット範囲を早期に計算しすぎる」**ことが、範囲外のページ間書き込みを引き起こします。負のオフセット(例:入力時のイーサネットヘッダーの編集)も誤って処理され、offset_valid() でさえ INT_MIN のガードがなく、この欠陥を悪化させています。

なぜ発生するのか: このバグは、基本的にはコピーオンライト範囲計算の論理エラーです。カーネルは、静的最大オフセット(ロード時に既知)がすべての編集に十分であると想定しました。動的オフセットを持つキーが実際に適用されたときに、COW範囲を更新できませんでした。一連のキューされた編集の後、最終的な書き込みは事前にチェックされた領域の外側にある可能性があります。パケットバッファはメモリマップされたファイルページを参照する可能性があるため(例:ゼロコピーメカニズムを介して)、この「部分的なCOW」書き込みはディスク上のファイルのページキャッシュに到達する可能性があります。実際には、パケットエディタアクションはsendfileまたはspliceからページを受け取る可能性があるため、単一のパケットフィルタ操作が間接的に攻撃者が選択したデータをファイルのインメモリイメージに書き込むことができ、ディスクは変更されません。

技術分析

コンポーネントとデータフロー: 脆弱なコードはLinuxの net/sched サブシステム(act_pedit.c)にあります。パケットが設定された pedit ルールに一致すると、tcf_pedit_act() が呼び出されます。内部的には、skb_ensure_writable(skb, X) を正確に1回呼び出します。ここで X = tcfp_off_max_hint です。これにより、パケットの最初の X バイトがプライベート(COW処理)になります。次に、各キー(編集操作)をループし、キーの指定されたオフセットに実行時ヘッダーオフセットを加算してキーの実際の書き込みオフセットを計算し、32ビット値をパケットに書き込みます。疑似コードでは:```c u32 off_max = action->tcfp_off_max_hint; skb_ensure_writable(skb, off_max); for (i = 0; i < num_keys; i++) { u32 hdr_off = compute_header_offset(skb, key[i].hdr_type); u32 write_off = hdr_off + key[i].offset; skb_store_bits(skb, write_off, &key[i].value, 4); }

root@kitploit:~
Because `hdr_off` は各キーを処理するときにのみ計算されるため、最初の `skb_ensure_writable()` 呼び出しはそれを考慮していませんでした。`hdr_off + key[i].offset` が `off_max` を超えると、コードはメインの線形領域ではなくフラグメント上で `skb_store_bits()` にフォールバックし、プライベート化されていないページに書き込むことになります。これが失敗点です。

**攻撃対象領域:** 必要なインターフェースは、`pedit` アクションを備えた **tc フィルター** のみであり、通常は **CAP_NET_ADMIN** ケーパビリティが必要です。しかし、通常のユーザーは(ユーザー名前空間のクローン生成により)プライベートなネットワーク名前空間内で、実際の特権なしに CAP_NET_ADMIN を取得できます。したがって、非特権ユーザーはユーザー+ネット名前空間に入り、ループバック上に `tc pedit` ルールを作成できます。書き込みはパケットが処理されるときに発生します(攻撃者は通常、トリガーするためにループバック上でトラフィックを生成します)。カーネルは自身の COW 設定を信頼していましたが、ユーザー提供のオフセットがその前提を破ったため、信頼境界(ユーザー対カーネル)が越えられます。

**内部メカニズム:** カーネル側では、この脆弱性は **境界外書き込み**(CWE-787)として現れます。これはユーザー空間にマップされたカーネルメモリ(ファイルページキャッシュ)を破壊します。具体的には、ソケットバッファにたまたまマップされている任意のファイルページの内容を上書きできます。概念実証では、`/bin/su` をソケットバッファに送り込んで mmap するため、エクスプロイトはメモリ内のエントリポイントのバイトを反転させます。これはディスク上のファイルを変更しませんが、その後そのバイナリを実行すると、キャッシュから汚染されたイメージが読み込まれます。ブログの分析は次のように述べています:

> “skb は sendfile 経由で取り込まれたゼロコピーページを参照できるため、その境界外書き込みは実ファイルを支える共有ページキャッシュメモリに到達し得ます。カーネルはパケットメモリを変更しても安全な状態にしたと信じていますが、実際には、その後の書き込みは実際にプライベート化した領域の外にまで達します。”

**信頼境界:** カーネルは、`skb_ensure_writable()`(高速パス COW)がその後のすべての書き込みに対して安全性を保証すると誤って想定していました。各キーについて再チェックしなかったのです。ユーザーが制御できるのはパケットフィルタの設定とパケットコンテンツのみで、カーネルは(ネットワーク名前空間を通じて)それを許可していました。その信頼が破られると、書き込みは保護されるべきだったファイルバッキングメモリへと逃れてしまいました。

## 根本原因分析

根本原因は、**pedit アクションにおける COW 範囲の誤った計算**です。コード的には、単一の `skb_ensure_writable()` が `tcfp_off_max_hint` に基づく長さで呼び出され、その後ループ内で実際のオフセットがこれを超える可能性がありました。小さなパッチ(2026年5月)は、真のオフセットが判明した後に `skb_ensure_writable()` をループの *内側* に移動し、負のオフセットに対するチェックと特別な処理を追加することで修正しています。言い換えれば:

- **バグのあるコード:**  ```c
  skb_ensure_writable(skb, action->tcfp_off_max_hint);
  for each key:
      // compute offset (hdr_off + key_offset)
      skb_store_bits(skb, write_off, ...);
  • 修正コード: ```c for each key: // compute offset (hdr_off + key_offset) skb_ensure_writable(skb, write_off + 3); skb_store_bits(skb, write_off, ...);
    root@kitploit:~

さらに、この修正では、負のオフセット(イーサネットヘッダー編集)の場合にヘッドルームに対して skb_cow() を使用し、INT_MIN ケースを防ぎます。コミットメッセージ(stack.watch の要約)には次のようにあります:「実際の書き込みオフセットが判明している per-key ループ内に skb_ensure_writable() を移動し、オフセット演算にオーバーフローチェックを追加して修正する。」

つまり、なぜこのバグが存在するのか: コードレビューや設計の際に、キーごとの再計算が見落とされていました。静的ヒント最適化により、キーごとに再評価する必要性が回避されました。これは悪意のある見落としというよりも、単純なバグのように見えますが、COW の前提に違反するため、その影響は深刻です。TuxCare が指摘するように、このバグは日常的な「データ破損」修正を装ってマージされ、即時のセキュリティコンテキストがないままでした。

Discovery Process

この脆弱性は、カーネルコミット 8b796475fd78(2022年5月)によって導入され、2026年初頭まで気付かれないままでした。情報源によると、修正(2026年5月31日のコミット 899ee91156e5)は、通常のデータ破損パッチとして netdev メーリングリストに提出されました。カーネルメンテナは、2026年6月4日にその修正(net-7.1-rc7)をマージしました。CVE-2026-46331 が正式に割り当てられたのは、2026年6月16日になってからでした(パッチの出現から約2週間後)。完全に武器化された公開エクスプロイトは、2026年6月17日に登場しました(packet_edit_meme PoC)。

実際には、その経緯は次のとおりです:

  • 修正提出(メーリングリスト): 2026年5月17日(Zhang Cen パッチ)
  • 修正のアップストリームマージ: 2026年6月4日(net-7.1-rc7)
  • CVE 割り当て: 2026年6月16日(CNA が CVE-2026-46331 を登録)
  • 公開 PoC: 2026年6月17日(packet_edit_meme)
  • パッチ展開: 2026年6月下旬、ほとんどのディストリビューション(Red Hat、Debian、Ubuntu など)

公開されたパッチによって、複数の関係者がこのバグに気付きました。例えば、サイバーセキュリティ研究者の Massimiliano Oldani は、その直後に詳細な解説とエクスプロイトを公開し、「CVE 割り当てから24時間以内に、packet_edit_meme という名前の実用的な概念実証エクスプロイトが GitHub に登場した」 と述べています。CloudLinux、TuxCare、SentinelOne は、PoC が公開され CVE が割り当てられた後、分析を公開しました。Debian セキュリティトラッカーと PT DBugs も、この問題と利用可能なアドバイザリをまとめています(参考文献を参照)。

Attack Scenario

現実的な攻撃には、最小限の前提条件しか必要ありません:

  • 攻撃者の能力: 対象マシン上のローカルの非特権ユーザー。そのユーザーは、unshare(CLONE_NEWUSER|CLONE_NEWNET) を使用して、ネットワーク名前空間を伴う新しいユーザー名前空間を作成できなければなりません。これにより、実際の root 権限なしで、その名前空間内で CAP_NET_ADMIN が付与されます。非特権ユーザー名前空間は多くのカーネル(例:RHEL、Debian)でデフォルトで有効になっており、Ubuntu では aa-exec の回避策で再び有効にできます。

  • 対象条件: 対象は、act_pedit モジュールが利用可能な脆弱な Linux カーネル(約 5.18〜7.1-rc6)を実行している必要があります。act_pedit が組み込まれているか、すでにロードされている場合、すぐに悪用可能です。モジュールの場合は、tc pedit ルールが構成されると自動的にロードされます。対象は、アップストリームパッチを適用していない必要があります。特に、攻撃者がファイルへの書き込みアクセス権を持つ必要はありません。このエクスプロイトは、パケットフィルタを介した書き込みによって機能します。

  • 攻撃チェーン:

    1. CAP_NET_ADMIN の取得: 攻撃者は unshare --map-root-user --net --pid bash のようなものを実行して、新しいユーザー+ネット名前空間を作成します。これにより、その名前空間内で CAP_NET_ADMIN が付与されます(ユーザーは内部で root にマッピングされます)。
    2. ネットワークのセットアップ: 攻撃者はループバックインターフェースを起動し(ifconfig lo up)、必要に応じてリスナーを起動します(例:nc -l 127.0.0.1 9999)。これにより、TC アクションに使用するパケットフローが提供されます。
    3. TC pedit アクションの構成: 攻撃者は tc コマンドまたは netlink を使用して、すべてのパケットにマッチする(例:match u32 0 0)qdisc とフィルタを 上に作成し、特別に細工されたキーを持つ アクションをアタッチします。各キーは、動的なヘッダータイプ(例:L4 オフセット用の IP ヘッダー)と、実際の書き込み位置(ヘッダー開始 + オフセット)が がカバーした範囲の直後になるように選ばれたオフセットを持ちます。

影響: 成功した場合、攻撃者はローカルで完全な root 権限を取得します。このエクスプロイトは1つのコマンドで実行でき、決定的です。さらに、任意のファイルバッキングページの破損は、別の方法で使用された場合、サービス拒否(システムクラッシュ)を引き起こす可能性があります。公開された PoC は具体的に /bin/su のエントリポイントをシェルコードで上書きしましたが、攻撃者がマップできる任意のファイルが標的になる可能性があります。この攻撃チェーンは特別なタイミングやレースを必要とせず、多くのディストリビューション(RHEL、Ubuntu、Debian など)で実証されています。

概念実証(PoC)

公開エクスプロイトである packet_edit_meme は、GitHub(sgkdev/packet_edit_meme)で入手でき、/bin/su を対象としています。ここでは、破壊的なペイロードを除いた核となるロジックを説明します:```c /* Pseudocode outline of the exploit (simplified) / int main() { / 1. Identify a setuid binary (su) and its ELF entry offset */ int fd = open("/bin/su", O_RDONLY); long entry = elf_entry_offset(fd); if (entry < 0) abort(); printf("Target %s (UID=%d), entry offset 0x%lx\n", "/bin/su", getuid(), entry);

root@kitploit:~
/* 2. Unshare user+net namespace to get CAP_NET_ADMIN locally */
if (unshare(CLONE_NEWUSER | CLONE_NEWNET) < 0) abort();
/* Map UID/GID to root (handled via /proc/self/uid_map, /gid_map) */
// (omit details: write "0 <uid> 1" to /proc/self/uid_map and gid_map, and deny setgroups)

/* 3. Setup environment: bring up loopback and listener */
if (system("ip link set lo up") < 0) abort();
if (system("nc -l 127.0.0.1 9999 &") < 0) abort();

/* 4. Configure a tc pedit action via netlink (simplified) */
// Assume 'pedit_write' sends a packet-edit command to the kernel.
// The key offsets below are chosen such that they exceed the initial COW range.

char shellcode[/*size=48*/] = {
    // (assembly for setgid(0); setuid(0); execve("/bin/sh").., padded to 36 or 48 bytes)
};
size_t total = sizeof(shellcode), sent = 0;
while (sent < total) {
    int chunk = min(PEDIT_MAX_WRITE, total - sent);
    /* Issue TC pedit action to write next chunk */
    if (pedit_write(fd, entry + sent, &shellcode[sent], chunk) != 0) {
        fprintf(stderr, "pedit_write failed\n");
        exit(1);
    }
    sent += chunk;
}
/* 5. Trigger execution of su (in original namespace) */
execl("/bin/su", "su", NULL);  // This will run the poisoned binary as root
return 0;

}

root@kitploit:~
This pseudocode illustrates the flow: open `/bin/su`, unshare namespaces to gain CAP_NET_ADMIN, configure loopback and TC pedit rules, then call a function `pedit_write(fd, offset, data, len)` (in the actual PoC this uses netlink calls under the hood) to overwrite the target’s page cache.  Finally, the binary is executed, spawning a root shell.  

The actual PoC is more elaborate (handling UID/GID maps, network listening, and syscall-level shellcode bytes), but the core concept is as above.  We emphasize **not to run this exploit** except in a safe test environment, and not to target any real system. The above is for demonstration only.

**Note:** If no public safe-to-use PoC existed, we would explicitly state so. In this case, the PoC is public, and we describe it conceptually.  We have omitted the raw shellcode bytes and actual netlink details for brevity and safety.

## Exploitation Flow

1. **Entry Point:** The attacker must first obtain CAP_NET_ADMIN. Typically, this means creating a user+network namespace (`unshare`) from an unprivileged process, which grants namespace-local CAP_NET_ADMIN.

2. **Initial Access:** Within this namespace, the attacker can use normal tools (`ip`, `tc`) to configure traffic control. The kernel’s `act_pedit` code path is now reachable for packets.

3. **Trigger:** The attacker sets up a `tc filter ... action pedit` on the loopback interface. This filter matches packets (e.g. 0-match) and specifies one or more **typed keys** with header types (IP, TCP) and offsets. The offsets are chosen so that *after the kernel computes the header base inside the loop*, the final write offset exceeds the initial COW range.

4. **Exploitation:** When a packet matching the filter is processed, the kernel calls `tcf_pedit_act()`. It performs an *insufficient* `skb_ensure_writable()` and then iterates keys. For at least one key, the write lands on a page that was *not* cloned to private copy. This causes an **out-of-bounds write** into the shared page cache. If the socket buffer was prepared to reference pages of a file (via sendfile/splice), that write corrupts those file pages.

5. **Post-Exploitation:** The attacker’s shellcode has been written into the target binary’s pagecache (e.g. `/bin/su`). The attacker (in the original namespace) then executes `/bin/su`. The kernel reads the in-memory image (with the injected payload) and runs the shellcode, giving the attacker a root shell. At this point, full system compromise has occurred.

6. **Impact:** The attacker gains root privileges. Confidential data could be overwritten but not leaked directly. Integrity is completely broken (the attacker can change any file’s memory image). Availability can also be affected (miswriting critical pages could crash processes or the system). CVSS metrics: Medium overall (CVSS 3.1=6.0), but actual impact is severe local root.

This flow is summarized diagrammatically:```mermaid
flowchart LR
    A[Attacker (unprivileged user)] --> B[Unshare into user+net namespace<br>(gains CAP_NET_ADMIN)]
    B --> C[Configure TC pedit filter on lo]
    C --> D{Packet processing by kernel}
    D --> E[act_pedit computes wrong COW range]
    E --> F[skb_store_bits writes beyond COW'd region]
    F --> G[Page cache of target file is corrupted]
    G --> H[Attacker executes poisoned setuid binary]
    H --> I[Root shell obtained]

侵害の痕跡(IoCs)

  • 予期しないページキャッシュ書き込み: システムファイル(特に実行ファイル)が、ディスク上の変更なしにメモリ内で改変されている(例: ハッシュ化ツールや整合性モニターはメモリ内の不一致を検出する)。
  • モジュールのロード: 通常はtc peditを使用しないシステムで、act_peditモジュールがlsmodに予期せず表示される。(例: Webサーバー上でlsmod | grep act_peditが空でない)。
  • tcの使用: 非特権プロセスからの異常なtcコマンドまたはnetlinkメッセージ。監査ログに、非rootプロセスにCAP_NET_ADMINが付与されたことが記録される場合があります。
  • ネットワーク待ち受け: ループバックポート上のリスナー(エクスプロイトがパケット処理を強制するためにソケットをバインドするため)。たとえば、netstat -tulnpでncまたはカスタムリスナーが127.0.0.1に表示されるのは兆候である可能性があります。
  • カーネルログ: tcf_pedit_act、skb_ensure_writableを含むOopsや警告、またはループバック上の高トラフィック中のソフトロックアップ、tc処理中のエラー。(これらは異常であり、破損を示唆します)。
  • 権限昇格のログ: Linux監査ログ(auditd)に、プログラムがusernsを介してを取得したこと、またはへの書き込みが記録される。

たとえば、あるIOAはページキャッシュ内のファイル破損です。トリアージのチェックリストには、特に大量のtcアクティビティ後のsetuidバイナリについて、メモリ内のファイルコンテンツとディスクを照合することが含まれるでしょう。もう1つは新しい名前空間の作成です。unshare(CLONE_NEWUSER|CLONE_NEWNET)の呼び出しを監視するとフラグを立てられる可能性があります。要するに、防御側はact_peditの使用、usernsの使用、RAM内の実行ファイルの突然の変更のいずれも監視すべきです。

検出

悪用の試みを検出するには:

  • SIEM/ログ分析: act_peditフィルタを追加するtc設定またはnetlinkメッセージをアラート対象にします。たとえば、SigmaルールはTCA_ACT_KIND: peditまたは類似のものを含むイベントを探す可能性があります。非rootプロセスからのcapset CAP_NET_ADMIN、または/proc/*/uid_mapへの書き込みを監査ログで監視します。
  • IDS/IPS: 特定のシグネチャを持つ可能性は低い(ローカルエクスプロイトにはネットワークシグネチャがない)が、ヒューリスティックとして、ホスト整合性アラートと同時に発生するループバック上の予期しないTCP/UDPパケットのトラフィックを監視します。計測が可能であれば、特定のパケット編集を検出できる可能性があります。
  • EDR: namespace/unshareシステムコールと同時に、/bin/su(または他の機密バイナリ)を読み取り、突然実行するプロセスを監視します。setuidバイナリを開きかつusernsを作成するプロセスにアラートを発します。
  • WAF/ネットワーク機器: 該当なし(ローカル攻撃)。
  • ファイル整合性モニタリング: 重要なバイナリのメモリ内イメージをディスク上のチェックサムと比較します。不一致が発生した場合(アップデートがない場合)はアラートを発動します。(CloudLinuxが指摘するように、侵害後のキャッシュ削除は封じ込めにすぎず、真正の修復にはホストの再構築が必要です。)
  • カーネル整合性ツール: Linux Security ModulesまたはeBPFを使用して、特定のプロセスだけがTCフィルタをアタッチできるようにするか、skb_ensure_writable()を欺けないように強制します(既知の組み込みチェックはありませんが)。

要約すると、防御側はユーザー名前空間の使用、tcコマンド、モジュールのロードを記録・監査すべきです。重要なアプローチの1つは、信頼できないユーザーによるtc peditの呼び出しを拒否または記録することです。侵害されたホストでは、/etc/modprobe.d/disable-act_pedit.confが適用されているか確認してください(事前に適用しておくべきです)。

緩和策

パッチの適用: 根本的な修正はカーネルの更新です。主要なディストリビューションはすべて2026年6月にアップデートをリリースしています。パッチ適用済みカーネル(Linux 7.1.0以降、またはディストリビューションのバックポート)にアップグレードすることが決定的な解決策です。

設定変更: パッチをすぐに適用できない場合は、緩和策を実施します:

  • act_peditを無効化: ワークロードがtc peditを必要としない場合は、モジュールをブラックリストに登録します。例: ``` echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf lsmod | grep -w act_pedit && sudo rmmod act_pedit
    root@kitploit:~

これにより、アクションが読み込まれないようになります。(これはCloudLinuxおよびTuxCareによって推奨されています。)tc peditを正規に使用するホストには適用しないでください。

  • ユーザー名前空間を制限する: 非特権名前空間の攻撃ベクトルを除去します。RHEL/Alma/Debianの場合: ``` sudo sysctl -w user.max_user_namespaces=0 echo 'user.max_user_namespaces = 0' | sudo tee /etc/sysctl.d/99-pedit-cow.conf
    root@kitploit:~

Ubuntu 22.04+ の場合: ``` sudo sysctl -w kernel.unprivileged_userns_clone=0 echo 'kernel.unprivileged_userns_clone = 0' | sudo tee /etc/sysctl.d/99-pedit-cow.conf

root@kitploit:~
これにより、特権のないユーザーがCAP_NET_ADMINを獲得するために必要なユーザーネームスペースを作成できなくなります。  注: 名前空間を無効にすると、rootlessコンテナや一部のサンドボックス化されたアプリケーションが壊れる可能性があります。

- **ページキャッシュの破棄(封じ込め):** エクスプロイトが実行された疑いがある場合、バイナリのメモリ内コピーが汚染されている可能性があります。  直ちにキャッシュを破棄して、それらを追い出してください:  ```
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"

これにより、ページがディスクから再読み込みされます。 注意: 攻撃者がすでに root を取得していた場合、キャッシュを破棄しても攻撃者が仕込んだ永続化は除去されません。そのようなホストは侵害されたものとして扱ってください。

  • 最小権限: tc を使用できるユーザーを監査および制限します。 このエクスプロイトは CAP_NET_ADMIN のみを必要とします。このケーパビリティを持つのは信頼できる管理者のみにしてください。 RBAC やコンテナ化を使用して、ケーパビリティの付与を制限します。

  • ネットワーク制御: 直接ネットワーク経由で悪用できるものではありませんが、ループバックの使用状況が監視されるようにしてください。127.0.0.1 へのファイアウォール適用は非現実的ですが、TC 操作にはローカルホストトラフィックのみが使用されるようにしてください。

  • ベンダー勧告: お使いの OS の公式勧告を参照してください。Red Hat は RHEL 8/9/10 向けに RHSA-2026:27354 (および関連) を公開しています。Debian は DSA-6355-1、Ubuntu の CVE ページには修正済みカーネルが一覧表示されています。 (参考文献を参照)

修復

長期的な修復には、影響を受けるすべてのシステムが更新済みカーネルを実行していることを確認することが含まれます。 修正を含むカーネルパッケージをインストールし、システムを再起動する必要があります。 再起動できないコンテナやシステムの場合は、修正パッチを用意している livepatch ソリューション (例: KernelCare) を検討してください。

さらに、システム設計では、ユーザースペースからアクセス可能なカーネルインターフェースは時間とともに変化し得ることを前提とする必要があります。 CAP_NET_ADMIN の制限と tc 使用のフィルタリングは、このバグに限らず有効な良い慣行です。

侵害が発生した場合は、システムを再構築してください。 この脆弱性はページキャッシュのみを汚染しますが、root を取得した攻撃者は他の悪意のある行動を行っている可能性があるため、フォレンジック検証が必要です。 エクスプロイト後のファイル整合性スキャンに依存しないでください。 前述のとおり、PoC はディスク上のファイルを無傷のままにするためです。 再起動とパッチ適用が安全な修復経路です。

影響評価

  • 機密性: このバグはカーネルから機密データを読み出さないため、直接のデータ漏えいはありません。攻撃者のデータをメモリに書き込むだけです。 CVSS v3.1 は機密性への影響を None (C:N) と評価しています。

  • 完全性: High (I:H)。 攻撃者は、権限なしに任意のファイルバッキングページ (例: 実行ファイル、設定ファイル) のメモリ内コンテンツを変更できます。 これにより、現在実行中のシステム上でそれらのファイルの整合性を完全に侵害できます。

  • 可用性: High (A:H)。 カーネル管理メモリや重要なデータ構造を上書きすると、プロセスまたはシステム全体がクラッシュする可能性があります。 シェルコードに悪用されなくても、このバグは重要なページを破壊してサービス拒否を引き起こすために使用される可能性があります。

  • スコープ: エクスプロイトはローカルであるため、変更なし (影響を受けるコンポーネント = 攻撃ベクトル = 被害者のスコープ) です。

これらの要因を考慮すると、典型的な CVSS v3.1 ベクターは AV:L/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:H であり、基本スコア 6.0 (Medium) になります。 ただし、CVSS はこの脆弱性が root への権限昇格 を与えることを捉えていないことに注意してください。実際にはこれは重大です。 (一部の情報源は類似のバグについて CVSSv4 を算出しています。例: PT DBugs は CVSSv4 で 8.5 を記載しています。)

この深刻度は多くの場合、ベンダーによって Important/Critical と評価されています。 Red Hat はこの CVE の勧告で Important とラベル付けし、AWS は Medium (CVSS 6.0) としています。 いずれにせよ、root が取得されるため、実際のリスクはマルチユーザー環境や共有システムで最も高くなります。

関連 CVE

この脆弱性は ページキャッシュポイズニング バグのファミリーに属します。 他の注目すべき CVE は次のとおりです:

  • CVE-2022-0847 (“Dirty Pipe”): Linux 5.8+ の同様の LPE バグで、パイプ上の splice() が COW 境界を超えてページキャッシュに書き込めるものでした。また、メモリ内のファイルを (ディスクを変更せずに) 上書きすることも可能でした。
  • CVE-2016-5195 (“Dirty COW”): /proc/self/mem のコピーオンライトにおける古い欠陥で、読み取り専用マッピングへのローカル書き込みを可能にしました。
  • CVE-2020-14386 (“Dirty Frag”): XFRM/ESP パケット処理 (暗号) の欠陥で、ページキャッシュ内のページをまたぐ書き込みを引き起こしました。
  • CVE-2023-4099 (“Dirty Clone”): 別の netfilter 関連カーネルバグ。

これらはいずれも、カーネルの高速パスが、自分だけが排他的に所有していると信じていたメモリに書き込むが、実際には所有していなかったというものです。 CVE-2026-46331 は、net/sched pedit action で発生し、ユーザー名前空間を利用して特権制限を回避する点でユニークです。 DirtyPipe や Dirty COW とは異なり、補助的な特権プロセス (動作不良のシステムなど) は不要で、単一の非特権ユーザーがトリガーできます。

タイムライン

  • 2022-05-10: 上流カーネルのコミット 8b7964… によってバグが導入されました。
  • 2026-05-17: netdev メーリングリストにパッチが提出されました (Zhang Cen)。
  • 2026-05-31: 上流パッチ (コミット 899ee91156e5) が完了しました。
  • 2026-06-04: パッチが mainline (net-7.1-rc7) にマージされました。
  • 2026-06-16: CVE-2026-46331 が正式に割り当てられました。
  • 2026-06-17: 公開 PoC (packet_edit_meme) がリリースされました。
  • 2026-06-19 から 06-26: ベンダーによるパッチと勧告が公開されました (Red Hat RHSA-2026:27xxx シリーズ、Debian DSA-6355、Ubuntu USN など)。 CloudLinux livepatch と KernelCare のアップデートが発表されました。
  • 06-26 以降: ニュース、ブログ、技術分析 (TuxCare、SentinelOne など)、タイムライン分析 (Oldani の記事) で取り上げられました。

参考文献

  • Linux カーネルパッチと NVD サマリー
  • Red Hat/CISA/Ubuntu 勧告 (NVD/OSV 経由)
  • CloudLinux (CVE-2026-46331 緩和ブログ)
  • TuxCare 分析 (pedit-COW ブログ)
  • SentinelOne 脆弱性 DB エントリ
  • CyberPress の pedit COW に関する記事
  • Positive Technologies DB (dbugs) サマリー
  • Amazon Linux CVE ページ
  • Debian セキュリティトラッカー
  • CloudLinux 緩和ブログ (モジュールブラックリスト、drop_caches)

すべての参考文献は信頼できる情報源 (ベンダー勧告、公開された分析、CVE/NVD エントリ) からのものです。

重要なポイント

  • 部分的な COW は危険: 動的オフセットについて COW 範囲を常に更新してください。act_pedit では、書き込み可能性を早すぎる段階で計算したことでページキャッシュの破壊が可能になりました。
  • ユーザー名前空間が特権をバイパス: 非特権名前空間によって CAP_NET_ADMIN が許可され、ローカルユーザーが TC サブシステムに到達できるようになりました。userns を無効にすると、多くの新たなカーネルエクスプロイトを緩和できます。
  • ページキャッシュポイズニングは強力: ディスクベースのエクスプロイトとは異なり、これらの攻撃はディスクに痕跡を残しません。ファイル整合性ツールでは検出できません。
  • 多層防御: TC 使用の監視、CAP_NET_ADMIN の制限、およびカーネルパッチの迅速な適用が不可欠です。 モジュールのブラックリスト化などの緩和策は、完全なパッチ展開までの時間を稼ぐことができます。
  • 脆弱性ライフサイクル: CVE は修正が公開された後に割り当てられました (“N-day”)。 これは、上流パッチと安定版リリースの採用との間のリスクギャップを浮き彫りにします。組織は CVE だけでなく上流コミットも追跡する必要があります。
ツールをダウンロード
lo
pedit
skb_ensure_writable()
  • トラフィックの生成: 攻撃者はフィルタをトリガーするためにデータを送信します(例:echo '' > /dev/udp/127.0.0.1/53)。カーネルは tcf_pedit_act() を呼び出し、COW 範囲を割り当ててからキーを反復処理します。少なくとも1つのキーの書き込みが事前 COW 領域の外に落ちるため、その書き込みは共有ページキャッシュに入ります。
  • ページキャッシュ汚染: 並行して、攻撃者はソケット内で対象ファイル(通常は setuid バイナリ)を開いています。たとえば、公開された PoC は sendfile などで /bin/su をソケットにメモリマップするため、パケットバッファはそのファイルのページを参照します。その後、範囲外書き込みにより、メモリ内の /bin/su のコピー(具体的には ELF エントリポイント)が破損します。
  • 権限昇格: エクスプロイトがペイロードを書き込んだ後、攻撃者(または元の名前空間の親プロセス)は汚染されたバイナリ(/bin/su)を実行します。カーネルが setgid(0); setuid(0); execve("/bin/sh") を実行するシェルコードを誤って注入しているため、su を実行すると root シェルが得られます。ディスク上のファイルは変更されていないため、ディスク上のファイル整合性ツールでは変更が表示されません。
  • CAP_NET_ADMIN
    /proc/[pid]/uid_map