
Gitea diffpatch RCE (CVE-2026-60004) PoC - リポジトリ書き込みからGiteaサービスアカウントとしてのRCEへ
Gitea diffpatch エンドポイントのリモートコード実行 PoC。リポジトリへの書き込み権限を持つアカウント(オープン登録インスタンスでは登録するだけ)があれば、サーバー上で Gitea サービスアカウントとして任意のシェルコマンドを実行できます。
POST /api/v1/repos/{owner}/{repo}/diffpatch は、共有の ベア一時クローンリポジトリに攻撃者が制御するパッチを適用します:
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
攻撃チェーン:同一パッチを2回適用 → add/add 競合 → 三方向マージのフォールバックによりインデックスパスが 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 三方向マージが有効)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 |
依存関係: Python 3 + ローカルの git クライアント。
PoC の流れ: 認証 → プライベート初期化リポジトリの作成 → hooks/post-index-change パッチの構築 → 2回連続で diffpatch に送信(add/add 競合を誘発)→ Git が hook を実行 → 認証付き Smart HTTP でコマンド出力を取得。外部へのコールバックはなし、出力はインバンドで返送されます。
セキュリティ研究、脆弱性の検証、防御的テストのみを目的としています。この PoC はターゲットインスタンス上にリポジトリを作成し、パッチを適用し、サーバー側のコマンド実行を引き起こします。必ず自前のテストインスタンスで実行してください。未承認の環境や本番環境では使用しないでください。
| ターゲット上で実行するシェルコマンド |
GITEA_PASSWORD | アカウントパスワード(環境変数、または対話入力) |