[단독공격] 분석 — CVE-2025-21745
The blk‑cgroup reference‑count leak in Linux kernels 5.9–6.13.3 can be locally triggered by unprivileged processes to cause kernel resource exhaustion, and the recommended immediate mitigation is to apply the upstream patch or upgrade to a fixed kernel version.
📋 요약
- 심각도 medium · CVSS 5.5 · EPSS 0.00227 · 악용난이도 hard
🔍 공격 기법
- 공격 표면: blk‑cgroup 서브시스템이 노출하는
/sys/fs/cgroup/blkio/*및blkcg_fill_root_iostats()를 호출할 수 있는 커널 인터페이스(예:cgroup.procs에 프로세스 추가,io.stat읽기) - 트리거 조건: 로컬에서 권한 PR:L (일반 사용자)인 상태로 반복적인 blk‑cgroup 통계 조회 또는 블록 디바이스 추가/삭제 작업을 수행하면
blkcg_fill_root_iostats()가class_dev_iter_exit()를 호출하지 않아 서브시스템 refcount가 누수됨. - 공격 단계
- 정찰 –
/sys/fs/cgroup/blkio/디렉터리 구조와 현재 블록 클래스(@block_class)에 연결된 디바이스 목록을 확인한다. (ls /sys/fs/cgroup/blkio/*) - 초기 접근 – 일반 사용자 권한으로 cgroup에 프로세스를 배치하고
cat io.stat혹은echo … > io.max와 같이 통계 수집 API를 호출한다. - 실행·권한 획득 – 동일 요청을 고속 루프(예:
while true; do cat /sys/fs/cgroup/blkio/io.stat; done) 로 반복 실행해blkcg_fill_root_iostats()가 매번 누수를 일으키게 만든다. - 지속 – 시스템 재부팅 없이 지속적인 루프를 유지하면 서브시스템 refcount가 결국 커널 메모리 고갈(또는 OOM) 상태에 도달한다.
- 영향 – 커널이 더 이상 블록 디바이스를 관리할 수 없어 전체 시스템이 멈추거나, 최악의 경우 커널 패닉으로 서비스 거부가 발생한다.
- 정찰 –
- CVSS 벡터와 실제 조건 매핑: AV:L(로컬), AC:L(낮은 복잡도 – 단순 루프), PR:L(일반 사용자), UI:N(사용자 인터랙션 없음) → 공격자는 별도의 권한 상승 없이 바로 실행 가능.
- 탐지 지표: 커널 로그에
refcount_leak경고가 출력되거나,/proc/sys/kernel/printk에서 “leaked reference count” 메시지가 반복적으로 나타날 경우; 또한/proc/meminfo의Slab항목이 비정상적으로 증가한다.
악용 가능성: 이 취약은 로컬 환경에서만 발동되며(AV:L), 공격 절차가 단순하고 복잡한 우회가 필요 없으므로 복잡도는 낮지만(AC:L) 실제 악용을 위해서는 동일 사용자 권한(LPR)으로 커널 모듈이나 특권이 없는 프로세스가 실행돼야 하므로 난이도가 “hard”로 평가됩니다. EPSS 0.00227이라는 매우 낮은 실측 확률과 KEV에 등재되지 않은 점은 현재까지 실제 공격 사례가 거의 없으며, 이론적 위험도와는 별개로 현장에서 악용될 가능성이 제한적임을 의미합니다. 공격 표면은 blk‑cgroup 서브시스템의 blkcg_fill_root_iostats() 함수와 그 내부에서 호출되는 class_dev_iter_* 루틴이며, 블록 디바이스를 추가·삭제하거나 cgroup 경로를 열어 해당 함수를 강제 실행시키는 것이 트리거 조건입니다. 로컬 사용자는 /sys/fs/cgroup/blkio/... 같은 파일시스템을 통해 블록 클래스에 접근할 수 있으므로, 해당 엔드포인트가 노출된 시스템에서는 악성 사용자 공간 코드가 커널 호출을 유도해 레퍼런스 카운트 누수를 일으킬 수 있습니다. 누수 자체는 권한 상승이나 원격 침투를 직접 제공하지 않지만, 지속적인 메모리/객체 소모로 커널 안정성을 저하시켜 서비스 거부(DoS) 상황을 만들 가능성이 존재합니다. 따라서 공격 난이도는 “hard”이며, 실제 악용 가능성은 낮지만 로컬 권한을 가진 사용자가 블록 cgroup 인터페이스를 조작할 수 있는 환경에서는 주의가 필요합니다.
💥 영향 분석
- 서비스 거부: 누적된 refcount 로 인해 블록 서브시스템이 메모리 부족 상태에 빠져 전체 시스템이 멈출 수 있다.
- 간접적인 권한 상승 가능성: 커널 패닉 후 재부팅 시 부트 파라미터를 조작할 기회가 생길 경우, 공격자는 추가적인 특권을 획득할 여지가 존재한다(추정).
🔗 관련 취약점·체이닝
- 유형: 리소스 누수(CWE‑404) → 서비스 거부(DoS).
- 가능한 체인: 동일 커널 버전에서 다른 cgroup 계열 메모리/CPU 제한 우회 취약점(CVE‑2024‑xxxx 등, 존재 여부는 확인 필요)과 결합하면, 리소스 고갈 후 권한 상승을 위한 커널 힙 스프레이가 가능할 수 있다(추정).
- 공격 흐름 예시: blk‑cgroup refcount 누수 → OOM 발생 → 시스템 재부팅 시 부트 파라미터 수정 → 루트 쉘 획득.
🔎 탐지
- 커널 로그(
dmesg)에 “leaked reference count for block_class” 혹은class_dev_iter_exit미호출 경고가 반복적으로 기록되는지 모니터링. /proc/meminfo의Slab(특히kmalloc‑*) 사용량이 비정상적으로 급증하는 패턴을 실시간으로 감시.- 감사 시스템(auditd)에서
sys_open/sys_read가/sys/fs/cgroup/blkio/io.stat파일에 대한 고빈도 접근을 기록하도록 규칙 추가.
🛡️ 완화 방안
- 즉시 조치: 영향을 받는 커널(5.9‑6.13.3)에서
git checkout혹은 배포판 제공 패치를 적용하여blkcg_fill_root_iostats()가class_dev_iter_exit()를 호출하도록 수정된 커밋을 설치한다. - 근본 해결: 최신 LTS 커널(예: 6.13.4 이상)으로 업그레이드하거나, 배포판 보안 업데이트를 정기적으로 적용한다.
- 보조 방어: cgroup v2 를 사용 중이라면 blk‑io 컨트롤러 접근을 제한(
cgroup.subtree_control에서blkio비활성화)하고, 불필요한 블록 디바이스 노출을 최소화한다.
⚖️ 위험도 / 우선순위
- 조치: monitor (모니터링)
- 근거: CVSS=5.5 · non-KEV · EPSS=0.00227 · exploit=hard · in_scope=None