SOC Prime Bias: High

30 Jun 2026 06:21 UTC

GitLab CIランナーをコマンド&コントロールフレームワークとして悪用する

Author Photo
SOC Prime Team linkedin icon フォローする
GitLab CIランナーをコマンド&コントロールフレームワークとして悪用する
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

この記事では、GitLab CI ランナーバイナリをコマンドアンドコントロールフレームワークに変えるGitRunner C2という概念実証を説明しています。ランナーをWindowsサービスとしてインストールすることで、攻撃者は任意のPowerShellコマンドを実行し、GitLabの組み込みインフラを通じてデータを漏洩させることができます。このトラフィックがアウトバウンドのHTTPSを使用するため、 gitlab.comとの通信と容易に混ざり合い、通常の開発者の通信として偽装できます。

調査

研究者は、エレベーテッドPowerShellワンライナーでの登録から対話型コマンド実行までの攻撃チェーン全体を実証しました。この調査は、SysmonおよびPowerShell Operationsログを使用して、プロセスの作成、レジストリの変更、およびスクリプトブロックロギングを介して実行されたコマンドを記録しました。研究では、ランナーの正当な動作が従来のEDRおよびネットワークベースの検出を回避するのに役立つことが示されました。

緩和策

防御者は、異常な名前を持つ新たにインストールされたWindowsサービスや標準でないファイルパスから開始されたサービスを監視する必要があります。PowerShellスクリプトブロックロギングを有効にすることは、ランナーを介して実行されるコマンドの可視性に不可欠です。組織はサービスをインストールできる人を制限し、開発作業に使用されていないエンドポイントからのGitLabへの疑わしいアウトバウンドHTTPSトラフィックをモニタリングするべきです。

対応策

この活動が検出された場合、さらなるコマンドアンドコントロール通信を阻止するために、影響を受けたエンドポイントを直ちに隔離してください。GitLabの個人アクセスおよびランナー登録トークンも取り消してください。調査員は、その後、PowerShellログとWindowsイベントログを確認して、実行されたコマンドの範囲や結果として生じたデータ漏洩を特定する必要があります。

"フローチャート TD step_ingress["T1105 u2013 イングレストランスファー: PowerShellを介してS3から合法的なgitlab-runner-windows-amd64.exeをダウンロード"] step_persistence["T1543.003 u2013 システムプロセスの作成または変更: Windowsサービス: 永続性のためにGitLabランナーをネイティブのWindowsサービスとしてインストール"] rules_for_persistence("<b>ルール名</b>: 疑わしいサービスバイナリパス (via system)<br/><b>ルールID</b>: 780e6396-d9f4-42b2-8d73-89918e2dab16") step_trust_subversion["T1553.002 u2013 信頼コントロールの覆し: コードサイニング: デジタル署名済みのGitLabバイナリを使用して検出を回避"] step_execution["T1059.003 u2013 コマンドおよびスクリプトインタプリタ: Windowsコマンドシェル: 長距離の変数を使用してCIを介したコマンドペイロードの実行"] step_c2["T1071 u2013 アプリケーションレイヤープロトコル: GitLabインフラストラクチャをC2リレーとしてHTTPS (ポート443) を使用"] step_exfiltration["T1567.001 u2013 ウェブサービスを介した漏洩: コードリポジトリへの漏洩: GitLabアーティファクトとジェネリックパッケージレジストリを介してファイルを移動"] step_ingress –>|リード| step_persistence step_persistence –>|有効化| step_trust_subversion step_persistence -.->|検出| rules_for_persistence step_trust_subversion –>|その後| step_execution step_execution –>|使用| step_c2 step_c2 –>|リード| step_exfiltration "

攻撃フロー

検出

隠れたPowerShellコマンドライン経由での実行の可能性 (via cmdline)

SOC Prime チーム
2026年6月29日

GitRunner C2実行の可能性 (via powershell)

SOC Prime チーム
2026年6月29日

スケジュールされたタスク作成の可能性 (via powershell)

SOC Prime チーム
2026年6月29日

PowerShellを使用したスケジュールされたタスク作成の可能性 (via powershell)

SOC Prime チーム
2026年6月29日

希少なプロセスによるサービスイメージの操作 (via registry_event)

SOC Prime チーム
2026年6月29日

疑わしいサービスバイナリパス (via system)

SOC Prime チーム
2026年6月29日

GitLab ランナーの潜在的な悪用を示すPowerShellスクリプトブロックのログ記録 [Windows Powershell]

SOC Prime AI ルール
2026年6月29日

GitLab ランナーサービスの回避のためのPowerShell [Windows Sysmon]

SOC Prime AI ルール
2026年6月29日

シミュレーション実行

前提条件: テレメトリーとベースラインの事前フライトチェックが合格している必要があります。

理論: このセクションでは、検出ルールを引き起こすために設計された敵対者手法 (TTP) の正確な実行を詳述します。コマンドと記事は、特定されたTTPを直接反映し、検出論理によって期待される正確なテレメトリーを生成することを目的としています。抽象的または無関係な例は誤診を招くでしょう。

  • 攻撃のストーリーとコマンド: 敵対者が初期アクセスを獲得し、持続的なコマンドアンドコントロール (C2) チャネルを確立することを意図しています。既知のマルウェアを使用する代わりに、合法的な gitlab-runner-windows-amd64.exe をダウンロードしてDevOpsアクティビティに自然に溶け込むようにします。彼らはこのファイルを一時ディレクトリにドロップし、”gitlab-runner”という名前のWindowsサービスとして登録します。この手法は、CI/CDツールの信頼された特性を利用して、従来のセキュリティ監査を回避することを目的としています。

  • リグレッションテストスクリプト:

    # 検出検証のためのGitLabランナーのインストールのシミュレーション
    $ErrorActionPreference = "Stop"
    
    # 1. 検出論理にぴったりと一致するパスと名前を定義
    $TargetDir = "C:WindowsTemp"
    $BinaryName = "gitlab-runner-windows-amd64.exe"
    $BinaryPath = Join-Path $TargetDir $BinaryName
    $ServiceName = "gitlab-runner"
    
    Write-Host "[+] シミュレーション開始: $BinaryName のインストール"
    
    # 2. ファイル作成のシミュレーション (Sysmon イベントID 11)
    # 実際の攻撃ではウェブダウンロードがこれに当たります。ここでは特定の名前でダミーファイルを作成します。
    New-Item -Path $BinaryPath -ItemType File -Force | Out-Null
    Write-Host "[+] ファイルを作成: $BinaryPath (イベントID 11をトリガー)"
    
    # 3. レジストリサービスインストールのシミュレーション (Sysmon イベントID 13)
    # 検出のためのイメージパスをトリガーするためにレジストリにサービスパスを作成します。
    $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName"
    New-Item -Path $RegPath -Force | Out-Null
    Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath
    Write-Host "[+] レジストリキーとイメージパスを作成: $RegPath (イベントID 13をトリガー)"
    
    Write-Host "[+] シミュレーション完了。SIEMでのアラートをチェック。"
  • クリーンアップコマンド:

    # シミュレーションアーティファクトのクリーンアップ
    $TargetDir = "C:WindowsTemp"
    $BinaryName = "gitlab-runner-windows-amd64.exe"
    $BinaryPath = Join-Path $TargetDir $BinaryName
    $ServiceName = "gitlab-runner"
    
    Remove-Item -Path $BinaryPath -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "HKLM:SYSTEMCurrentControlSetServices$ServiceName" -Recurse -Force -ErrorAction SilentlyContinue
    Write-Host "[+] クリーンアップ完了。"