
Gitea diffpatch RCE (CVE-2026-60004) PoC - repo-write to RCE as Gitea service account
PoC di esecuzione remota di codice sull'endpoint diffpatch di Gitea. Un account con permessi di scrittura su un repository (su istanze con registrazione aperta è sufficiente una registrazione anonima) può eseguire comandi shell arbitrari sul server con l'account di servizio Gitea.
L'endpoint POST /api/v1/repos/{owner}/{repo}/diffpatch applica una patch controllata dall'attaccante in un clone temporaneo bare condiviso:
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
Catena d'attacco: invio della stessa patch due volte → conflitto add/add → il fallback della merge a tre vie fa il checkout del percorso dall'indice (anche con --cached) → nel repository bare root = $GIT_DIR, il hooks/post-index-change estratto (100755) diventa una hook Git attiva → Git la esegue automaticamente quando scrive l'indice → RCE.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3)diffpatch disponibile# 设置账户密码
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| Parametro | Descrizione |
|---|---|
url | URL di base di Gitea |
username |
Dipendenze: Python 3 + client git locale.
Flusso del PoC: autenticazione → creazione di un repository privato inizializzato → costruzione della patch hooks/post-index-change → invio due volte consecutive a diffpatch (innesco del conflitto add/add) → Git esegue la hook → recupero dell'output del comando tramite Smart HTTP autenticato. Nessuna callback in uscita, output restituito in-band.
Destinato esclusivamente a ricerca sulla sicurezza, verifica di vulnerabilità e test difensivi. Questo PoC crea repository, invia patch e innesca l'esecuzione di comandi lato server sull'istanza target: eseguirlo solo su istanze di test proprie, non utilizzarlo su ambienti non autorizzati o di produzione.
| Nome utente Gitea esistente (disponibilità: registrazione aperta di default) |
command | Comando shell da eseguire sul target |
GITEA_PASSWORD | Password dell'account (variabile d'ambiente o input interattivo) |