SOC Prime Bias: Висока

30 Jun 2026 06:21 UTC

Зловживання GitLab CI Runners як командно-контрольної інфраструктури

Author Photo
SOC Prime Team linkedin icon Стежити
Зловживання GitLab CI Runners як командно-контрольної інфраструктури
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Резюме

Стаття описує прототип під назвою GitRunner C2, який перетворює легітимні, цифрово підписані бінарні файли GitLab CI runner на рамкову систему командно-контроль (C2). Встановлюючи виконавців як служби Windows, зловмисник може виконувати довільні команди PowerShell і ексфільтрувати дані через вбудовану інфраструктуру GitLab. Оскільки трафік використовує вихідний HTTPS на gitlab.com, активність може змішатися зі звичайними комунікаціями розробників.

Розслідування

Дослідник продемонстрував повний ланцюг атаки, починаючи із запису через підвищену PowerShell однолінійну команду і завершуючи інтерактивним виконанням команд. Розслідування покладалося на журнали Sysmon і PowerShell Operational для фіксації створення процесів, змін реєстру та виконаних команд через Script Block Logging. Дослідження показало, що легітимна поведінка runner’а може допомогти уникнути традиційних EDR та на мережеву детекцію.

Запобігання

Захищаючі мають стежити за ново встановленими службами Windows з незвичними назвами або службами, запущеними з нестандартних шляхів файлів. Увімкнення PowerShell Script Block Logging є необхідним для видимості команд, виконаних через runner. Організації також мають обмежити осіб, які можуть встановлювати служби, та відслідковувати підозрілий вихідний HTTPS трафік до GitLab з кінцевих точок, які не використовуються для розробки.

Відповідь

Якщо ця активність виявлена, негайно ізолюйте уражену кінцеву точку, щоб зупинити подальшу командно-контрольну комунікацію. Відкличте всі Персональні Доступні Токени GitLab і токени реєстрації runner’а, пов’язані з компрометованим середовищем. Дослідники мають потім переглянути журнали PowerShell і журнали подій Windows, щоб визначити обсяг виконаних команд і будь-яку результативну ексфільтрацію даних.

"flowchart TD step_ingress["T1105 u2013 Трансфер інструментів: Завантаження легітимного gitlab-runner-windows-amd64.exe через PowerShell із S3"] step_persistence["T1543.003 u2013 Створення або зміна системного процесу: Служба Windows: Встановлення GitLab runner як рідної служби Windows для збереження"] rules_for_persistence("<b>Назва правила</b>: Підозрілий шлях до службового бінарного файлу (через систему)<br/><b>ID правила</b>: 780e6396-d9f4-42b2-8d73-89918e2dab16") step_trust_subversion["T1553.002 u2013 Підрив управління довірою: Підписання коду: Використання цифрово підписаного бінарного файлу GitLab для уникнення виявлення"] step_execution["T1059.003 u2013 Командний і скриптовий інтерпретатор: Windows Command Shell: Виконання командних корисних навантажень через змінні CI, використовуючи ejecutor shell"] step_c2["T1071 u2013 Протокол прикладного рівня: Використання HTTPS (порт 443) для інфраструктури GitLab як ретранслятора C2"] 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 "

Потік атаки

Виконання симуляції

Попередня умова: Повинна бути пройдена телеметрія та перевірка бази.

Обґрунтування: У цьому розділі детально описується точне виконання техніки противника (TTP), розробленої для спрацьовування правила виявлення. Команди та наратив МАЮТЬ безпосередньо відображати ідентифіковані тактики, методи та процедури і бути спрямованими на створення точної телеметрії, яку очікує логіка виявлення. Абстрактні або непов’язані приклади призведуть до помилкової діагностики.

  • Атакований наратив і команди: Противник отримав початковий доступ і має намір встановити стійкий канал командного і контрольного управління (C2). Замість використання відомого шкідливого ПЗ, вони завантажують легітимний gitlab-runner-windows-amd64.exe , щоб змішатися з активністю DevOps. Вони використовують PowerShell, щоб скинути файл у тимчасову директорію, а потім зареєструвати його як службу Windows з назвою “gitlab-runner”. Цей метод спрямований на експлуатацію довіреного характеру інструментів CI/CD для обходу традиційної перевірки безпеки.

  • Скрипт регресійного тесту:

    # Симуляція встановлення GitLab Runner для перевірки виявлення
    $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 (спрацьовує Event ID 11)"
    
    # 3. Симуляція встановлення реєстру служби (ідентифікатор події Sysmon ID 13)
    # Створення шляху до служби в реєстрі для виклику виявлення ImagePath.
    $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName"
    New-Item -Path $RegPath -Force | Out-Null
    Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath
    Write-Host "[+] Створено ключ реєстру та ImagePath: $RegPath (спрацьовує Event 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 "[+] Очищення завершено."