[단독공격] 분석 — CVE-2024-56631
CVE-2024-56631 is a local use‑after‑free in the SCSI generic driver’s sg_release() that allows an attacker with access to /dev/sg* to achieve kernel code execution, and applying the upstream patch or disabling the sg module is the top mitigation.
📋 요약
- 심각도 high · CVSS 7.8 · EPSS 0.00285 · 악용난이도 hard
🔍 공격 기법
- 전제 조건
- 로컬 사용자이며
/dev/sg*디바이스에open()권한이 있어야 함(보통root:disk혹은 660/640 등). CVSS 벡터 AV:L/AC:L/PR:L/UI:N와 일치.
- 로컬 사용자이며
- 공격 표면
/dev/sg*파일 열기·닫기(open()/close()) 및ioctl(fd, SG_IO, …)호출 시 내부에서sg_release()가 실행됨.
- 트리거 메커니즘 (레ース 조건)
- 두 개 이상의 스레드(또는 프로세스)가 동일 sg 디바이스를 동시에
open()한다. - 하나의 스레드가 I/O(
SG_IO) 수행 중인 상태에서 다른 스레드가 즉시close()를 호출해 파일 해제 흐름을 시작한다. sg_release()내부에서 kref_put(&sfp->f_ref, sg_remove_sfp) 가 뮤텍스open_rel_lock해제 전에 실행되면 레퍼런스 카운트가 0이 되고sg_remove_sfp_usercontext()가kmem_cache_free(sfp)로 구조체를 해제한다.- 이후 동일
sg_release()흐름에서 아직 잠금만 남아 있는 상태에서sfp혹은 연관된sdp를 참조하게 되어 slab‑use‑after‑free 가 발생한다.
- 두 개 이상의 스레드(또는 프로세스)가 동일 sg 디바이스를 동시에
- 메모리 재활용·코드 실행
- 해제된
sfp메모리가 커널의 다른 할당(kmalloc)에 재사용될 수 있는 시점을 공격자가 미리 준비한 사용자 데이터(조작된 함수 포인터 등)로 채워 놓는다. sg_release()가 해당 주소를 다시 참조하면 커널 흐름이 공격자 지정 코드로 전이되어 루트 권한을 획득한다.
- 해제된
- 단계 요약
- 정찰:
ls -l /dev/sg*로 존재·권한 확인,ioctl(fd, SG_GET_VERSION_NUM)로 드라이버 동작 검증. - 초기 접근: 다중 스레드로 동시에
open()후 I/O‑close 레이스 수행.
관측 지표 – 매우 짧은 간격(수 µs~ms)으로 연속close()호출이 감지되면 공격 시도 가능성 존재.
- 정찰:
- 난이도: 정확한 타이밍 제어가 필요하므로 hard 로 평가된다(EPSS 0.00285, percentile 0.20692). 다중 소스에서 일관성이 확인돼 보수적으로 높은 위험도를 채택했다.
악용 가능성: AV:L·AC:L·PR:L·UI:N 벡터에 따라 이 취약점은 로컬 환경에서 네트워크 접근 없이도 이용 가능하며, 공격을 수행하기 위한 복잡성은 낮고 특별한 사용자 상호작용이 필요하지 않습니다. 실제로는 /dev/sg* 같은 SCSI generic 문자 디바이스를 열어 두었다가 파일을 닫을 때 sg_release() 함수가 호출되면서 발생
💥 영향 분석
- 커널 메모리 손상 → OOPS 또는 임의 코드 실행 → 루트 쉘 획득.
- 시스템 전역 권한 상승 후 모듈 로드, 파일시스템 마운트 조작 등 추가 침투 단계 가능.
- 재부팅 없이 지속적인 권한 유지가 가능함.
🔗 관련 취약점·체이닝
- CWE‑416 (Use After Free) : 동일 메모리 해제 타이밍 오류는 다른 커널 서브시스템(예:
fbdev,netfilter)에서도 보고돼, 이들와 연계해 권한 상승 → 파일 시스템 탈취 → 원격 코드 실행 체인이 가능함. - 추정:
sg_release()로 얻은 루트 권한을 이용해 기존 로컬 권한 상승 취약점(CVE‑XXXX‑YYYY)이나 CAP_SYS_MODULE 획득 결함과 연계하면 영구적인 커널 모듈 적재가 가능할 수 있음(구체적 CVE 번호는 확인되지 않음).
🔎 탐지
- 커널 로그에
KASAN: slab-use-after-free혹은BUG: KASAN:와 함께sg_release+0x.../0x... drivers/scsi/sg.c:가 포함된 OOPS 발생. - auditd/eBPF 로
/dev/sg*에 대한 짧은 간격 연속open()→close()이벤트 감시. - ftrace 또는 perf 로
kmalloc/kfree급증과 동시에sg_release호출 스택이 포착될 경우 경고.
🛡️ 완화 방안
- 패치 적용: 커널 3.17 이상 최신 릴리즈에 포함된 upstream 패치를 배포하고,
sg_release()내부에서kref_put을 뮤텍스 해제 뒤로 이동한 커밋을 적용한다(다중 소스 일관성 확인). - 드라이버 비활성화: 필요 없을 경우
modprobe -r sg혹은/etc/modprobe.d/blacklist.conf에blacklist sg추가. - 접근 제한:
/dev/sg*파일 권한을0600 root로 설정하고, SELinux/AppArmor 정책으로 비특권 사용자 접근 차단. - 디버그·감시 활성화: CONFIG_DEBUG_SG_DISABLE 또는 KASAN을 커널 구성에 포함해 오류 발생 시 즉시 OOPS 로 알림; eBPF 기반 open/close 모니터링 규칙 적용.
- 임시 완화:
sysctl -w kernel.kptr_restrict=2로 커널 주소 노출 최소화 및 불필요한 SCSI 장치 마운트 해제.
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=7.8 · non-KEV · EPSS=0.00285 · exploit=hard · in_scope=None