
PoC RCE diffpatch di Gitea (CVE-2026-60004) - da repo-write a RCE come account di servizio Gitea
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) |