[단독공격] 분석 — CVE-2025-21655
Linux kernel io_uring eventfd RCU misuse allows local privilege escalation; patch immediately and monitor for anomalous RCU callbacks.
📋 요약
- 심각도 high · CVSS 7.8 · EPSS 0.00246 · 악용난이도 hard
🔍 공격 기법
-
공격 전제
- 대상 시스템이 Linux kernel 6.1‑6.12.10 중 하나이며,
io_uring와eventfd를 지원하는 커널 설정이어야 함. (다중 소스에서 일관성이 확인됐다) - 공격자는 로컬 사용자 권한(Low privilege)만 보유하고 있어도 충분함. CVSS 벡터 AV:L/AC:L/PR:L/UI:N와 직접 일치.
- 대상 시스템이 Linux kernel 6.1‑6.12.10 중 하나이며,
-
표면 매핑
- 노출 엔드포인트:
io_uring_setup,io_uring_register(EVENTFD),io_uring_submit시스템 콜. - 주요 파라미터:
IORING_SETUP_SQSIZE,IORING_REGISTER_EVENTFD,IORING_OP_NOP등에서 전달되는 파일 디스크립터와 이벤트 플래그.
- 노출 엔드포인트:
-
공격 단계
- 정찰 –
uname -r로 커널 버전 확인,/proc/sys/kernel/unprivileged_userns_clone등으로 io_uring 사용 가능 여부 판단. - 초기 접근 – 일반 사용자 권한으로 악성 프로그램을 실행 (예: 스크립트·바이너리).
- 트리거 –
eventfd()로 이벤트 파일 디스크립터를 생성하고, 이를io_uring_register_eventfd로 io_uring 인스턴스에 등록.- 의도적으로
close(eventfd)를 호출해 레퍼런스 카운트를 0 으로 만든 뒤, RCU 콜백(io_eventfd_do_signal)이 실행될 때까지 대기(예:synchronize_rcu()활용). - 이 시점에 커널은 아직 자유되지 않은
io_ev_fd구조체를 바로io_eventfd_free()로 해제하게 되며, 메모리 사용 후 해제가 발생한다.
- 권한 상승 – Use‑After‑Free 를 이용해 커널 힙/스택에 임의 주소 쓰기 →
modprobe_path혹은cred->uid등을 덮어써 루트 권한 획득. - 지속 – 성공적인 특권 상승 후, 영구적인 rootkit 모듈 로드 또는
/etc/cron.d에 악성 스크립트 삽입.
- 정찰 –
-
원리 요약 – RCU 콜백 내부에서 레퍼런스가 0 일 때 바로
io_eventfd_free()를 호출하도록 구현된 점을,io_eventfd_put()로 교체해 RCU grace period를 추가해야 하는 요구사항을 무시함. 이로 인해 RCU‑timing race 가 발생하고, 커널 메모리 해제 타이밍을 조작해 임의 코드 실행이 가능함.
악용 가능성: 이 취약점은 AV:L(로컬)·AC:L(낮은 복잡도)·PR:L(저권한)·UI:N(사용자 개입 없음)이라는 CVSS 벡터가 의미하듯, 로컬에서 실행되는 프로세스가 단순히 io_uring 인터페이스를 통해 이벤트 fd 를 생성하고 해제하도록 유도하면 추가적인 조건 없이 공격이 진행될 수 있습니다. 실제로는 io_eventfd_do_signal() 함수가 RCU 콜백 안에서 호출되는데, 레퍼런스 카운트가 0이 될 경우 즉시 io_eventfd_free() 를 수행하는 로직이 RCU grace period 를 한 번 더 연기해야 할 부분을 누락하고 있어, 이 시점에 메모리 해제가 일어나면 커널 내부 구조가 손상됩니다. 공격자는 동일한 프로세스 내에서 이벤트 fd 의 생성·해제 순서를 조작하거나, 다수의 io_uring 요청을 빠르게 제출해 레이스 상황을 만들면 충분히 트리거할 수 있으므로 “난이도 hard”로 평가된 것이 실제 로컬 권한 확보 후 비교적 쉬운 단계임을 반영합니다. EPSS 0.00246이라는 값은 현재 관측된 악용 시도가 매우 적지만 존재한다는 점을 보여 주며, KEV에 등재되지 않은 이유는 아직 광범위하게 확산되지는 않았기 때문입니다. 공격 표면은 io_uring 시스템 콜(예: io_uring_register, io_uring_enter)과 이벤트 fd 를 다루는 내부 함수들로 제한되며, 외부 네트워크나 사용자 인터페이스와 직접 연결되지 않으므로 로컬 권한이 없는 원격 공격자는 이용할 수 없습니다. 따라서 방어자는 이 경로가 로컬 프로세스에 의해 호출될 가능성을 염두에 두고, 해당 커널
💥 영향 분석
- 성공 시 공격자는 커널 수준 루트 권한을 획득한다.
- 시스템 전체 파일·프로세스 접근, 보안 모듈 우회, 네트워크 트래픽 탈취 등 전면적인 침해가 발생한다.
- 다른 프로세스와 공유되는
io_uring인스턴스를 통해 다중 사용자 환경에서도 동일한 효과를 얻을 수 있다.
🔗 관련 취약점·체이닝
- 동일한 RCU‑Grace‑Period 오용 패턴은 과거
CVE-2022-0847(Dirty Pipe)와 유사하게 메모리 해제 시점을 조작해 사용자→커널 권한 상승을 가능하게 한다. - CWE‑416 (Use After Free) 와 결합된 CWE‑362 (Race Condition) 가 핵심 체이닝 포인트이며, 다른 로컬 권한 상승 취약점(예:
CVE-2021-4034– PwnKit)과 연계하면 초기 접근 없이도 루트 획득 경로가 확대될 수 있다. - 현재 확인된 추가 CVE는 없으며, 추정: 동일 커널 버전에서 RCU 관련 다른 객체 해제 로직이 존재한다면 유사한 공격 체인이 구성될 가능성이 있다.
🔎 탐지
dmesg/kernel 로그에 “use after free”, “rcu: detected stall” 혹은io_eventfd와 연관된BUG:메시지가 기록되는 경우.perf top -e rcu_*로 RCU 콜백 빈도 급증 감지.- 감사 시스템(e.g., auditd)에서
io_uring_register·io_uring_enter호출이 비정상적으로 짧은 시간에 다수 발생하면 경보 생성.
🛡️ 완화 방안
- 패치 적용: 배포판 제공 최신 커널(6.1.126 이상, 6.2‑6.6.73 이상, 6.7‑6.12.11 이상)으로 업데이트한다([교차검증] 다중 소스에서 일관성 확인).
- 임시 방어:
io_uring사용을 금지하거나eventfd옵션 없이IORING_SETUP_SQPOLL등 대체 메커니즘으로 전환한다. - 보호 강화:
CONFIG_DEBUG_RCU와CONFIG_KASAN을 활성화해 RCU 관련 메모리 오류를 조기에 탐지한다. - 운영 정책: 로컬 사용자에게
io_uring권한을 제한하고, SELinux/AppArmor 프로파일에io_uring시스템 콜 감시 규칙을 추가한다.
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=7.8 · non-KEV · EPSS=0.00246 · exploit=hard · in_scope=None