UNC7017, AOMEI 테크놀로지를 노리는 소프트웨어 공급망 공격
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
UNC7017은 AOMEI 기술 업데이트 인프라를 겨냥한 정교한 소프트웨어 공급망 캠페인을 수행했습니다. 위협 행위자는 구성 변조 창을 잠깐 사용하여 업데이트 요청을 악성 서버로 리디렉션하여 전통적인 시점 검사를 피했습니다. 캠페인은 CROSSROAD 다운로더와 SHINYROAD 백도어를 포함한 다단계 페이로드 체인을 전파했습니다.
조사
이 조사는 Mandiant Google 위협 인텔리전스 그룹(GTIG)과 ManageEngine 위협 분석 랩(METAL)에 의해 공동으로 수행되었습니다. 연구원들은 EDR 원격 측정을 통해 캠페인을 탐지하였으며, 적이 5분에서 10분 사이로 지속되는 단발적인 변조 창에 의존했음을 확인했습니다. 또한 분석은 클라우드 제공자에서 특정 벤더 테마 도메인과 합법적인 클라우드 스토리지로의 인프라 변화를 보여주었습니다.
대응책
벤더들은 모든 다운로드 실행 파일과 구성 파일에 대해 종단 간 암호 서명 검증을 강제해야 합니다. 조직은 업데이트 클라이언트를 위한 엄격한 목적지 고정을 구현하여 비인가 도메인으로의 리디렉션을 방지해야 합니다. 또한 앱 내 핸들러 내 URI 스키마 제한은 WebDAV 기반 NTLM 자격 증명 강요 공격을 방지할 수 있습니다.
대응
보안 팀은 2026년 4월부터 7월까지의 기간을 포괄하는 과거적 엔드포인트와 네트워크 사냥을 수행해야 합니다. 정식 서명이 없는 자식 프로세스가 합법적인 업데이트 실행기에서 시작되거나 비인가 네트워크 리디렉션의 징후를 모니터링하는 것이 우선되어야 합니다. 분석가는 벤더 호스팅 URL의 라이브 체크에만 의존하기보다는 로컬에 캐시된 엔드포인트 구성 파일을 검사해야 합니다.
공격 흐름
이 부분은 아직 업데이트 중입니다.
탐지
의심스러운 예약 작업 (감사 기준)
의심스러운 디렉터리에서의 가능한 Powershell 실행 프로세스 (cmdline 기준)
대체 원격 액세스 / 관리 소프트웨어 (process_creation 기준)
시도된 가능한 IP 조회 도메인 커뮤니케이션 (dns 기준)
탐지를 위한 IOC(HashSha256): 일시적인 공급망 변조 조사
탐지를 위한 IOC(SourceIP): 일시적인 공급망 변조 조사
탐지를 위한 IOC(DestinationIP): 일시적인 공급망 변조 조사
악의적인 AOMEI 소프트웨어 업데이트 리디렉션 감지 [프록시]
CROSSROAD와 SHINYROAD 악성코드 활동 감지 [Windows Sysmon]
SHINYROAD 캠페인을 위한 악성 DLL 및 임시 서비스 감지 [Windows 파일 이벤트]
모의 실행
-
공격 이야기와 명령: 상대방은 공급망 취약성을 통해 워크스테이션에 CROSSROAD 다운로더를 성공적으로 배포했습니다 (T1195.002). 백도어의 여러 인스턴스가 서로 간섭하거나 시스템 불안정을 초래하지 않도록, 악성코드는 특정 Mutex를 생성하려고 합니다. 공격자의 목표는 장기적인 명령 및 제어(C2)와 데이터 탈취를 위한 지속적인 백도어(T1547)를 설정하는 것입니다. 이 시뮬레이션은 탐지 규칙에서 식별된 동일한 전역 및 로컬 mutex 문자열을 생성하여 이 동작을 모방하는 PowerShell 스크립트를 실행할 것입니다.
-
회귀 테스트 스크립트:
# CROSSROAD/SHINYROAD Mutex 시뮬레이션 스크립트 # 이 스크립트는 탐지 규칙이 대상하는 특정 mutex의 생성을 시뮬레이트합니다. Write-Host "[*] Mutex 시뮬레이션 시작..." -ForegroundColor Cyan # 1. 전역 Mutex 시뮬레이션 (CROSSROAD) try { $globalMutexName = "GlobalF9E6E3C0-E11A-4F85-9944-AF4AD6E05883" Write-Host "[!] 전역 Mutex 생성 시도 중: $globalMutexName" -ForegroundColor Yellow $globalMutex = New-Object System.Threading.Mutex($true, $globalMutexName) Write-Host "[+] 전역 Mutex 생성 성공." -ForegroundColor Green } catch { Write-Error "[X] 전역 Mutex 생성 실패: $($_.Exception.Message)" } # 2. 로컬 Mutex 시뮬레이션 (SHINYROAD) try { $localMutexName = "Local963d3c60-d406-4ad6-aa1e-dc8e45061ccf" Write-Host "[!] 로컬 Mutex 생성 시도 중: $localMutexName" -ForegroundColor Yellow $localMutex = New-Object System.Threading.Mutex($true, $localMutexName) Write-Host "[+] 로컬 Mutex 생성 성공." -ForegroundColor Green } catch { Write-Error "[X] 로컬 Mutex 생성 실패: $($_.Exception.Message)" } Write-Host "[*] 텔레메트리 캡처를 보장하기 위해 Mutex 30초 유지 중..." -ForegroundColor Cyan Start-Sleep -Seconds 30 # 정리 (스크립트 종료 시 수동 해제되지만 명시적 해제가 더 좋음) if ($globalMutex) { $globalMutex.ReleaseMutex() } if ($localMutex) { $localMutex.ReleaseMutex() } Write-Host "[*] 시뮬레이션 완료." -ForegroundColor Cyan -
정리 명령:
# 스크립트가 중단된 경우 mutex 해제를 위해 실행합니다 # 참고: PowerShell에서는 프로세스가 종료되면 OS가 일반적으로 mutex를 정리합니다. # 이는 시뮬레이션 실행자를 위한 안전 조치입니다. Write-Host "[*] 정리 실행 중..." # 프로세스가 종료되면 특정 명령이 필요하지 않으나, 남은 핸들이 없도록 보장합니다.