SOC Prime Bias: Alto

30 Jun 2026 06:21 UTC

Abusare dei Runner CI di GitLab come framework di Comando e Controllo

Author Photo
SOC Prime Team linkedin icon Segui
Abusare dei Runner CI di GitLab come framework di Comando e Controllo
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Sommario

L’articolo descrive un proof of concept denominato GitRunner C2 che trasforma i binari del runner GitLab CI legittimi e firmati digitalmente in un framework di comando e controllo. Installando i runner come servizi Windows, un attaccante può eseguire comandi PowerShell arbitrari e esfiltrare dati attraverso l’infrastruttura integrata di GitLab. Poiché il traffico utilizza HTTPS in uscita verso gitlab.com, l’attività può confondersi con le normali comunicazioni degli sviluppatori.

Indagine

Il ricercatore ha dimostrato l’intera catena di attacco, iniziando con l’iscrizione tramite un one-liner PowerShell elevato e terminando con l’esecuzione interattiva dei comandi. L’indagine si è basata sui registri Sysmon e PowerShell Operational per registrare la creazione dei processi, i cambiamenti al registro e i comandi eseguiti tramite Script Block Logging. Lo studio ha mostrato che il comportamento legittimo del runner può aiutare a eludere i tradizionali rilevamenti basati su EDR e rete.

Mitigazione

I difensori dovrebbero monitorare i nuovi servizi Windows installati con nomi insoliti o servizi avviati da percorsi file non standard. Abilitare il PowerShell Script Block Logging è essenziale per la visibilità sui comandi eseguiti tramite il runner. Le organizzazioni dovrebbero anche limitare chi può installare servizi e monitorare il traffico HTTPS in uscita sospetto verso GitLab da endpoint che non sono utilizzati per il lavoro di sviluppo.

Risposta

Se viene rilevata questa attività, isolare immediatamente l’endpoint interessato per fermare ulteriori comunicazioni di comando e controllo. Revocare qualsiasi GitLab Personal Access Tokens e token di registrazione runner collegati all’ambiente compromesso. Gli investigatori dovrebbero quindi esaminare i registri PowerShell e Windows Event Logs per determinare l’estensione dei comandi eseguiti e di qualsiasi esfiltrazione di dati risultante.

"flowchart TD step_ingress["T1105 u2013 Trasferimento di Strumenti di Ingresso: Download del legittimo gitlab-runner-windows-amd64.exe via PowerShell da S3"] step_persistence["T1543.003 u2013 Creare o Modificare un Processo di Sistema: Servizio Windows: Installazione del runner di GitLab come servizio nativo Windows per persistenza"] rules_for_persistence("<b>Nome Regola</b>: Percorso del Binario del Servizio Sospetto (via sistema)<br/><b>ID Regola</b>: 780e6396-d9f4-42b2-8d73-89918e2dab16") step_trust_subversion["T1553.002 u2013 Sovvertire i Controlli di Fiducia: Firma del Codice: Uso del binario firmato digitalmente di GitLab per eludere il rilevamento"] step_execution["T1059.003 u2013 Interprete di Comandi e Script: Shell dei Comandi Windows: Esecuzione di payload di comandi tramite variabili di CI usando l’executor shell"] step_c2["T1071 u2013 Protocollo di Livello Applicazione: Uso di HTTPS (porta 443) verso infrastruttura GitLab come relè C2"] step_exfiltration["T1567.001 u2013 Esfiltrazione Tramite Servizio Web: Esfiltrazione verso Repository di Codice: Trasferimento di file tramite Artifacts e Registro Pacchetti Generico di GitLab"] step_ingress –>|porta_a| step_persistence step_persistence –>|abilita| step_trust_subversion step_persistence -.->|rilevato_da| rules_for_persistence step_trust_subversion –>|poi| step_execution step_execution –>|usa| step_c2 step_c2 –>|porta_a| step_exfiltration "

Flusso di Attacco

Esecuzione della Simulazione

Prerequisito: Il Controllo Preliminare di Telemetria e Baseline deve essere superato.

Ragione: Questa sezione descrive l’esecuzione precisa della tecnica avversaria (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente le TTP identificate e mirare a generare la telemetria esatta prevista dalla logica di rilevamento. Esempi astratti o non correlati porteranno a una diagnosi errata.

  • Narrativa dell’Attacco e Comandi: Un avversario ha ottenuto accesso iniziale e intende stabilire un canale di Comando e Controllo (C2) persistente. Invece di utilizzare malware noto, scaricano il legittimo gitlab-runner-windows-amd64.exe per confondersi con l’attività DevOps. Usano PowerShell per piazzare il file in una directory temporanea e poi lo registrano come Servizio Windows chiamato “gitlab-runner”. Questo metodo mira a sfruttare la natura fiduciosa degli strumenti CI/CD per bypassare il controllo di sicurezza tradizionale.

  • Script di Test di Regressione:

    # Simulazione di Installazione di GitLab Runner per convalida del rilevamento
    $ErrorActionPreference = "Stop"
    
    # 1. Definire percorsi e nomi per corrispondere esattamente alla logica del rilevamento
    $TargetDir = "C:WindowsTemp"
    $BinaryName = "gitlab-runner-windows-amd64.exe"
    $BinaryPath = Join-Path $TargetDir $BinaryName
    $ServiceName = "gitlab-runner"
    
    Write-Host "[+] Inizio Simulazione: Installazione di $BinaryName"
    
    # 2. Simulare Creazione File (Evento Sysmon ID 11)
    # In un vero attacco, questo sarebbe un download web. Qui creiamo un file fittizio con il nome specifico.
    New-Item -Path $BinaryPath -ItemType File -Force | Out-Null
    Write-Host "[+] Creato file: $BinaryPath (Attiva Evento ID 11)"
    
    # 3. Simulare Installazione Servizio nel Registro (Evento Sysmon ID 13)
    # Creazione del percorso del servizio nel registro per attivare il rilevamento ImagePath.
    $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName"
    New-Item -Path $RegPath -Force | Out-Null
    Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath
    Write-Host "[+] Creato chiave di registro e ImagePath: $RegPath (Attiva Evento ID 13)"
    
    Write-Host "[+] Simulazione Completa. Controllare SIEM per avvisi."
  • Comandi di Pulizia:

    # Pulizia dei reperti di simulazione
    $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 "[+] Pulizia completata."