
Gitea 1.27.1より前のバージョンでは、Gitフックのインストールを通じてdiffpatch APIを介したリモートコード実行が可能です。
[!WARNING] このリポジトリは、認可されたセキュリティ研究および管理されたラボ環境でのテストのみを目的としています。 所有していないシステム、または評価の明示的な許可を得ていないシステムに対して 概念実証を実行しないでください。
CVE-2026-60004 は、Gitea の diffpatch API における重大なリモートコード実行脆弱性です。 リポジトリの作成または書き込み権限を持つ認証済みユーザーは、細工されたパッチを送信することで、 一時的なベアリポジトリ内に実行可能な Git フックを生成させることができます。 フックがトリガーされると、攻撃者が制御するコマンドが Gitea サービスアカウントの権限で実行されます。
パブリック登録が有効になっている場合、未認証の攻撃者がアカウントを作成し、 脆弱な認証済みエンドポイントに到達できる可能性があります。
| 属性 | 詳細 |
|---|
| 識別子 | CVE-2026-60004 |
| アドバイザリ | GHSA-rcr6-4jqh-j84m |
| 深刻度 | 重大 — CVSS 3.1: 9.8 |
| 弱点 | CWE-94: コード生成の不適切な制御 |
| 影響を受けるバージョン | Gitea 1.17.0 から 1.27.0 |
| 修正バージョン | Gitea 1.27.1 |
| 必要なアクセス権 | リポジトリへの書き込みアクセス |
| 実行コンテキスト | Gitea のオペレーティングシステムアカウント |
| CISA KEV 登録日 | 2026-08-25 |
| ファイル | 説明 |
|---|---|
gitea_diffpatch_rce.py | 標準ライブラリのみを使用した概念実証。認証を行い、プライベートリポジトリを作成し、細工されたパッチを送信して、コマンド出力を取得します。 |
payload.patch | 実行可能な hooks/post-index-change フックを作成するパッチの例。 |
poc.png | ラボ検証中に取得されたスクリーンショット。 |
README.md | 元の研究ノート。 |
概念実証は、以下の分離された環境で検証されました:
| コンポーネント | 構成 |
|---|---|
| Gitea | 1.27.0 |
| Git | 2.47.2 |
| デプロイ | gitea-lab という名前の Docker コンテナ |
| サービスアドレス | 192.168.184.128:3000 |
| 確認された ID | uid=1000(git) gid=1000(git) |
悪用に成功すると、以下のようなコマンド出力が得られました:
uid=1000(git) gid=1000(git) groups=1000(git)
Linux 6.12.20-amd64 x86_64
/data/gitea/tmp/local-repo/upload.git630501597
[exit-status=0]

このスクリプトは Python の標準ライブラリのみを使用し、追加の パッケージを必要としません。
python3 gitea_diffpatch_rce.py <base_url> <username> <password> "<command>"
ローカルラボインスタンスでの例:
python3 gitea_diffpatch_rce.py \
http://127.0.0.1:3000 \
pocuser \
'P@ssw0rd!' \
'id; uname -a'
このスクリプトは最初に Web 登録を試み、次に指定された認証情報で認証を行います。 これにより、同じコマンドが、オープン登録が有効なインスタンスでの新規アカウント、 または既存のアカウントのいずれでも機能します。
悪用チェーンは 4 つの段階で構成されています:
攻撃者が制御するパッチの送信
POST /api/v1/repos/{owner}/{repo}/diffpatch は、一時クローン内で
git apply --index --recount --cached --binary --ignore-whitespace --whitespace=fix -3 を使用して、指定されたパッチ内容を適用します。
フックパスの配置
一時リポジトリは、ベアの共有クローンとして作成されます。ベアリポジトリでは、
リポジトリルートが $GIT_DIR でもあるため、パス hooks/post-index-change は
Git のアクティブなフックディレクトリ内に解決されます。
実行可能フックの生成
同じパッチが 2 回送信されます。2 回目の適用により add/add 競合が発生し、
3 ウェイフォールバックによって、--cached の使用にもかかわらず、パスが
モード 100755 でディスク上に生成されます。その後のインデックス更新により
post-index-change が呼び出され、注入されたシェルコードが Gitea サービス
アカウントとして実行されます。
Git ネイティブの出力取得
フックは objects/info/alternates を通じてオリジンリポジトリを特定し、
コマンド出力を Git ブロブとして保存し、ツリーとコミットを作成して、
refs/heads/output-leak を更新します。その後、概念実証は Gitea の raw-file API
を通じて結果を取得します。この手法では、対象からの直接的な外向き接続は
必要ありません。
悪用に成功すると、Gitea サービスアカウントの権限でコマンドが実行されます。 デプロイ構成によっては、攻撃者が以下にアクセスできる可能性があります:
app.ini およびデータベースの認証情報SECRET_KEY、INTERNAL_TOKEN、および LFS 関連のシークレットラボアカウントが app.ini への読み取りアクセス権を持つことが確認されました。
防御担当者は、以下のアーティファクトとリクエストパターンを調査する必要があります:
/api/v1/repos/*/*/diffpatch への、短時間での同一またはほぼ同一の
2 回のリクエストoutput-leak という名前のブランチpoc <[email protected]> によって作成されたコミットhooks/post-index-change
という名前の予期しない実行可能ファイル/data/gitea/tmp/local-repo/upload.git* などのパス配下の不審なアクティビティこれらの指標は、含まれている概念実証を説明するものであり、網羅的ではありません。 改変されたエクスプロイトは、異なるパス、ref、ID、または出力チャネルを使用する 可能性があります。
/api/v1/.../diffpatch ルートへのアクセスを拒否します。
デプロイ前に、正当な統合に対してルールを検証してください。DISABLE_REGISTRATION=true を設定します。これにより未認証での到達可能性は
減少しますが、リポジトリへの書き込みアクセス権を持つ既存ユーザーに対する
保護にはなりません。この研究で使用されたラボコンテナは、以下で破棄できます:
docker rm -f gitea-lab
この資料は、防御担当者が脆弱性を再現、理解、検出、および修復するのを支援する ために提供されています。運用担当者は、分離された環境でのみテストを行い、 組織の認可および開示要件に従ってください。