
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」と見なすか完全なメモリ破壊と見なすかでベンダー間で見解が分かれるため、異なります。
実際にはこれが意味すること:
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 より前のすべてのカーネル
ワンライナー:
/* 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 26.04 / 25.10 は影響なしと記載されています (修正後にブランチしたため)。Ubuntu 25.04 は EOL に達しても needed のままです。
ホストが影響を受けるバージョンに一致しても、到達可能でない場合があります。有用なチェック:
unprivileged_bpf_disabled=1 は完全な修正ではありません — BPF ケイパビリティを持つユーザーは依然としてこのバグに到達できます — が、非特権パスを排除します。
アップストリームコミット abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage、Daniel Borkmann)。
struct bpf_map_owner に storage_cookie[] 配列が追加されます。テールコール先の更新時に、カーネルは以下を行います:
bpf_get_local_storage() を使用する場合 — 呼び出し先の cgroup ストレージマップが呼び出し元のマップと完全に同じ (同じクッキー) であることを要求します。値サイズの不一致は、検証器の背後で合成できなくなりました。各プログラムは依然として単独で検証されますが、新しいチェックはそれらの間のエッジにあります。
周囲の BPF owner/cookie ヘルパーなしで、任意のツリーにコミットをチェリーピックしないでください。お使いのシリーズ用の stable バックポートを使用してください。
uname -r
# Compare against the table above, then against your distro advisory —
# Ubuntu/Debian ABI numbers are not upstream stable numbers.
grep -E 'CONFIG_BPF_SYSCALL|CONFIG_CGROUP_BPF' \
/boot/config-$(uname -r) /proc/config.gz 2>/dev/null
sysctl kernel.unprivileged_bpf_disabled
# 0 = unprivileged bpf allowed (widest exposure)
# 1 = disabled after first privileged use, or fully disabled depending on kernel
# 2 = disabled (admin can re-enable)
バージョン文字列だけでなく、パッケージを確認してください:
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502
# RHEL family
rpm -q --changelog kernel | grep -i 38502
カーネル ≥ 6.17、または「最初の修正」列に記載された stable、またはアドバイザリ表のディストロパッケージが、実際のクローズアウトです。
abad3d0 / stable 相当を含むディストロカーネルをインストールします。これが唯一の完全な修正です。kernel.unprivileged_bpf_disabled=1 (または 2) を設定して、非特権ローダーを排除します。CAP_BPF、CAP_PERFMON、CAP_SYS_ADMIN を制限します。seccomp、LSM、またはランタイムでこれらのケイパビリティを削除)。BPF_PROG_TEST_RUN だけでアロケーションパスを実行するのに十分です。ローカル攻撃者がプログラムを提供します。CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
| ファイル | 内容 |
|---|---|
banner.png | README バナー (Abraxas Labs / CVE-2025-38502) |
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c | 実環境で回収された研究ソース (ファイル名は CVE ID を切り詰めている) |
ebpf_lpe.h | そのソースで使用される共有 BPF 命令コンストラクタ、マップヘルパー、カーネルオフセットマクロ |
このディレクトリは脆弱性を文書化し、対応する研究ツリーを保持しています。これはすぐに使えるエクスプロイトキットではありません: カーネルギャジェットシンボル (ARRAY_MAP_OPS_OFF、COMMIT_CREDS、…) は特定の vmlinux 用のコンパイル時入力であり、稼働中のカーネルに対してプログラムを実行することはこの README の範囲外です。
CVE / NVD
アップストリーム
7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroupabad3d0 — bpf: Fix oob access in cgroup local storageStable バックポート
ディストロ
Abraxas Labs — 研究 / 許可されたテストのみ
このリポジトリは研究と教育のためのものです。
このリポジトリをホストする当事者と対象の所有者の両方から明示的な書面による許可を得ていない限り、ここにあるコードをいかなるシステムに対してもコンパイル、実行、デプロイ、またはその他の方法で使用しないでください。コンピュータシステムへの不正アクセスは犯罪です。
著者および Abraxas Labs は、この資料を現状のまま提供し、完全、正確、または実行しても安全であるという保証はありません。カーネルエクスプロイト研究は、マシンをパニックさせ、ファイルシステムを破壊し、データを失う可能性があります。そのリスクはあなたが負います。
実環境で発見されました。
| 情報源 | スコア | 完全性 | 備考 |
|---|
| 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 とマーク |
| シリーズ | 影響あり | 最初の修正 |
|---|
| 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…) |
| ディストロ | 範囲内だったリリース / カーネル |
|---|
| 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 |
| 条件 | 重要な理由 |
|---|
CONFIG_BPF_SYSCALL=y | bpf(2) が存在する必要がある |
CONFIG_CGROUP_BPF=y | cgroup 接続プログラムと cgroup ローカルストレージ |
kernel.unprivileged_bpf_disabled | 0 は非特権プログラムロードを許可、1/2 は CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN を要求 |
| Lockdown / LSM / seccomp | BPF_PROG_LOAD または BPF_PROG_TEST_RUN をブロックする可能性がある |
BPF_PROG_TYPE_CGROUP_SKB (またはローカルストレージを持つ他の cgroup プログラム型) | cgroup_storage[] を保持する実行コンテキスト |