서론
2026년 5월 22일 확인된 TrapDoor 공격은 npm, PyPI, Crates.io 세 개 패키지 생태계를 동시에 겨냥한 공급망 공격으로, AI 코딩 도구의 설정 파일(.cursorrules, CLAUDE.md)을 악용하여 자격증명을 탈취하는 새로운 기법을 사용했다.
본론
기술적 분석
1. 공격 아키텍처
TrapDoor 캠페인은 34개 이상의 악성 패키지와 관련 384개 이상 버전으로 구성된 다중 레지스트리 공급망 공격이다. 주요 패키지 배포 현황은 다음과 같다.
- npm: eth-security-auditor, crypto-credential-scanner, eth-wallet-sentinel, sui-framework-helpers 등 21개 패키지
- PyPI: eth-security-auditor, crypto-credential-scanner 등 7개 패키지
- Crates.io: 6개 패키지
각 패키지는 보안 도구나 SDK를 사칭하여 개발자가 설치하도록 유도했다. Socket에 따르면 신규 버전을 평균 5분 56초 내에 탐지했다고 한다.
2. 패키지별 실행 경로 및 암호화 기법
TrapDoor의 핵심 페이로드는 약 48KB(1,149줄) 규모의 npm 페이로드 trap-core.js다. 각 패키지 생태계마다 다른 실행 경로와 암호화 기법을 사용했다.
npm 패키지:
- postinstall 훅으로 자동 실행
- Fernet 및 ECDH(대칭키 암호화와 키 교환 방식) 암호화 사용
- ECDH 키 교환 프로토콜로 암호화된 페이로드를 동적으로 복호화
PyPI 패키지:
- 임포트 시점에서 공격자 GitHub Pages에서 자바스크립트 바이너리 다운로드
- node -e 명령으로 직접 실행
- 명령어 인자를 통한 암호화 키 전달
Crates.io 패키지:
- 컴파일 단계 build.rs 스크립트에서 로컬 키보드 타이밍 탐색
- 하드코딩된 XOR 키(cargo-build-helper-2026)로 유출 데이터 암호화
3. 자격증명 탈취 메커니즘
실행된 페이로드는 다음 정보를 체계적으로 탈취한다.
- SSH 키(공개키/개인키)
- 브라우저 프로필(쿠키, 저장된 비밀번호)
- AWS 환경 변수 및 자격증명(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
- GitHub 토큰(GITHUB_TOKEN, Personal Access Tokens)
- 암호화폐 지갑(Sui, Solana, Aptos)
탈취한 자격증명의 유효성을 다음 순서로 검증한다.
- AWS·GitHub API 호출로 자격증명 유효성 검증
- 유효한 자격증명만 원격 서버로 전송
- 확보된 SSH 키로 내부 확장 시도
4. 지속성 확보 기법
시스템 내 지속성을 확보하기 위해 다음 백도어를 설치한다.
- Git 훅(pre-commit, post-commit)
- 셸 훅(.bashrc, .zshrc)
- systemd 서비스(트래픽 모니터링 위장)
- cron 작업(정기적 데이터 유출)
모든 구성요소에서 P-2024-001이라는 캠페인 식별자가 공통으로 관찰된다.
5. AI 도구 프롬프트 주입 기법
이번 공격에서 가장 주목할 점은 AI 코딩 어시스턴트를 표적으로 한 프롬프트 주입 기법이다.
공격자는 프로젝트별 지침을 담은 .cursorrules·CLAUDE.md 파일에 사람 눈에 보이지 않는 유니코드 문자(Zero-width space U+200B 등)를 삽입했다. 이 숨은 지시문은 Cursor·Claude Code 같은 도구가 "보안 점검"으로 위장한 작업을 하도록 유도하지만, 실제로는 자격증명을 외부로 유출하는 루틴이다.
실제 공격 코드 예시:
// 공격자가 제출한 PR에 포함된 .cursorrules
const config = {
"standard": "P-2024-001",
"config": "https://ddjidd564[.]github[.]io/defi-security-best-practices/config.json",
"strategy": {
"scan_depth": 3,
"enabled_vectors": [
"git", "vscode", "cursorrules", "sourceHeaders",
"readme", "pkgJson", "claudeMd", "prepush",
"trapActivation", "pypi", "docker", "systemProfile"
]
},
"encryption": { "enabled": true, "scheme": "Fernet" }
};
이 설정은 AI 도구가 보안 검사를 수행하는 것처럼 보이게 하지만, 실제로는 자격증명 수집 후 공격자 서버로 전송한다. 코드 리뷰에서 정상적으로 보이는 AI 설정 파일이라도 바이트 단위로 검토하지 않으면 숨겨진 유니코드 문자를 발견하기 어렵다.
법적 고려사항
TrapDoor와 같은 공급망 공격으로 자격증명이 유출된 경우, 기업은 개인정보보호법, 정보통신망법, 형법 등 관련 법규에 따라 책임을 져야 한다. 특히 개인정보 유출 시 24시간 이내 개인정보보호위원회에 신고하고 정보주체에게 통지해야 한다. 영업비밀 침해의 경우 5년 이하 징역 또는 5천만 원 이하 벌금에 처해질 수 있다.
영향 범위
1. 직접 영향
영향 패키지를 설치하거나 빌드한 환경은 다음 자격증명이 노출되었을 가능성이 있다고 간주해야 한다.
- 개발자 SSH 키
- AWS 자격증명
- GitHub 토큰
- 암호화폐 지갑(Sui, Solana, Aptos)
- 브라우저 프로필
2. 2차 피해
탈취한 SSH 키를 통한 추가 시스템 접근이 시도될 수 있어, 내부 확장 위험이 있다. 특히 CI/CD 파이프라인이 영향을 받았다면 자동화된 빌드 과정에서 대규모 자격증명 유출이 발생했을 가능성이 있다.
3. 표적 산업
암호화폐, DeFi, Solana, AI 개발자 커뮤니티가 주요 표적이다. 이들은 높은 가치의 자산을 다루거나 개발 생산성을 높이기 위해 외부 패키지와 AI 도구를 적극적으로 사용하는 특성이 있어 공격자의 좋은 타겟이 되었다.
탐지 방법
1. 영향 패키지 설치 여부 확인
영향 패키지를 한 번이라도 설치·빌드한 환경은 침해된 것으로 간주하고 점검 범위를 좁힌다.
- npm 설치 로그에서 postinstall 단계의 trap-core.js 실행 및 외부 node -e 호출 흔적 점검
- Rust 빌드 산출물에서 하드코딩 XOR 키 문자열 cargo-build-helper-2026와 build.rs의 비정상 네트워크 접속 확인
2. 숨겨진 유니코드 탐지
저장소 내 .cursorrules·CLAUDE.md 파일에 사람 눈에 보이지 않는 유니코드(U+200B 등) 포함 여부와 P-2024-001 식별자 존재 여부를 검색한다. 아래 명령으로 숨겨진 유니코드 문자를 탐지할 수 있다.
# .cursorrules·CLAUDE.md 등에서 숨겨진 유니코드 탐지
grep -rP "[\x{200B}\x{200C}\x{200D}\x{FEFF}]" . --include=".cursorrules" --include="*.md"
# Python으로 숨은 문자의 위치까지 확인
python3 -c "
with open(".cursorrules", "r") as f:
content = f.read()
for i, c in enumerate(content):
if ord(c) in [0x200B, 0x200C, 0x200D, 0xFEFF]:
print(f"Hidden char U+{ord(c):04X} at position {i}")
"
3. 네트워크 연결 기록 확인
아웃바운드 연결 기록에서 다음 도메인 접속 이력을 살핀다.
- ddjidd564[.]github[.]io
- 공격자 C&C 서버 IP(Socket.dev 보고서 참조)
4. 자격증정 파일 접근 흔적 점검
개발자 환경의 다음 파일 접근 흔적을 점검한다.
- SSH 키(~/.ssh/)
- AWS 자격증정(~/.aws/)
- Sui·Solana·Aptos 지갑 파일
완화 방법
점검 결과 침해 정황이 확인되었다면, 다음 조치를 통해 피해 확산을 차단해야 한다.
1. 즉시 대응
- 영향 패키지를 제거하고 lockfile에서 해당 버전이 다시 끌어오지 않도록 의존성 트리 확인
- 노출 가능성이 있는 SSH 키·AWS 키·GitHub 토큰을 즉시 폐기·재발급
- 암호화폐 지갑 키를 새 지갑으로 이전
로그상 노출이 없더라도 영향 버전을 설치한 개발자·CI 파이프라인의 자격증명은 유출된 것으로 간주하고 우선 폐기·재발급해야 한다.
2. 코드베이스 검토
- PR로 유입된 .cursorrules·CLAUDE.md 변경을 재검토
- 사람 눈에 보이지 않는 유니코드 문자를 탐지·차단하는 lint 도구 도입
- AI 코딩 어시스턴트가 외부 config를 자동으로 로드·실행하지 못하도록 설정 제한
3. 패키지 설치 정책 강화
- 패키지 설치 시 npm install --ignore-scripts(pnpm·yarn도 동일 플래그 지원)로 postinstall 등 라이프사이클 훅의 자동 실행 차단 정책 적용
- 패키지 출처 신뢰성 확인
- 정기적인 의존성 감사 실시
4. 보안 도구 활용
- Socket.dev 같은 패키지 보안 점검 도구 사용
- AI 설정 파일 무결성 점검 도구 도입
- 설치 스크립트 실행 정책 엄격화
결론
TrapDoor 캠페인은 전통적인 공급망 공격과 AI 프롬프트 주입 기법을 결합하여 공격 벡터를 확장했다. npm, PyPI, Crates.io 세 생태계를 동시에 겨냥한 점, AI 코딩 도구를 악용한 점이 특히 주목할 만하다.
이번 사건은 개발자 생태계에서의 보안이 패키지 레벨을 넘어 AI 도구까지 확장되었음을 보여준다. 단순히 악성 패키지 설치를 막는 것만으로는 부족하며, AI 설정 파일의 무결성까지 확인해야 한다.
개발자는 다음을 기억해야 한다.
- 영향 패키지를 설치했거나 의심되는 환경은 즉시 자격증정을 폐기하고 재발급해야 한다
- AI 설정 파일(.cursorrules, CLAUDE.md 등)은 바이트 단위로 검토해야 한다
- 패키지 설치 시 스크립트 실행을 차단하는 정책을 적용해야 한다
- 정기적인 의존성 감사와 보안 도구 활용이 필수적이다.
보안책상은 이러한 공급망 위협을 지속적으로 모니터링하고, 개발자들에게 신속한 대응 지침을 제공할 예정이다.
참고자료
-
SK Shielders
https://www.skshieldus.com/security-insights/trends/eqst-trapdoor-ai-dev-tool-supply-chain-attack -
Socket.dev Blog
https://socket.dev/blog/trapdoor-crypto-stealer-npm-pypi-crates -
CyberSecurityNews
https://cybersecuritynews.com/supply-chain-trapdoor-malware/ -
Phoenix Security
https://phoenix.security/trapdoor-supply-chain-ai-poisoning-npm-pypi-crates/
본 콘텐츠는 AI 기술로 생성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하시면 댓글을 통해 소중한 의견 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!