34개 악성 패키지 TrapDoor, AI 코딩 설정까지 노린 공급망 공격

개발자 PC가 다시 공격의 정면이 됐다. Socket이 공개한 TrapDoor 캠페인은 2026년 5월 22일 20:20:18 UTC부터 npm, PyPI, Crates.io에 34개 악성 패키지와 384개 넘는 버전을 퍼뜨렸고, 대상은 crypto, DeFi, Solana, Sui, Move, AI 도구를 다루는 개발 환경이었다. 단순한 typosquatting보다 위험한 이유는 패키지 설치, Python import, Rust build 단계처럼 개발자가 평소 의심하지 않는 경로를 각각 따로 설계했다는 점이다.

Socket의 분석에 따르면 npm 쪽 21개 패키지는 postinstall hook으로 trap-core.js를 실행했다. 이 payload는 로컬의 개발자 secret을 훑고, AWS와 GitHub API로 훔친 토큰이 실제로 유효한지 확인한 뒤 전송을 준비했다. PyPI 7개 패키지는 import만 해도 공격자 GitHub Pages 도메인에서 JavaScript를 내려받아 node -e로 실행했고, Crates.io 6개 패키지는 build.rs를 이용해 Rust 빌드 과정에서 암호화폐 keystore를 찾았다.

숫자보다 더 중요한 변화는 AI 코딩 workflow를 공격면으로 삼았다는 사실이다. TrapDoor는 .cursorrules와 CLAUDE.md 파일을 심어 AI assistant가 보안 점검처럼 보이는 지시를 읽고 secret 탐색과 유출을 돕도록 유도했다. Socket은 공격자가 LangChain, Langflow, LLaMA Index, MetaGPT, OpenHands, browser-use 같은 프로젝트에 hidden Unicode가 들어간 .cursorrules pull request를 넣으며 이 경로를 시험한 것으로 봤다.

이 방식은 사람이 실행하는 명령과 AI agent가 해석하는 workspace instruction 사이의 경계를 흐린다. 과거 공급망 공격은 설치 스크립트나 dependency 이름을 중심으로 막으면 됐지만, 이제는 repository에 들어온 문서형 설정 파일도 실행 경로의 일부가 된다. 특히 agent가 파일을 넓게 읽고 작업을 계획하는 환경에서는 보이지 않는 문자가 들어간 규칙 파일 하나가 권한 있는 토큰, shell hook, Git hook, cron, systemd persistence로 이어질 수 있다.

운영팀이 바로 확인할 것은 lock file과 최근 설치 이력이다. Socket이 공개한 목록에는 llm-context-compressor, model-switch-router, prompt-engineering-toolkit 같은 AI 개발자에게 그럴듯한 이름과 mnemonic-safety-check, eth-security-auditor 같은 wallet 보안형 이름이 섞여 있다. 해당 패키지를 설치한 흔적이 있으면 SSH 키, GitHub token, cloud credential, npm publish token, 지갑 관련 파일을 노출된 것으로 보고 교체하는 편이 맞다.

TrapDoor의 의미는 공급망 방어가 registry별 audit 명령만으로 끝나지 않는다는 데 있다. npm audit은 Rust build.rs를 보지 못하고, pip-audit은 Node postinstall을 보지 못한다. AI 코딩 도구까지 업무 흐름에 들어온 팀이라면 .cursorrules, CLAUDE.md, AGENTS.md 같은 instruction 파일의 출처와 변경 이력도 보안 통제 대상으로 올려야 한다. 이번 사건은 agent 시대의 dependency 검사가 코드와 문서, 설치 단계와 assistant context를 함께 봐야 한다는 경고다.