
Gitea diffpatch RCE (CVE-2026-60004) PoC - repo-write to RCE as Gitea service account
PoC d'exécution de code à distance sur le point d'accès diffpatch de Gitea. Un compte disposant des droits d'écriture sur un dépôt (simple inscription anonyme sur une instance à inscription ouverte) peut exécuter des commandes shell arbitraires sur le serveur sous le compte de service Gitea.
POST /api/v1/repos/{owner}/{repo}/diffpatch applique un correctif contrôlé par l'attaquant dans un clone temporaire bare partagé :
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
Chaîne d'attaque : soumettre deux fois le même correctif → conflit add/add → le repli de la fusion à trois points extrait (checkout) le chemin de l'index (même avec --cached) → dans un dépôt bare, root = $GIT_DIR, le hooks/post-index-change extrait (100755) devient un hook Git actif → Git l'exécute automatiquement lors de l'écriture de l'index → RCE.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3 activée)diffpatch est disponible# 设置账户密码
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| Paramètre | Description |
|---|---|
url | URL de base de Gitea |
username |
Dépendances : Python 3 + client git local.
Déroulement du PoC : authentification → création d'un dépôt privé initialisé → construction du correctif hooks/post-index-change → envoi deux fois de suite à diffpatch (déclenchement du conflit add/add) → Git exécute le hook → récupération de la sortie de la commande via Smart HTTP authentifié. Aucun rappel sortant, la sortie est renvoyée dans le canal (in-band).
À utiliser uniquement pour la recherche en sécurité, la validation de vulnérabilités et les tests défensifs. Ce PoC crée un dépôt sur l'instance cible, soumet un correctif et déclenche l'exécution de commandes côté serveur. À exécuter uniquement sur une instance de test que vous contrôlez, ne pas l'utiliser sur des environnements non autorisés ou de production.
| Nom d'utilisateur Gitea existant (disponibilité : inscription ouverte par défaut) |
command | Commande shell à exécuter sur la cible |
GITEA_PASSWORD | Mot de passe du compte (variable d'environnement, ou saisie interactive) |