본문 바로가기
분석 정보/악성코드 분석 정보

해커조직 TeamPCP, LiteLLM PyPI에 악성코드 삽입

by TACHYON & ISARC 2026. 4. 21.

2025년 하반기부터 활동이 관찰된 TeamPCP는 클라우드 환경을 주요 표적으로 삼아 공급망 공격을 수행하는 해킹조직으로 기업이 신뢰하는 보안 도구 및 개발 라이브러리를 악용해 악성코드를 유포하는 특징을 보인다. 2025 12월에는 노출된 Docker Kubernetes API Redis 서버를 공격하고 피해 시스템을 프록시 네트워크 및 암호화폐 채굴 인프라로 악용하는 클라우드 인프라 하이재킹 공격이 확인됐다. 이후 2026 3월에는 Aqua Security trivy-action 저장소를 대상으로 한 공급망 공격을 수행해 1만 개 이상의 CI/CD 파이프라인에서 AWS Azure API 키가 유출됐다. 또한 같은 달에는 탈취한 자격 증명을 활용해 npm 생태계에 자가 증식형 웜(CanisterWorm)을 배포하고 짧은 시간 내 다수의 패키지를 감염시켰다. 추가로 TeamPCP Trivy CI/CD 공급망 공격 과정에서 확보한 PyPI 퍼블리싱 토큰으로 AI 라이브러리 LiteLLM PyPI 패키지에 악성코드를 삽입하는 추가적인 공급망 공격을 수행했다.

해당 악성코드는 LiteLLM v1.82.7 버전의 proxy_server.py 파일에 Base64로 난독화된 코드 형태로 삽입됐으며 GitHub 소스에는 존재하지 않고 프로젝트 패키징 및 배포하는 과정인 wheel 빌드 과정에서 주입된 것이 특징이다. 이 악성코드는 사용자가 proxy 패키지를 import하는 시점에 자동으로 실행되며 프록시 서버를 구동하거나 관련 모듈을 참조하는 것만으로도 악성 동작을 수행한다. 이후 v1.82.8 버전에서는 proxy_server.py 파일과 함께 litellm_init.pth 파일이 포함돼 Python 인터프리터 실행 시 import 없이도 악성코드가 자동 실행된다. 두 파이썬 코드 내에 추가된 악성코드는 Base64로 여러 인코딩된 구조이며 실행 단계에서는 파일리스 방식으로 동작하고 추가 페이로드를 디코딩 및 실행해 정보 수집 결과를 압축 및 암호화한 뒤 공격자의 C&C 서버로 전송한다. 정보 탈취 이후에는 Kubernetes 노드에 백도어를 설치한 뒤 공격자의 C&C 서버 주소를 계속 바꾸며 통신을 시도한다.

 

 

이 악성코드는 Base64로 인코딩된 페이로드와 이를 디코딩하는 코드가 한 줄로 구성돼 있으며 이후 여러 페이로드가 Base64로 인코딩돼 존재한다. 그 중 아래 [그림 1]은 정보 수집 동작을 수행하는 페이로드의 디코딩 결과 일부이며 정보 수집을 수행하기 이전에 파일 읽기와 조건 탐색 등의 기본 함수 등을 정의하며 공격자가 원하는 파일과 데이터를 수집한다.

 

[그림 1] 정보 수집 사전 정의 함수

 

클라우드 자격 증명 탈취

AWS (Amazon Web Services)

로컬에 저장된 AWS의 자격 증명과 환경설정 파일을 확인해 AWS 계정 정보를 확보하고 실행 중인 인스턴스의 정보를 조회할 수 있는 EC2 IMDS(Instance Metadata Service) curl 요청을 보내며 설정값과 환경 변수 값을 수집한다.

 

[그림 2] 로컬 환경 AWS 자격증명 수집

 

로컬 환경에서의 AWS 자격 증명을 수집한 후로는 AWS SigV4 인증 알고리즘을 직접 구현해 보안 탐지를 우회하며 AWS Secret Manager에서 AccessKey Token을 비롯해 모든 암호 목록을 조회할 수 있는 ListSecret 값과 키 복호화에 사용되는 GetSecretValue 값을 수집한다.

 

