
CVE-2026-43074를 사용하여 Android(Linux 6.6/6.12)에서 SELinux를 비활성화합니다
이 도구는 CVE-2026-43074 eventpoll UAF 익스플로잇에서 SELinux 비활성화 단계만 단독으로 추출한 것입니다. eventpoll 루프 깊이 검사(ep_get_upwards_depth_proc)에서 레이스 컨디션을 유발하여 selinux_state.enforcing에 0을 기록하고, 단일 바이트 커널 쓰기를 통해 기기를 Permissive 모드로 전환합니다. 이는 MAC 비활성화 프리미티브만 제공하며 권한 상승은 포함하지 않습니다.
[!WARNING] 커널 익스플로잇 개념 증명(PoC)입니다. 커널을 크래시시키거나 데이터를 손상시키거나 기기를 불안정한 상태로 만들 수 있습니다. 본인이 소유했거나 테스트 권한이 있는 기기에서만 실행하세요. 먼저 백업하세요.
NebuSec의 전체 PoC(소스 트리)에서 축소해 추출했습니다. UAF는 eventpoll 루프 깊이 검사(ep_get_upwards_depth_proc)에 있으며, RCU 보호 하에 epi->ep을 순회하는 동안 동시 스레드가 ep_free()로 struct eventpoll을 해제할 수 있습니다. 업스트림은 해제를 RCU 유예 기간(grace period) 이후로 지연시켜 수정했습니다(커밋 07712db8; NVD, OSV).
이것은 동일한 eventpoll 코드의 ep_remove()에서 발생하는 별도의 use-after-free인 "Bad Epoll"(CVE-2026-46242)과는 다릅니다. 여기서의 레이스는 구체적으로 07712db8에서 수정된 루프 깊이 검사의 수명(lifetime) 버그입니다.
kernel.org CNA(OSV/NVD 경유)에 따르면, 취약한 stable 커널 계열과 해당 수정은 다음과 같습니다:
6.4.0 – <6.6.136 (수정: 6.6.136)6.7.0 – <6.12.83 (수정: 6.12.83)6.13.0 – <6.18.24 (수정: 6.18.24)6.19.0 – <6.19.14 (수정: 6.19.14)고정된 대상 커널 6.6.118-android15-8은 영향을 받는 6.6 범위(수정: 6.6.136)에 속합니다. 업스트림 버전을 올리지 않고 수정 사항을 백포트한 벤더 커널은 취약하지 않습니다. uname -r 출력만 믿지 말고 실제 패치 적용 여부를 확인하세요.
정확히 하나의 빌드에 고정되어 있습니다 — enforcing 바이트는 하드코딩된 KVA 별칭(alias)을 통해 접근하며, 레이스는 해당 커널의 slab 레이아웃에 의존합니다:
6.6.118-android15-8-g53e6e091166e-ab15266607-4kgoogle/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keysTARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0다른 빌드를 대상으로 재설정하려면 src/target.h에서 별칭(selinux_state의 이미지 오프셋 + 매핑 베이스 + 로드 주소)을 다시 계산해야 합니다.
aarch64 clang 툴체인이 포함된 Android NDK가 필요합니다. 기본값은 NDK_ROOT=/opt/android-ndk, API=35입니다:
make # → build/disabler
필요하면 다음과 같이 재정의하세요:
make API=35 NDK_ROOT=/path/to/android-ndk
build/disabler를 기기로 푸시한 다음 shell 사용자(uid 2000)로 실행하세요. 시작 시 SELinux가 Enforcing 모드여야 하며, 그렇지 않으면 바이너리는 실행을 건너뜁니다. 성공 시:
SELINUX_AFTER Permissive
RESULT PASS selinux_zero attempt=N
getenforce → Permissive로 확인하세요.
원본 익스플로잇은 이 프리미티브 위에 파이프 버퍼 flags 리다이렉트(읽기 전용 page-cache 페이지에 DirtyPipe 방식으로 쓰기)를 추가하며, 이를 통해 /system/bin/dumpstate를 패치하여 루트 데몬을 실행합니다. 해당 단계들(pipe.c, patch.c, su.c, payloads.S, 원본 main.c 오케스트레이션)은 여기서 제외되었으며, late_refs.c는 zero-byte 리다이렉트 경로만 남도록 축소되었습니다. SELinux 비활성화만으로는 루트 권한이 부여되지 않습니다. MAC 시행(enforcement)만 제거하여 탑재 페이로드가 unconfined 상태로 실행될 수 있게 할 뿐입니다.