
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"인지 완전한 메모리 손상인지에 대한 의견 차이로 인해 벤더마다 다릅니다:
| 출처 | 점수 | 무결성 | 비고 |
|---|---|---|---|
| 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로 표시됨 |
실제로 이것이 의미하는 바:
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 이전의 모든 커널
| 시리즈 | 영향받음 | 최초 수정 |
|---|---|---|
| 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을 비교하지 말고 패키지 체인지로그 / 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입니다.
호스트가 영향받는 버전과 일치하더라도 여전히 도달 가능하지 않을 수 있습니다. 유용한 확인 사항: