
Gitea diffpatch RCE (CVE-2026-60004) PoC - repo-write to RCE as Gitea service account
Gitea diffpatch 엔드포인트 원격 코드 실행 PoC. 저장소 쓰기 권한이 있는 계정(공개 등록 인스턴스에서는 가입만 하면 됨)이면 서버에서 Gitea 서비스 계정으로 임의의 shell 명령을 실행할 수 있습니다.
POST /api/v1/repos/{owner}/{repo}/diffpatch는 공유된 bare 임시 클론 저장소에서 공격자가 제어하는 패치를 적용합니다:
git apply --index --recount --cached --binary # Git ≥ 2.32에서는 -3 3-way 병합 폴백 추가
공격 체인: 동일한 패치를 두 번 제출 → add/add 충돌 → 3-way 병합 폴백이 인덱스 경로를 checkout(--cached가 있어도) → bare 저장소에서는 root = $GIT_DIR이므로 checkout된 hooks/post-index-change(100755)가 활성 Git hook이 됨 → Git이 인덱스를 쓸 때 자동 실행 → RCE.
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3 3-way 병합 활성화)diffpatch 엔드포인트 사용 가능# 계정 비밀번호 설정
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| 매개변수 | 설명 |
|---|---|
url | Gitea 기본 URL |
username | 기존 Gitea 사용자 이름(가용성: 기본적으로 공개 등록) |
command | 대상에서 실행할 shell 명령 |
의존성: Python 3 + 로컬 git 클라이언트.
PoC 흐름: 인증 → 비공개 초기화 저장소 생성 → hooks/post-index-change 패치 구성 → diffpatch에 연속 두 번 전달(add/add 충돌 트리거) → Git이 hook 실행 → 인증된 Smart HTTP로 명령 출력 회수. 아웃바운드 콜백 없음, 출력은 인밴드로 반환.
보안 연구, 취약점 검증 및 방어적 테스트 전용입니다. 이 PoC는 대상 인스턴스에 저장소를 생성하고 패치를 커밋하며 서버 측 명령 실행을 트리거하므로, 직접 구축한 테스트 인스턴스에서 실행하시고, 무단 또는 프로덕션 환경에서는 사용하지 마십시오.
GITEA_PASSWORD | 계정 비밀번호(환경 변수 또는 대화형 입력) |