NOW Briefing
.cursorrules·CLAUDE.md 파일에 사람 눈에 안 보이는 유니코드 문자(U+200B 등)로 숨긴 프롬프트를 심어, AI 코딩 도구가 자체적으로 자격증명을 빼돌리도록 유도하는 신종 기법이 확인됐습니다.
TrapDoor: AI 개발 도구를 노린 공급망 공격
■ 개요
TrapDoor 캠페인은 npm 21개, PyPI 7개, Crates.io 6개를 비롯해 34개 이상의 악성 패키지와 관련 버전·산출물 384개 이상으로 구성됩니다. 패키지들은 eth-security-auditor, crypto-credential-scanner, eth-wallet-sentinel, sui-framework-helpers처럼 보안 점검 도구나 블록체인 SDK를 사칭한 이름을 사용했습니다. 주요 표적은 암호화폐, DeFi(Decentralized Finance, 탈중앙화 금융), Solana, AI 개발자 커뮤니티입니다. 세 개 생태계를 동시에 노려 단일 레지스트리 공격보다 노출 표면이 넓습니다.
넓어진 노출 표면은 설치·빌드 단계의 자동 실행 지점에서 실제 침해로 이어집니다. npm은 postinstall 훅으로, PyPI는 임포트 시점의 원격 자바스크립트 실행으로, Crates.io는 컴파일 중 동작하는 build.rs 스크립트로 페이로드를 구동합니다. 실행된 페이로드는 SSH 키, 브라우저 프로필, AWS 환경 변수, 암호화폐 지갑을 탈취하고, 확보한 SSH 키로 추가 시스템 접근을 시도합니다. 별도 인증 없이 패키지 설치·빌드만으로 동작하므로 노출 조건이 낮습니다.
이처럼 실행 조건이 낮고 탈취 대상이 넓기 때문에, 업로드 시점과 현재 유통 상태를 함께 확인해야 합니다. Socket은 최초 패키지를 2026년 5월 22일 20시 20분(UTC)에 확인했고, 신규 버전을 평균 5분 56초 내에 탐지했습니다. 공격자는 주말 동안 여러 계정으로 패키지를 잇따라 업로드했습니다. 이 중 일부는 레지스트리 보안팀에 의해 제거됐지만, 일부는 한동안 배포 상태로 남아 있었습니다. 또한 AI 코딩 도구를 겨냥한 프롬프트 주입은 기존 공급망 탐지로 잡기 어려운 신종 벡터입니다.
■ 요약
| 항목 | 내용 |
|---|---|
| 캠페인·기법명 | TrapDoor(멀티 레지스트리 공급망 + AI 도구 프롬프트 주입) |
| 위협 수준 | 높음 — 다중 생태계 동시 배포·자격증명 및 암호화폐 탈취·내부 확산 |
| 공격 유형 | 공급망 공격, 자격증명·암호화폐 지갑 탈취, AI 어시스턴트 프롬프트 주입 |
| 영향/위험 |
- SSH 키·AWS·GitHub 토큰 등 개발자 자격증명 유출 - Sui·Solana·Aptos 암호화폐 지갑 탈취 - 탈취 SSH 키 기반 내부 확산 - AI 도구를 통한 자동 자격증명 유출 |
| 표적 산업·지역 | 암호화폐·DeFi·Solana·AI 개발자 커뮤니티 |
| 관측 기간 | 2026-05-22 최초 업로드 ~ 진행 중 |
■ 생태계별 실행 경로
TrapDoor의 핵심 무기는 약 48KB(1,149줄) 규모의 npm 페이로드 trap-core.js입니다. 이 페이로드는 자격증명을 수집한 뒤 AWS·GitHub API 호출로 탈취 값의 유효성을 검증하고, 확보한 SSH 키로 내부 확산을 시도합니다. PyPI 패키지는 임포트되는 순간 공격자 GitHub Pages에서 자바스크립트를 내려받아 node -e로 실행하는 방식으로 동일 페이로드 계열을 재사용합니다.
같은 페이로드 계열이 npm·PyPI에 걸쳐 재사용되는 한편, Crates.io 패키지는 컴파일 단계의 build.rs에서 로컬 키스토어를 탐색한 뒤, 하드코딩된 XOR 키 cargo-build-helper-2026로 데이터를 암호화해 유출합니다. 이에 비해 npm 페이로드는 Fernet·ECDH(대칭키 암호화와 키 교환 방식)처럼 한층 정교한 기법을 적용합니다. 지속성 확보를 위해 Git 훅, 셸 훅, systemd 서비스, cron 작업도 함께 설치합니다. 모든 구성요소에서 P-2024-001이라는 캠페인 식별자가 공통으로 관찰됩니다.
■ AI 도구 프롬프트 주입
기존 공급망 실행 경로 외에도, 이 캠페인은 AI 코딩 어시스턴트를 표적으로 삼은 점이 가장 두드러집니다. 공격자는 프로젝트별 지침을 담는 .cursorrules·CLAUDE.md 파일에 사람 눈에 보이지 않는 유니코드 문자로 지시문을 삽입했습니다. 이 숨은 지시문은 Cursor·Claude Code 같은 도구가 "보안 점검"으로 위장된 작업을 하도록 유도하지만, 실제로는 자격증명을 외부로 빼돌리는 루틴입니다.
이 기법을 실제 저장소에 반영하기 위해 공격자 계정 ddjidd564는 정상 오픈소스 프로젝트에 풀 리퀘스트를 제출해 이 설정을 끼워 넣으려 시도했습니다. 설정 파일은 공격자 GitHub Pages 도메인(ddjidd564[.]github[.]io)에 호스팅된 외부 config를 참조하도록 구성됩니다. 아래는 해당 PR에서 관찰된 설정 구조이며, P-2024-001 식별자와 외부 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" }
}
⚠️ WARN
코드 리뷰에서 정상으로 보이는 AI 설정 파일이라도 사람 눈에 보이지 않는 유니코드로 숨겨진 지시문이 포함될 수 있습니다.
.cursorrules·CLAUDE.md 변경은 보이는 텍스트만이 아니라 바이트 단위로 검토해야 합니다.
■ 탐지 및 점검
✅ CHECK
영향 패키지를 한 번이라도 설치·빌드한 환경은 자격증명이 유출된 것으로 간주하고 점검 범위를 잡습니다.
• npm 설치 로그에서 postinstall 단계의 trap-core.js 실행 및 외부 node -e 호출 흔적을 점검합니다.
• Rust 빌드 산출물에서 하드코딩 XOR 키 문자열 cargo-build-helper-2026와 build.rs의 비정상 네트워크 접근을 확인합니다.
• 저장소 내 .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}')
"
• 아웃바운드 연결 기록에서 ddjidd564[.]github[.]io 도메인 접속 이력을 살핍니다.
• 개발자 환경의 SSH 키, ~/.aws 자격증명, Sui·Solana·Aptos 지갑 파일 접근 흔적을 점검합니다.
■ 대응 방안
점검 결과 침해 정황이 확인됐다면, 다음 조치를 통해 피해 확산을 차단해야 합니다.
💡 TIP
영향 버전을 설치한 개발자·CI 파이프라인의 자격증명은 유출된 것으로 간주하고 우선 회수합니다.
로그에 평문 노출이 없더라도 회수·재발급 대상에서 제외하지 않습니다.
• 영향 패키지를 제거하고 lockfile에서 해당 버전이 다시 끌려오지 않도록 핀과 의존성 트리를 확인합니다.
• 노출 가능성이 있는 SSH 키·AWS 키·GitHub 토큰을 즉시 회수·재발급하고, 암호화폐 지갑 키를 새 지갑으로 이전합니다.
• PR로 유입된 .cursorrules·CLAUDE.md 변경을 재검토하고, 사람 눈에 보이지 않는 유니코드 문자를 탐지·차단하는 lint를 도입합니다.
• AI 코딩 어시스턴트가 외부 config를 자동으로 로드·실행하지 않도록 설정을 제한합니다.
• 패키지 설치 시 npm install --ignore-scripts(pnpm·yarn도 동일 플래그 지원)로 postinstall 등 라이프사이클 훅의 자동 실행을 차단하는 정책을 적용합니다.
[참고 자료]
Socket.dev, TrapDoor Crypto Stealer Supply Chain Attack
Cybersecurity News, Hackers Compromised 34 Packages in npm, PyPI, and Crates



