
CVE-2025-38502の研究リポジトリ。LinuxカーネルBPF cgroupローカルストレージにおけるテールコール経由の境界外アクセスにより、ローカル権限昇格が可能となる。

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
Linux カーネル BPF cgroup ローカルストレージにおけるテールコール経由の境界外アクセス
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — 境界外読み取り |
| ベンダー | Linux カーネル |
| コンポーネント | kernel/bpf/core.c, include/linux/bpf.h (cgroup ローカルストレージ + テールコール) |
| 影響 | ローカルカーネルメモリ破壊。未パッチのカーネルでは権限昇格が想定範囲内 |
| 攻撃ベクトル | ローカル (AV:L) |
| 権限 | 低 (PR:L) — CGROUP_SKB 型の BPF プログラム (または同等の cgroup 接続プログラム) をロードできるプロセス |
| ユーザー操作 | 不要 |
| CVSS 3.1 (kernel.org CNA) | 7.8 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CVSS 3.1 (NVD) | 7.1 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H |
| 公開日 | 2025年8月16日 |
| アップストリーム修正 | 6.17-rc1 の abad3d0。6.16.1、6.12.46、6.6.105、6.1.151、5.15.192 にバックポート済み |
研究・教育目的のみ。 このリポジトリをホストする当事者と対象システムの所有者の両方から明示的な書面による許可を得ていない限り、このリポジトリ内の資料をいかなるホストに対しても実行、デプロイ、または使用しないでください。実環境で発見されました。
ソースファイル名 CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c は識別子を切り詰めています。公開されたレコードは CVE-2025-38502 です。Linux CVE CVE-2025-3850 は存在しません。
Lonial は、cgroup BPF ローカルストレージがテールコールをまたいで境界外アクセスされる可能性があることを報告しました。
eBPF 検証器は各プログラムを個別に型チェックします。実行時、bpf_get_local_storage() は現在実行中のプログラムのマップを参照しません。cgroup ストレージポインタを current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[] から読み取ります。このスロットは、テールコールされた先のプログラムではなく、元々アタッチされたプログラムから設定されます。
プログラム A (小さい BPF_MAP_TYPE_CGROUP_STORAGE の値サイズ) がプログラム B (大きい値サイズ) をテールコールする場合、B の bpf_get_local_storage() は依然として A のより小さいバッファを返します。検証器が B のマップに対して許可したアクセスは、A のアロケーションの終端を越えてしまいます。
この欠陥は Linux 5.9 で 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup) によって導入されました。bpf_map_owner に storage_cookie[] を追加することで修正され、テールコールの組み合わせは、呼び出し先が呼び出し元と同じ cgroup ストレージマップを使用するか、まったく使用しない場合にのみ受け入れられるようになりました。
これはローカルカーネルヒープの境界外アクセスです。深刻度のスコアリングは、このプリミティブを「読み取り専用 DoS」と見なすか完全なメモリ破壊と見なすかでベンダー間で見解が分かれるため、異なります。
| 情報源 | スコア | 完全性 | 備考 |
|---|---|---|---|
| kernel.org CNA / cve.org | 7.8 HIGH | High | C:H/I:H/A:H — 完全なローカル影響として扱う |
| NVD | 7.1 HIGH | None | C:H/I:N/A:H — 機密性 + 可用性 |
| Ubuntu | Medium (7.1) | — | USN-7909 |
| Red Hat | 4.0 LOW | None | C:N/I:N/A:L — 限定的な可用性として評価 |
| Amazon Linux | 4.0 Medium | None | Red Hat と同じベクトル |
| SUSE | 6.1 Moderate | None | 一部の SLE 15 ストリームは WONTFIX とマーク |
実際にはこれが意味すること:
struct bpf_array) が破壊される可能性があります。map->ops の上書き、ヘルパーのハイジャック、commit_creds / 名前空間切り替え)。これがこのツリーがこの問題を LPE とラベル付けする理由です。Red Hat のより低いスコアは、バグの不在ではなく、製品固有の評価を反映しています。このバグはネットワークに面したサービスを必要としません。ローカルです。TTY、setuid ヘルパー、またはユーザー操作を必要としません。
2 つの cgroup BPF プログラム、それぞれが独自の BPF_MAP_TYPE_CGROUP_STORAGE (共有フレーバー、BPF_CGROUP_STORAGE_SHARED) を持ちます:
| プログラム | 役割 | ストレージ値サイズ |
|---|---|---|
| A | アタッチ済み / テールコール呼び出し元 | 小さい (例: 特定の kmalloc order に収まる) |
| B | テールコール先 | 大きい (検証器はこのサイズまでのアクセスを許可) |
検証器は A を A のマップに対して、B を B のマップに対してチェックします。両方とも合格します。
実行時、ヘルパーは以下を実行します:
ctx = container_of(current->bpf_ctx, struct bpf_cg_run_ctx, run_ctx);
storage = ctx->prog_item->cgroup_storage[stype];
if (stype == BPF_CGROUP_STORAGE_SHARED)
ptr = &READ_ONCE(storage->buf)->data[0];
else
ptr = this_cpu_ptr(storage->percpu_buf);
prog_item は、bpf_tail_call 後に現在実行中のプログラムではなく、cgroup 実行を開始したプログラムの配列エントリです。したがって B は A のストレージオブジェクトを操作します。
bpf_cgroup_storage_alloc() は、マップの value_size からバッキングバッファのサイズを決定します。A のバッファは B の検証済みアクセスに対して小さすぎます。結果は、制御転送をまたいだマップ同一性の古典的な型混同です。これは、他の BPF の「ヘルパーが検証器とは異なるマップを見る」問題と同じファミリーのバグです。
コミット 7d9c342 は、cgroup ストレージを同じ cgroup にアタッチされたプログラム間で共有するようにしました。この共有により、実行コンテキストのスロットがプログラムごとのルックアップではなく単一のポインタになり、5.9 より前のカーネルが影響を受けない理由となっています。
BPF_PROG_TYPE_CGROUP_SKB プログラムに対する BPF_PROG_TEST_RUN は、テスト期間中 cgroup ストレージを割り当てます。このアロケーションは、同じサイズクラスで最近解放された他のものの隣のカーネルヒープ上に位置します — 例えば、同じ kmalloc order に収まるように value_size が選ばれた struct bpf_array マップを含みます。したがって、ストレージバッファからの OOB は、隣接する配列マップの bpf_map フィールド (ops、RCU リスト、value[]) に到達する可能性があります。
このヒープレイアウトの詳細が、「単なる OOB 読み取り」のアドバイザリと LPE の解説が同じ CVE を説明できる理由です。
導入: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
影響なし: 5.9 より前のすべてのカーネル
| シリーズ | 影響あり | 最初の修正 |
|---|---|---|
| 5.9 – 5.15 | 5.9 から 5.15.191 まで | 5.15.192 (c1c74584…) |
| 5.16 – 6.1 | 5.16 から 6.1.150 まで | 6.1.151 (66da7cee…) |
| 6.2 – 6.6 | 6.2 から 6.6.104 まで | 6.6.105 (7acfa07c…) |
| 6.7 – 6.12 | 6.7 から 6.12.45 まで | 6.12.46 (41688d1f…) |
| 6.13 – 6.16 | 6.13 から 6.16.0 まで | 6.16.1 (19341d5c…) |
| mainline | 修正が入るまで | 6.17-rc1 (abad3d0b…) |
ワンライナー:
/* CVE-2025-38502: affected 5.9–5.15.191, 5.16–6.1.150, 6.2–6.6.104, 6.7–6.12.45, 6.13–6.16.0; fixed in 5.15.192, 6.1.151, 6.6.105, 6.12.46, 6.16.1, 6.17-rc1 */
一部の stable では依然未修正: Debian のカーネルトラッカーは 5.10 アップストリーム stable / bullseye 5.10 を needed と記載していました。すべての 5.10.y がパッチ済みであると仮定しないでください。
ディストロの ABI 番号は当てになりません。 Ubuntu 5.15.0-163 は、5.15.0 がアップストリーム 5.15.192 より古く見えても、パッチ済みの 5.15 です。上の表と uname -r を比較するのではなく、パッケージの changelog / USN / DSA / ALAS / RHSA を比較してください。
上記の範囲のカーネルを出荷したディストリビューションは、abad3d0 (または対応する stable コミット) をバックポートするまで対象でした。これはディストロ固有のパッチではなく、汎用 BPF コードです。
| ディストロ | 範囲内だったリリース / カーネル |
|---|---|
| Ubuntu | 22.04 LTS (5.15)、24.04 LTS (6.8)、25.04 (EOL でも needed)。20.04 HWE 5.15。 |
| Debian | 11 bullseye (5.10)、12 bookworm (6.1)、13 trixie (6.12) |
| RHEL 9 / 10、Rocky、Alma、Fedora | RHEL 9 ≈ 5.14、RHEL 10 ≈ 6.12、Fedora ローリング 5.9–6.16 |
| SUSE / openSUSE | SLE Micro 5.3/5.4、一部の SLE 15 ストリームは WONTFIX |
| Amazon Linux 2023 | デフォルトカーネルおよび kernel6.12 |
| Amazon Linux 2 extras | 5.10 extra (修正予定なし) および 5.15 extra |
| Arch、Gentoo、Tumbleweed | 5.9 から 6.16.1 / 6.17-rc1 修正までのローリングカーネル |
| ディストロ | 修正済みパッケージ (目安) | アドバイザリ |
|---|---|---|
| Ubuntu 22.04 | linux 5.15.0-163.173 | USN-7909 |
| Ubuntu 24.04 | linux 6.8.0-106.106 | 同上 |
| Debian 12 | linux 6.1.153-1 | DSA-6009-1 |
| Debian 13 | linux 6.12.48-1 | DSA-6008-1 |
| Debian 11 (6.1 バックポート) | linux-6.1 6.1.153-1~deb11u1 | DLA-4328-1 |
| Amazon Linux 2023 | kernel / kernel6.12、2025-09-29 | ALAS2023-2025-1210 / 1208 |
| Amazon Linux 2 5.15 extra | 2025-09-29 | ALAS2KERNEL-5.15-2025-091 |
Ubuntu 26.04 / 25.10 は影響なしと記載されています (修正後にブランチしたため)。Ubuntu 25.04 は EOL に達しても needed のままです。