Translated ['', 'src/pentesting-ci-cd/gitblit-security/README.md', 'src/

This commit is contained in:
Translator
2025-09-04 23:49:43 +00:00
parent 11abf8adf2
commit 2084a16093
4 changed files with 140 additions and 140 deletions

View File

@@ -4,7 +4,7 @@
## Gitblit とは
GitblitJavaで書かれた自己ホスト型のGitサーバーです。スタンドアロンのJARとして実行するか、サーブレットコンテナ内で動作させることができ、Git over SSH用の組み込みSSHサービスApache MINA SSHDを同梱しています。
GitblitJava で書かれたセルフホスト型の Git サーバーです。スタンドアロンの JAR として、または servlet containers 内で動作し、Git over SSH 用の組み込み SSH サービス (Apache MINA SSHD) を同梱しています。
## トピック

View File

@@ -4,34 +4,34 @@
## 概要
CVE-2024-28080 は、Apache MINA SSHD と統合する際のセッション状態ハンドリングの誤りに起因する、Gitblit の組み込み SSH サービスにおける認証バイパスです。ユーザーアカウントに少なくとも 1 つの SSH public key が登録されている場合、攻撃者が該当ユーザーの username とその public key のいずれかを知っていれば、private key password なしで認証できます。
CVE-2024-28080 は、Gitblit の embedded SSH サービスにおける認証バイパスで、Apache MINA SSHD と統合する際の session state の誤った取り扱いが原因です。ユーザーアカウントに少なくとも1つの SSH public key が登録されている場合、攻撃者が username とそのユーザーの public key のいずれかを知っていれば、private key password も不要で認証できます。
- 影響を受けるバージョン: Gitblit < 1.10.0 (1.9.3 で確認)
- 修正バージョン: 1.10.0
- 悪用に必要な条件:
- インスタンスで Git over SSH が有効になっていること
- 被害者アカウントに少なくとも 1 つの SSH public key が Gitblit に登録されていること
- 攻撃者が被害者の username とその public key のいずれかを知っていること(公開されていることが多い、例: https://github.com/<username>.keys
- Affected: Gitblit < 1.10.0 (observed on 1.9.3)
- Fixed: 1.10.0
- Requirements to exploit:
- Git over SSH enabled on the instance
- Victim account has at least one SSH public key registered in Gitblit
- Attacker knows victim username and one of their public keys (often discoverable, e.g., https://github.com/<username>.keys)
## 根本原因 (state leaks between SSH methods)
RFC 4252 によればpublickey authentication は 2 段階で進行します: サーバは最初に提示された public key が username に対して受け入れ可能かをチェックし、クライアントが署名で応答した後にユーザーを認証します。MINA SSHD では、PublickeyAuthenticator が 2 回呼ばれます: key acceptanceまだ署名なし)時と、クライアントが署名を返した後です。
RFC 4252 によれば publickey authentication は2段階で進行します: サーバはまず提供された public key が username に対して受け入れられるかをチェックし、その後 challenge/response による signature が検証されて初めてユーザーを認証します。MINA SSHD では、PublickeyAuthenticator が2回呼ばれます: key acceptanceまだ signature なし)時と、クライアントが後で signature を返した後の時です。
Gitblit の PublickeyAuthenticator は、署名前の最初の呼び出しでセッションコンテキストを変更し、UserModel をセッションにバインドして true"key acceptable")を返していました。後に認証が password にフォールバックした、PasswordAuthenticator はその変更されたセッション状態を信頼して処理をスキップし、password 検証なしに true を返しました。その結果、同じユーザーに対して publickey "acceptance" が先に起きていれば、任意の password(空も含む)が受け入れられてしまいました。
Gitblit の PublickeyAuthenticator は最初の、presignature 呼び出しで session context を変更し、認証された UserModel を session にバインドして true"key acceptable")を返しました。認証が後で password にフォールバックしたとき、PasswordAuthenticator はその変更された session state を信頼して短絡し、password 検証せずに true を返しました。その結果、同じユーザーに対する事前の publickey "acceptance" の後は、空を含む任意の password が受け入れられることになりました。
高レベルの欠陥の流れ:
Highlevel flawed flow:
1) クライアントが username + public key を提示(まだ署名なし
2) サーバその key がユーザーに属すると認識し、ユーザーをセッションに早期に紐付けして true"acceptable"を返す
1) クライアントが username + public key を提示するno signature yet
2) サーバその key がユーザーに属すると認識し、ユーザーを session に早期に紐付けして true を返す"acceptable"
3) クライアントは署名できないprivate key がない)ため、認証は password にフォールバックする
4) PasswordAuthenticator はセッションに既にユーザーが存在するのを検出し、無条件に成功を返す
4) Password auth は既に session にユーザーが存在するのを見て無条件に成功を返す
## ステップごとの悪用
## ステップバイステップの悪用
- 被害者の username とその public key の 1 つを収集する:
- GitHub は公開鍵を https://github.com/<username>.keys で公開している
- 公開サーバはしばしば authorized_keys を公開している
- OpenSSH を設定して public half のみを提示するようにし、署名生成を失敗させることで password へのフォールバックを強制しつつ、サーバ側では publickey acceptance パスをトリガーさせ
- 被害者の username とその public key の1つを収集する:
- GitHub は public keys を https://github.com/<username>.keys で公開している
- 公開サーバはしばしば authorized_keys を公開している
- OpenSSH を設定して public half のみを提示し、signature の生成を失敗させることで、サーバ側 publickey acceptance パスをトリガーしたまま password へのフォールバックを強制す
Example SSH client config (no private key available):
```sshconfig
@@ -44,56 +44,56 @@ PreferredAuthentications publickey,password
IdentitiesOnly yes
IdentityFile ~/.ssh/victim.pub # public half only (no private key present)
```
接続し、パスワードプロンプトで Enter キーを押してください(または任意の文字列を入力してください:
接続し、パスワードプロンプトでEnterキーを押(または任意の文字列を入力):
```bash
ssh gitblit-target
# or Git over SSH
GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://<victim-username>@<host>/<repo.git>
```
認証が成功するのは、前段の publickey フェーズがセッションを認証済みユーザーに変mutatedしてしまい、password auth がその状態を誤って信頼するためです。
認証が成功するのは、先行する publickey フェーズがセッションを認証済みユーザーに変異させ、その状態を password auth が誤って信頼してしまうためです。
Note: If ControlMaster multiplexing is enabled in your SSH config, subsequent Git commands may reuse the authenticated connection, increasing impact.
注意: SSH 設定で ControlMaster multiplexing が有効な場合、後続の Git コマンドが認証済みの接続を再利用し、影響が拡大する可能性があります。
## Impact
## 影響
- 少なくとも1つの登録された SSH public key を持つ任意の Gitblit ユーザーの完全なりすまし
- 被害者の権限に応じたリポジトリへの読み書きアクセス(source exfiltration、unauthorized pushes、supplychain risks
- admin ユーザーを狙った場合管理者権限に対する影響の可能性
- 純粋なネットワーク脆弱性brute force も private key も不要
- 少なくとも1つの登録済み SSH public key を持つ任意の Gitblit ユーザーの完全なりすまし
- 被害者の権限に応じたリポジトリへの読み書きアクセス(ソースの持ち出し、無許可の pushes、サプライチェーンリスク
- 管理者ユーザーを標的にした場合管理上の影響の可能性
- 純粋なネットワーク脆弱性; ブルートフォースや秘密鍵は不要
## Detection ideas
## 検出のアイデア
- SSH ログを確認し、publickey 試行の後に空または非常に短いパスワードで成功した password authentication が続くようなシーケンスを探す
- フローを探す: publickey method がサポート外/不一致のキー素材を提示した、同じユーザー名に対して即座に password が成功する流れ
- publickey 試行の後に空または非常に短いパスワードで成功した password 認証が続くような一連の記録を探して SSH ログを確認する
- publickey method がサポートされない/不一致の鍵材料を提示した直後に、同じユーザー名 password が即座に成功するフローを探す
## Mitigations
## 緩和策
- Upgrade to Gitblit v1.10.0+
- Until upgraded:
- Disable Git over SSH on Gitblit, or
- Restrict network access to the SSH service, and
- Monitor for suspicious patterns described above
- Rotate affected user credentials if compromise is suspected
- Gitblit v1.10.0+ にアップグレードする
- アップグレードまでの間:
- Gitblit 上での Git over SSH を無効にする、または
- SSH サービスへのネットワークアクセスを制限する、および
- 上記のような疑わしいパターンを監視する
- 侵害が疑われる場合は対象ユーザーの資格情報をローテーションする
## General: abusing SSH auth method stateleakage (MINA/OpenSSHbased services)
## 一般: abusing SSH auth method stateleakage (MINA/OpenSSHbased services)
Pattern: If a servers publickey authenticator mutates user/session state during the presignature "key acceptable" phase and other authenticators (e.g., password) trust that state, you can bypass authentication by:
パターン: サーバーの publickey authenticator presignature "key acceptable" フェーズ中にユーザー/セッション状態を変異させ、他の authenticators(例: password)がその状態を信頼してしまう場合、次の方法で認証をバイパスできます:
- 対象ユーザーの正当な public key を提示する(private key は不要)
- クライアント署名を失敗させてサーバ password にフォールバックするようにす
- password authenticator が leaked state によりショートサーキットする間に任意の password を供給する
- 対象ユーザーの正当な public key を提示する(秘密鍵は不要)
- クライアント署名を失敗させてサーバーを password にフォールバックさせ
- password authenticator が leaked state によって短絡する間に任意のパスワードを供給する
Practical tips:
実用的なヒント:
- Public key harvesting at scale: pull public keys from common sources such as https://github.com/<username>.keys, organizational directories, team pages, leaked authorized_keys
- Forcing signature failure (clientside): point IdentityFile to only the .pub, set IdentitiesOnly yes, keep PreferredAuthentications to include publickey then password
- MINA SSHD integration pitfalls:
- PublickeyAuthenticator.authenticate(...) must not attach user/session state until the postsignature verification path confirms the signature
- PasswordAuthenticator.authenticate(...) must not infer success from any state mutated during a prior, incomplete authentication method
- Public key を大規模に収集する: https://github.com/<username>.keys、組織のディレクトリ、チームページ、leaked authorized_keys などの一般的なソースから public key を取得する
- 署名失敗を強制する(クライアント側): IdentityFile を .pub のみに向け、IdentitiesOnly yes を設定し、PreferredAuthentications publickey password を含めたままにする
- MINA SSHD 統合の落とし穴:
- PublickeyAuthenticator.authenticate(...) は postsignature の検証経路が署名を確認するまでユーザー/セッション状態を付加してはならない
- PasswordAuthenticator.authenticate(...) は、前の未完了の認証メソッド中に変異した状態から成功を推測してはならない
Related protocol/design notes and literature:
関連するプロトコル/設計メモと文献:
- SSH userauth protocol: RFC 4252 (publickey method is a twostage process)
- Historical discussions on early acceptance oracles and auth races, e.g., CVE201620012 disputes around OpenSSH behavior
- 早期受理オラクルや認証レースに関する歴史的議論(例: OpenSSH の挙動を巡る CVE201620012 の論争)
## References