
CVE-2025-38502 연구 저장소로, tail call을 통한 Linux 커널 BPF cgroup 로컬 스토리지의 out-of-bounds 접근으로 로컬 권한 상승이 가능한 취약점입니다.

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
Linux 커널 BPF cgroup 로컬 스토리지의 tail call을 통한 범위 초과 접근
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — 범위 초과 읽기 |
| Vendor | Linux kernel |
| Component | kernel/bpf/core.c, include/linux/bpf.h (cgroup 로컬 스토리지 + tail call) |
| Impact | 로컬 커널 메모리 손상; 패치되지 않은 커널에서는 권한 상승이 범위에 포함됨 |
| Attack vector | 로컬 (AV:L) |
| Privileges | 낮음 (PR:L) — CGROUP_SKB 유형의 BPF 프로그램(또는 이에 준하는 cgroup 연결 프로그램)을 로드할 수 있는 프로세스 |
| User interaction | 없음 |
| 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 |
| Public | 2025년 8월 16일 |
| Upstream fix | 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 로컬 스토리지가 tail call을 넘어 범위를 벗어나 접근될 수 있음을 보고했습니다.
eBPF 검증기는 각 프로그램을 개별적으로 타입 검사합니다. 런타임에서 bpf_get_local_storage()는 현재 실행 중인 프로그램의 맵을 조회하지 않습니다. 대신 current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]에서 cgroup 스토리지 포인터를 읽습니다. 이 슬롯은 tail call로 진입한 프로그램이 아니라 원래 연결된 프로그램에 의해 채워집니다.
프로그램 A(작은 BPF_MAP_TYPE_CGROUP_STORAGE 값 크기)가 프로그램 B(큰 값 크기)를 tail call하면, 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[]를 추가하여 수정되었으며, 이로써 tail call 조합은 피호출자가 호출자와 동일한 cgroup 스토리지 맵을 사용하거나 아무것도 사용하지 않을 때만 허용됩니다.
이것은 로컬 커널 힙 범위 초과 접근입니다. 심각도 점수는 이 프리미티브가 "읽기 전용 DoS"인지 완전한 메모리 손상인지에 대한 의견 차이로 인해 벤더마다 다릅니다:
실제로 이것이 의미하는 바:
struct bpf_array)가 손상될 수 있습니다.map->ops 덮어쓰기, 헬퍼 하이재킹, commit_creds / 네임스페이스 전환). 이것이 이 트리가 해당 이슈를 LPE로 표기하는 이유입니다. Red Hat의 낮은 점수는 버그의 부재가 아니라 제품별 평가를 반영합니다.이 버그는 네트워크에 노출된 서비스를 필요로 하지 않습니다. 로컬입니다. TTY, setuid 헬퍼, 사용자 상호작용을 필요로 하지 않습니다.
각자 고유한 BPF_MAP_TYPE_CGROUP_STORAGE(공유 플레이버, BPF_CGROUP_STORAGE_SHARED)를 가진 두 개의 cgroup BPF 프로그램:
| 프로그램 | 역할 | 스토리지 값 크기 |
|---|---|---|
| A | 연결됨 / tail call 호출자 | 작음 (예: 주어진 kmalloc order에 맞음) |
| B | tail call 대상 | 큼 (검증기가 이 크기까지 접근을 허용) |
검증기는 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 스토리지를 할당합니다. 이 할당은 동일한 크기 클래스에서 최근에 해제된 다른 것들 옆의 커널 힙에 위치합니다 — 여기에는 value_size가 동일한 kmalloc order에 맞도록 선택된 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을 비교하지 말고 패키지 체인지로그 / 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[] 배열이 추가됩니다. tail call 대상 업데이트 시, 커널은 이제:
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, 또는 런타임에서 해당 caps 제거).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 | 높음 | C:H/I:H/A:H — 버그를 완전한 로컬 영향으로 취급 |
| NVD | 7.1 HIGH | 없음 | C:H/I:N/A:H — 기밀성 + 가용성 |
| Ubuntu | Medium (7.1) | — | USN-7909 |
| Red Hat | 4.0 LOW | 없음 | C:N/I:N/A:L — 제한적 가용성으로 평가 |
| Amazon Linux | 4.0 Medium | 없음 | Red Hat과 동일한 벡터 |
| SUSE | 6.1 Moderate | 없음 | 일부 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[]를 보유하는 런 컨텍스트 |