
CVE-2026-52813 (Gogs Path Traversal → Git Hooks RCE) 防御的レポート: 根本原因 & パッチ解析、Sigma/SIEM検出ルール、IOC、非侵入型バージョンスキャナー。兵器化されたPoCはありません。
セキュリティ研究 / ブルーチーム向け writeup。本リポジトリは兵器化された PoC を含みません。 再現を希望する研究者は、公式 advisory が参照する公開 PoC をご利用ください。
| 項目 | 内容 |
|---|---|
| CVE | CVE-2026-52813 |
| エイリアス | GHSA-c39w-43gm-34h5 / GO-2026-5305 |
| 影響を受けるバージョン | Gogs < 0.14.3 |
| 修正バージョン | 0.14.3 — PR #8334 |
| CVSS 3.1 | 10.0 Critical AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CWE | CWE-23 相対パストラバーサル → RCE |
| 前提条件 | 通常の登録アカウント(デフォルトで登録が開放されている場合 = 未承認 RCE) |
Gogs は組織作成時に、Web フォームでは AlphaDashDot 文字検証で / をブロックしますが、REST API POST /api/v1/user/orgs ではブロックしません。攻撃者は API を使用して ../ を含む組織名を送信し、検証をバイパスして os.MkdirAll(repoutil.UserPath(org.Name), 0777)(internal/database/org.go:165)に到達し、リポジトリディレクトリを任意のファイルシステムパスに書き込みます。Gogs の Web エディタの一時作業ツリー(local-r/<repo_id>/)と組み合わせることで、別のリポジトリのローカルチェックアウト内に悪意のある hooks/update を配置し、git によって自動実行 → git ユーザとして RCE が発生します。
| Gogs バージョン | ステータス |
|---|---|
< 0.14.3 | 影響あり、ただちにアップグレード |
>= 0.14.3 | 修正済み |
アップグレードが唯一の完全な修正手段です:
# Docker
docker pull gogs/gogs:0.14.3
# またはソースコード
git checkout v0.14.3 && go build
一時的な緩和策(アップグレードできない場合):
app.ini → [service] DISABLE_REGISTRATION = true)、これにより前提条件が「未承認」から「既存アカウントが必要」に引き下げられます;POST /api/v1/user/orgs、POST /api/v1/org/*/repos のリクエストボディ内の username / name フィールドに .. または / が含まれるものをブロック(詳細は detection/ を参照);/data/gogs/data/tmp/ 以外への書き込み権限を制限(selinux/apparmor)。Web フォーム(internal/form/org.go、v0.14.2):
type CreateOrg struct {
OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)"` // 正規表現 ^[a-zA-Z0-9._-]+$
}
API(internal/route/api/v1/org/org.go、v0.14.2):
// api.CreateOrgOption (go-gogs-client) のバインディングタグ:
type CreateOrgOption struct {
UserName string `json:"username" binding:"Required"` // ← AlphaDashDot がない!
}
→ POST /api/v1/user/orgs の username フィールドは任意の文字を DB 層にそのまま通すことができます。
internal/database/users.go:1532 の isNameAllowed は予約名や接頭辞/接尾辞(例:admin、-bot)のみブロックし、文字セットを検証しないため、../ が通過します。
internal/repoutil/repoutil.go(v0.14.2):
func UserPath(user string) string {
return filepath.Join(conf.Repository.Root, strings.ToLower(user)) // ← 直接結合
}
internal/database/org.go:165:
os.MkdirAll(repoutil.UserPath(org.Name), os.ModePerm) // org.Name に ../ が含まれる → 任意のパスに書き込み
Gogs は Web/API のファイル編集を処理する際、リポジトリを /data/gogs/data/tmp/local-r/<repo_id>/ にチェックアウトします。<repo_id> はリポジトリのデータベース id と一致します。攻撃者は:
writer を作成し、id == n を取得;username = "../../../../data/gogs/data/tmp/local-r/n/nested" を作成 → 物理ディレクトリが writer の作業ツリー内に配置される;rce-x を作成 → local-r/n/nested/rce-x.git に配置される;writer をクローンし、nested/rce-x.git/hooks/update を通常のファイルとしてコミットして push(これにより writer の作業ツリー内に配置される);writer のファイル操作をトリガー → Gogs が local-r/n/ で git を実行 → git が hooks/update を実行 → RCE。重要:悪意のあるフックは通常のリポジトリ内容として通常の push で侵入するため、
ENABLE_GIT_HOOKS設定は不要です——これが「従来の git hooks 悪用」の手法との違いです。
詳細なパッチ diff 分析は patch/ANALYSIS.md を参照。
完全なルールは detection/ にあります:
../ を含む API リクエスト)と悪用成功(ファイルシステムへの配置)をカバー最も重要な 2 つ:
POST /api/v1/user/orgs および POST /api/v1/org/*/repos の JSON ボディ内の username/name フィールドに .. または / が含まれる場合。/data/gogs/data/tmp/local-r/*/ 配下に予期しないサブディレクトリ(nested/、rce-*.git、hooks/update)が存在する場合。GET /api/v1/version で Gogs インスタンスが < 0.14.3 かどうかを確認し、バッチスキャン、CSV 出力に対応。資産棚卸しに適しています。本リポジトリは兵器化された悪用ツールを提供しません。再現には 公式 advisory が参照する公開 PoC を使用し、隔離された環境でのみ行ってください。
detection/ のルールは影響を受ける Gogs で検証する必要があります。lab/docker-compose.yml は隔離された Gogs 0.14.2 環境を提供し、ブルーチームが検知ルールのヒットテストを行うことができます。インターネットに公開せず、ローカルのみで使用してください。
| 日付 | イベント |
|---|---|
| 2026-06-08 | CVE 予約 |
| 2026-06-24 | 公開開示、Gogs 0.14.3 リリース |
| 2026-06-24 | 公式 advisory GHSA-c39w-43gm-34h5 公開 |
この CVE を "Gogs gitrebase パラメータインジェクション リモートコード実行" と説明している情報がネット上にありますが、それは誤りです。本脆弱性は git rebase / gitrebase とは関係なく、根本原因は API のパストラバーサルです。本ドキュメントは実際の脆弱性に基づいて分析しています。
MIT — LICENSE を参照。