
CVE-2025-38352에 대한 Android 커널 익스플로잇, 이전에 실제 환경에서 악용됨. 취약한 x86_64 Linux 커널 v5.10.x를 대상으로 합니다.
Chronomaly는 CVE-2025-38352를 사용하는 Android/Linux 커널 익스플로잇입니다. 이 익스플로잇은 Linux 커널 v5.10.157용으로 특별히 작성되었지만, 특정 커널 텍스트 오프셋을 필요로 하지 않기 때문에 취약한 모든 v5.10.x 커널에서 작동해야 합니다.
이 취약점에 대해 PoC부터 익스플로잇까지 상세히 다룬 세 부분으로 구성된 블로그 포스트 시리즈를 작성했습니다:

이 익스플로잇은 QEMU에서 실행되는 x86_64 Linux 커널 v5.10.157에서만 테스트되었습니다. 친구에게 자신의 Pixel 6a 커널 구성을 보내달라고 요청하여 제 커널 구성의 기반으로 삼았으며, 다음은 이 익스플로잇에 중요한 구성 옵션들입니다(커널CTF 구성을 베이스로 시작했습니다):
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=nCONFIG_PREEMPT=y (Full Preemption, no RT)CONFIG_SLAB_MERGE_DEFAULT=nDEBUG_LIST=nBUG_ON_DATA_CORRUPTION=nLIST_HARDENED=nCONFIG_POSIX_CPU_TIMERS_TASK_WORK를 비활성화하려면 제 첫 번째 블로그 포스트 여기에 설명된 단계를 따를 수 있습니다.
QEMU 실행 스크립트는 qemu.sh 파일을 참조하세요. 테스트에는 4코어와 3GB RAM을 사용했습니다.
익스플로잇이 CPU 타이머에 의존하기 때문에, 환경에 맞게 변경해야 할 두 가지 매개변수가 있습니다.
CPU_USAGE_THRESHOLD이 매개변수는 race_func() 내에서 타이머를 발생시키기 위해 CPU 시간을 소비할 때 사용됩니다. 다음과 같이 설정해야 합니다:
CPU_USAGE_THRESHOLD가 너무 높아 타이머가 race_func() 스레드가 종료되기 전에 발생함을 의미합니다).타이머가 발생하는지 여부를 확인하려면 free_func()의 SIGUSR1 폴링 코드에 printf() 문을 삽입하세요. 메시지가 출력되면 타이머가 발생한 것입니다.
올바르게 설정되면 터미널에 "Parent raced too late / too early" 메시지가 나타나기 시작합니다.
PARENT_SETTIME_DELAY_USPARENT_SETTIME_DELAY_US. 이 매개변수는 부모 프로세스가 자식 프로세스와 동시에 send_sigqueue() 내의 두 번째 레이스 윈도우를 맞추기 위해 사용됩니다. 익스플로잇을 실행하고 관찰한 후 다음과 같이 수정하세요:
이상적으로는 "raced too late"와 "raced too early"가 모두 출력되는 것을 보고 싶을 것이며, 익스플로잇은 1분 이내에 작동합니다. 하나만 다른 것보다 더 자주 발생하는 경우 그에 맞게 조정하세요.
제 크로스 캐시 구현에서는 커널이 너무 바쁘지 않고, struct sigqueue 할당이 많지 않다고 가정했습니다. sigqueue_crosscache_preallocs()에 이 부분을 개선하기 위해 필요한 내용을 설명하는 주석을 추가했습니다.
커널이 실제로 바쁘거나, per-cpu/per-node 부분 리스트에 이미 일부 struct sigqueue 슬랩 페이지가 있는 경우, exploit.c의 현재 크로스 캐시 구현은 실패하며, uaf_sigqueue/realloc_sigqueue가 파이프 버퍼 데이터 페이지로 재할당되지 않습니다.
저는 의도적으로 크로스 캐시가 바쁜 커널에서 작동하지 않도록 선택했습니다. 이는 익스플로잇이 오용되는 것을 방지하기 위해서입니다 :)
질문이 있으시면 X/Twitter를 통해 연락 주세요!