SOC Prime Bias: 높음

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 러너 바이너리를 지휘 제어(C2) 프레임워크로 전환하는 GitRunner C2라는 개념 증명을 설명합니다. 공격자가 러너를 Windows 서비스로 설치함으로써 임의의 PowerShell 명령을 실행하고 GitLab의 내장 인프라를 통해 데이터를 유출할 수 있습니다. 트래픽이 아웃바운드 HTTPS를 사용하기 때문에 gitlab.com로 이동하여 일반적인 개발자 통신에 쉽게 숨을 수 있습니다.

조사

연구자는 승격된 PowerShell 원라이너로 등록부터 시작하여 상호 명령 실행으로 끝나는 전체 공격 체인을 시연했습니다. 이 조사는 Sysmon과 PowerShell Operational 로그를 사용하여 프로세스 생성, 레지스트리 변경 및 Script Block Logging을 통한 실행된 명령을 기록하는 데 의존했습니다. 연구는 러너의 합법적인 동작이 전통적인 EDR과 네트워크 기반 탐지를 우회하는 데 도움이 될 수 있음을 보였습니다.

완화

방어자는 비정상적인 이름이나 비표준 파일 경로에서 시작된 새로 설치된 Windows 서비스를 주시해야 합니다. 러너를 통해 실행된 명령의 가시성을 위해 PowerShell Script Block Logging을 활성화하는 것이 필수적입니다. 조직은 서비스 설치 권한을 제한하고 개발 작업에 사용되지 않는 엔드포인트에서 GitLab으로의 의심스러운 아웃바운드 HTTPS 트래픽을 모니터링해야 합니다.

대응

이 활동이 감지되면 추가 지휘 및 제어 통신을 중지하기 위해 즉시 영향을 받은 엔드포인트를 격리하십시오. 타협된 환경과 연결된 모든 GitLab 개인 액세스 토큰과 러너 등록 토큰을 폐기하십시오. 수사관은 이후 PowerShell 로그와 Windows 이벤트 로그를 검토하여 실행된 명령의 범위와 결과적인 데이터 유출을 판단해야 합니다.

"flowchart TD step_ingress["T1105 u2013 도구 전송 침투: S3에서 PowerShell을 통해 합법적인 gitlab-runner-windows-amd64.exe 다운로드"] step_persistence["T1543.003 u2013 시스템 프로세스 생성 또는 수정: Windows 서비스: 지속성을 위해 GitLab 러너를 네이티브 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 명령 셸: 셸 실행자를 사용한 CI 변수로 명령 페이로드 실행"] step_c2["T1071 u2013 애플리케이션 레이어 프로토콜: 지휘 제어 중계로서 GitLab 인프라로의 HTTPS (포트 443) 사용"] step_exfiltration["T1567.001 u2013 웹 서비스 통한 유출: 코드 저장소로 유출: GitLab Artifacts 및 Generic Package Registry를 통해 파일 이동"] step_ingress –>|leads_to| step_persistence step_persistence –>|enables| step_trust_subversion step_persistence -.->|detected_by| rules_for_persistence step_trust_subversion –>|then| step_execution step_execution –>|uses| step_c2 step_c2 –>|leads_to| step_exfiltration "

공격 흐름

시뮬레이션 실행

전제조건: 텔레메트리 및 기준선 사전 점검을 통과해야 합니다.

이유: 이 섹션은 탐지 규칙을 트리거하도록 설계된 상대방의 기술 기법(TTP)을 정밀하게 실행하는 방법을 설명합니다. 명령과 서술은 식별된 TTP를 직접 반영하고 탐지 로직이 기대하는 정확한 텔레메트리를 생성하는 것을 목표로 해야 합니다. 추상적이거나 관련이 없는 예시는 오진으로 이어질 수 있습니다.

  • 공격 서사 및 명령: 상대방은 초기 접근을 획득하고 지속적인 지휘 제어(C2) 채널을 구축하려고 합니다. 알려진 악성코드를 사용하지 않고, 그들은 합법적인 gitlab-runner-windows-amd64.exe 를 다운로드해 DevOps 활동에 섞여 들어가려고 합니다. 그들은 PowerShell을 사용하여 파일을 임시 디렉토리에 내려받고 나서 “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)
    # ImagePath 탐지를 트리거하기 위해 레지스트리에 서비스 경로 생성.
    $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName"
    New-Item -Path $RegPath -Force | Out-Null
    Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath
    Write-Host "[+] 레지스트리 키와 ImagePath 생성: $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 "[+] 정리 완료."