[그림 3] AWS 내부 자격증명 데이터 수집

 

GCP (Google Cloud Platform) Azure

시스템 내의 GCP(Google Cloud Platform) 관련 경로를 탐색하며 자격 증명 파일과 환경 변수에서 서비스 계정의 정보를 수집한다. 같은 방식으로 Azure 관련 경로도 탐색해 CLI 토큰값과 프로필 정보 등을 수집하고 환경 변수를 확인한다.

 

[그림 4] GCP 및 Azure 자격증명 탈취

 

Kubernetes

Kubernetes 대상으로도 로컬에 저장된 설정 및 관리자 파일을 확인하고 실행 중인 컨테이너의 Pod 계정 정보를 수집한다. 이후 확보한 계정 정보를 이용해 Kubernetes API 서버와 통신하며 실행 중인 네임스페이스의 데이터베이스 비밀번호와 TLS 개인 키 및 타 서비스 API 키 등을 수집한다.

 

[그림 5] Kubernetes 설정값 확인

 

[그림 6] Kubernetes 시크릿 수집

 

이 밖에도 [ 1]과 같이 CI/CD 파이프라인 파일과 암호화폐 지갑 및 데이터베이스 관련 경로를 탐색해 설정값과 환경 변수에 저장된 자격 증명과 개인 키 등을 함께 수집한다.

 

[표 1] 정보 수집 대상

 

정보 수집 과정에서 확보한 데이터는 tpcp.tar.gz 파일로 압축해 저장하고 AES-256-CBC로 암호화한 뒤 사용한 대칭키를 다시 RSA-4096-OAEP로 암호화한다. 암호화가 완료된 압축 파일은 LiteLLM API 서비스로 사칭한 공격자의 C&C 서버 주소로 전송해 정상적인 API 트래픽처럼 위장하며 탐지를 회피한다.

 

[그림 7] 정보 수집 결과 압축 및 암호화

 

백도어 실행

정보 수집하는 코드에는 Base64로 인코딩된 백도어 페이로드와 이를 Kubernetes 노드에 설치하는 코드가 포함돼 있다. 백도어 설치 코드에는 Kubernetes API로 노드 목록을 조회한 뒤 각 노드에 접근 제약이 없는 Privileged Pod를 생성해 노드의 루트 파일 시스템에 접근한다. Pod 내부에서는 Base64 페이로드를 디코딩해 sysmon.py라는 이름으로 드롭하고 "System Telemetry Service"로 위장한 systemd 서비스로 등록해 재부팅 후에도 자동 실행하는 지속성을 확보한다.

 

[그림 8] 백도어 페이로드 드롭

 

Kubernetes 노드에 설치한 백도어는 최초 5분 대기 후 50분 간격으로 공격자의 C&C 서버에 URL을 조회한 뒤 응답으로 실제 악성 코드를 /tmp/pglog로 내려받아 실행한다. 또한 공격자가 C&C 서버를 수정 중일 때는 응답을 유튜브 URL로 설정해두는데 만약 백도어가 이 주소를 받으면 실행을 건너뛰므로 의도치 않은 페이로드 실행을 막고 대기 상태로 전환된다.

 

[그림 9] 백도어 코드

 

해커조직 TeamPCP Trivy 공급망 공격으로 시작된 이번 사례는 AWS 등의 클라우드와 CI/CD 파이프 라인 등의 자격증명 데이터를 탈취한다. 최근 여러 오픈소스 라이브러리의 저장소와 npm PyPI 환경을 대상으로 한 공급망 공격이 많아지고 있어 주의가 필요하다. 따라서 현재 설치한 라이브러리와 패키지 버전을 확인해 삭제하거나 업데이트하고 운영체제 및 보안 프로그램을 최신 버전으로 유지할 것을 권고한다.

 

상기 악성코드는 잉카인터넷 안티바이러스 제품 TACHYON Internet Security 6.0에서 진단 및 치료가 가능하다.

 

[그림 10] TACHYON Internet Security 6.0 진단 및 치료 화면