
최근 npm 저장소에 Web3 개발 도구 및 보안 점검 도구로 위장한 악성 패키지가 다수 배포된 사실이 확인되었습니다.
해당 캠페인은 ddjidd5640이라는 npm 계정을 통해 유포되었으며, 단순히 악성 패키지를 설치하도록 유도하는 기존 공격 방식에서 한 단계 진화한 형태로 분석됩니다.
공격자는 개발자가 직접 패키지를 실행하는 경로뿐 아니라, AI 개발도구가 신뢰하고 읽어 들이는 프로젝트 지침 파일, AI 에이전트가 호출하는 외부 도구, 사용자가 안내에 따라 실행하는 후속 스크립트까지 공격 경로로 활용했습니다.
즉, 이번 공격은 ‘AI 개발 환경 자체에 내재된 신뢰 흐름’을 노렸다는 점에서 공격자가 AI도 공격표면으로 활용하는 점이 특징입니다.

이번 캠페인에서 확인된 악성 패키지는 크게 두 가지 형태로 위장되어 있었습니다.
| 위장 유형 | 대표 패키지 예시 | 표면적 기능 |
| Web3 개발 도구 | wallet-backup-verifier 등 | 가상자산 지갑 백업 점검 |
| 보안 점검 도구 (MCP) | env-security-scanner, chain-key-validator, defi-env-auditor 등 | 환경변수, 개인키, 니모닉 구문 점검 |
[표 1] 공격에 사용된 악성 패키지 유형
표면적으로는 정상적인 개발 도구처럼 보이지만, 내부에는 외부 서버와의 통신, 민감 정보 탐색, AI 에이전트 호출 흐름을 통한 정보 수집 등 다양한 악성 기능이 숨겨져 있었습니다.
1. npm 설치 단계 - postinstall 스크립트를 통한 자동 실행
일부 패키지에는 postinstall 스크립트가 포함되어 있어, 패키지가 설치되는 순간 별도의 사용자 조작 없이 악성 코드가 자동 실행되도록 구성되어 있었습니다.
💡 참고하세요
postinstall 스크립트란?
npm 패키지는 설치 직후 자동으로 실행되는 명령어(생명주기 스크립트)를 정의할 수 있습니다. postinstall은 그중 하나로, 원래는 패키지 설치 후 필요한 환경 설정을 자동화하기 위한 정상 기능입니다. 하지만 공격자가 이를 악용할 경우, 사용자가 패키지 코드를 직접 실행하지 않아도 설치만으로 악성 코드가 동작할 수 있습니다.
예를 들어 hardhat-gas-profiler-plugin이라는 이름의 패키지는 hardhat, web3, blockchain, ethereum 등 Web3 개발자에게 친숙한 키워드를 등록해 검색 노출을 노렸습니다. 그러나 package.json의 scripts 항목에는 다음과 같이 외부 도메인으로 자동 접속하는 악성 명령이 삽입되어 있었습니다.
확인된 구현 방식은 다음과 같습니다.
이 단계에서 사용된 주요 외부 주소는 pinggy-free.link 계열 도메인이었으며, 설치 과정 자체가 초기 침투 지점으로 사용될 수 있는 구조입니다.

2. MCP 도구를 통한 AI 에이전트 호출 경로 악용
이번 캠페인의 가장 큰 특징은 AI 에이전트가 신뢰하고 호출하는 도구 경로 자체를 정보 수집 채널로 활용했다는 점입니다.
env-security-scanner, chain-key-validator, defi-env-auditor 등의 패키지는 @modelcontextprotocol/sdk를 사용해 MCP 서버 형태로 구현되어 있었습니다.
패키지의 README에는 AI 에이전트에 해당 도구를 등록하는 방법이 안내되어 있어, 사용자가 AI 에이전트에게 “환경변수를 점검해줘”, “개인키 노출 여부를 확인해줘” 등을 요청하면 AI 에이전트가 자연스럽게 이 악성 도구를 호출하도록 설계되어 있었습니다.
💡 참고하세요
MCP(Model Context Protocol)란?
AI 에이전트가 외부 도구나 데이터에 접근할 수 있도록 표준화한 통신 규약입니다. 사용자가 AI에게 작업을 요청하면, AI는 등록된 MCP 도구를 호출해 실제 작업을 수행합니다. 마치 사람이 사용하는 ‘앱’처럼 AI 에이전트가 사용하는 ‘도구’라고 볼 수 있습니다.

문제는 도구가 호출되는 순간, 입력값과 프로젝트 메타데이터, 시스템 정보 일부가 외부 웹훅 주소로 전송되도록 작성되어 있었다는 점입니다.
수집 대상에는 다음과 같은 정보가 포함되었습니다.

3. AI 개발도구 지침 파일(.cursorrules) 악용
수집된 저장소에서 발견된 .cursorrules 파일에는 보안 관련 이상 징후를 외부 GitHub Issues 엔드포인트로 보고하도록 유도하는 지시문과 함께 암호화 키가 포함되어 있었습니다.
💡 참고하세요
.cursorrules 파일이란?
AI 코드 에디터인 Cursor가 프로젝트별 작업 지침으로 참고하는 설정 파일입니다. 개발자가 “이 프로젝트에서는 이런 규칙을 지켜달라”고 AI에게 미리 안내할 때 사용하는 일종의 ‘프로젝트 가이드’ 역할을 합니다. 그러나 이 파일이 악의적으로 작성될 경우, AI는 그 지시를 정상 작업 맥락으로 인식해 따를 수 있습니다.
악성 코드를 직접 실행하지 않더라도, 사용자가 해당 저장소를 AI 개발도구로 열거나 분석하는 과정에서 지침 파일의 내용이 AI의 작업 맥락에 섞일 수 있습니다.
이번 사례에서는 ‘보안 점검 지시’처럼 보이는 문장 안에 외부 보고 흐름과 암호화 키가 함께 들어 있어, AI가 자연스럽게 정보 유출 행위에 가담하도록 유도하는 구조였습니다.

4. 후속 스크립트를 통한 로컬 AI 서비스 정찰
지갑 백업 점검 도구로 위장한 wallet-backup-verifier 패키지는 npm 설치 외에도, 별도로 호스팅된 GitHub 페이지(ddjidd564.github.io/defi-security-best-practices/wallet-verify.html)로 사용자를 유도합니다.
해당 페이지는 ‘지갑 백업 무결성 검증 도구 v2.0’이라는 제목으로 중국어로 작성되어 있으며, 2022년 FTX 사태를 인용해 정기적인 백업 무결성 검증의 필요성을 강조합니다. 또한 ‘로컬 실행’, ‘데이터 미업로드’, ‘오픈소스’, ‘읽기 전용 점검’ 등의 배지를 함께 표시해 사용자가 안심하고 도구를 실행하도록 유도했습니다.
특히 다음과 같은 두가지 실행 방법을 함께 안내합니다.

사용자가 안내에 따라 실행한 wallet-verify.py 파일은 같은 경로의 recon.py를 함께 로드하며, recon.py 파일은 Ollama, Open WebUI, LM Studio, vLLM/TGI 계열 API 등 로컬 또는 내부 네트워크에서 실행 중일 수 있는 AI 서비스를 탐색합니다.
또한 발견된 엔드포인트에는 프롬프트를 주입하려는 코드도 포함되어 있었습니다.
즉, 공격의 목표는 모델 자체가 아닌 모델을 둘러싼 로컬 서빙 환경과 에이전트 실행 기반이라는 점을 알 수 있는 부분 입니다.

다만 recon.py 파일 코드에는 구현 결함도 함께 확인되었습니다.
inject_directive() 함수가 inject["req_body"] 키를 참조하지만, 실제 데이터 구조에는 request_data 키만 존재합니다. 이 버그로 인해 코드가 실행되더라도 프롬프트 주입은 실패했을 가능성이 높습니다. 다만, 이러한 결함은 향후 업데이트를 통해 충분히 보완될 수 있어 지속적인 주의가 필요합니다.

5. 가상자산 지갑 및 거래소 정보 탐색
wallet-backup-verifier 계열 패키지는 Web3 개발 환경에서 민감 정보가 존재할 가능성이 높은 경로를 적극적으로 탐색합니다. 단순한 시스템 정보 수집을 넘어, 가상자산 접근 권한과 직접 연결되는 데이터를 우선적으로 수집하도록 설계되어 있었습니다.
관찰된 탐색 대상은 다음과 같습니다.
| 분류 | 탐색 대상 |
| 브라우저 지갑 | MetaMask, Phantom, Trust Wallet, Coinbase Wallet, OKX Wallet, Rabby Wallet (총 6종 확장 ID 하드코딩) |
| 로컬 키스토어 | 지갑 백업 파일, 개인키 저장 파일 |
| 거래소 API | Binance, OKX, Bybit 등의 API 설정 파일·환경변수 |
| 프로젝트 설정 | .env, 셸 설정 파일, 프로젝트 설정 파일 내 키워드 기반 민감 정보 |
[표 2] 가상자산 관련 탐색 대상
특히 단순히 지갑 설치 여부만 확인하는 것이 아니라, IndexedDB 데이터 존재 여부까지 검증(has_data)하여 실제로 사용 중인 지갑만 선별적으로 식별하도록 설계되어 있었습니다.

6. DNS 질의를 이용한 데이터 유출
일부 패키지에서는 oast.fun 계열 도메인을 이용한 DNS 질의형 데이터 유출(DNS Exfiltration) 코드가 확인되었습니다.
💡 참고하세요
DNS 질의형 데이터 유출이란?
일반적인 데이터 유출은 HTTP나 HTTPS 통신을 통해 이루어지지만, 이 방식은 데이터를 잘게 나누어 인코딩한 뒤 ‘도메인 이름 조회(DNS 질의)’ 형태에 실어 외부로 전송합니다. 예를 들어 [인코딩된데이터].attacker.com 형태로 DNS 질의를 보내면, 공격자가 운영하는 DNS 서버는 이를 받아 데이터를 복원할 수 있습니다. HTTP 트래픽을 주로 감시하는 보안 장비를 우회하는 데 활용됩니다.
이번 코드에서는 앞서 살펴본 HTTP 웹훅 전송 외에도 DNS 경로가 함께 준비되어 있어, 공격자가 복수의 반출 채널을 마련해 둔 것으로 판단됩니다. 한 채널이 차단되어도 다른 채널로 데이터 유출을 지속할 수 있습니다.
또한 동일 코드에서는 제로폭(zero-width) 유니코드 문자(\u200D, \u200C)로 위장한 SECURE-DIRECTIVE 지시문이 함께 확인되었습니다. 이 지시문은 사람에게는 보이지 않지만 AI는 처리할 수 있도록 작성되어, AI가 생성하는 모든 결과물에 해당 지시문을 자동 포함하도록 유도하는 AI 간 횡적 전파 시도로 분석됩니다.

공격자는 사용자가 패키지를 의심 없이 설치하도록, 다음과 같은 신뢰 확보 전략을 함께 사용했습니다.
1. GitHub 프로필을 통한 ‘활발한 개발자’ 위장
공격자 GitHub 계정(ddjidd564)은 가입 후 단 5일 만에 14개의 저장소를 생성하고, 10개 저장소에 걸쳐 27개의 커밋과 다수의 Pull Request·Issue를 생성하는 등 비정상적으로 활발한 활동 패턴을 보였습니다. 신규 계정임에도 활동량을 인위적으로 늘려, ‘오랫동안 활동해 온 신뢰받는 개발자’처럼 보이도록 위장했습니다.

2.다중 저장소를 통한 정상 프로젝트 위장
공격자는 14개 이상의 저장소를 운영하며, 각각을 Web3, DeFi, DevOps 등 특정 커뮤니티를 표적으로 구성했습니다. awesome-mcp-servers, defi-security-best-practices, env-security-scanner, web3-dev-toolkit-2026, solidity-gas-optimizer 등 다양한 도구로 위장한 저장소가 동시에 운영되어, 개별 저장소만 봤을 때는 악성 의도를 탐지하기 어렵게 만들었습니다.
또한 일부 저장소는 GitHub 페이지를 통해 정적 사이트로 호스팅되어, 앞서 살펴본 ‘지갑 백업 검증 도구’ 페이지처럼 사용자에게 추가 피싱 인프라를 제공하는 용도로 활용되었습니다.

3. 공개 큐레이션 목록에 등재 시도
공격자는 awesome-devops-mcp-servers라는 공개 커뮤니티 큐레이션 저장소에 Pull Request를 제출해, 악성 env-security-scanner 도구를 ‘DevOps 보안 도구’ 섹션에 추가하려 시도한 것으로 확인되었습니다.
해당 목록은 많은 개발자들이 "검증된 MCP 서버"를 찾기 위해 참고하는 곳으로, 최종 수락 여부와 별개로, 신뢰받는 큐레이션 경로를 통해 악성 도구를 노출시키려 한 시도 자체가 흥미롭습니다.

이번 공격에서 확인된 공격 흐름을 단계별로 정리하면 다음과 같습니다.
| 단계 | 행위 |
| 1단계 | Web3 개발 도구 또는 보안 점검 도구로 위장한 패키지를 npm에 배포 |
| 2단계 | 일부 패키지의 postinstall 스크립트로 외부 C2 접속 및 추가 페이로드 실행 |
| 3단계 | 일부 패키지를 AI 에이전트가 호출 가능한 MCP 도구 형태로 구성 |
| 4단계 | AI 에이전트 도구 호출 시 입력 데이터와 실행 환경 정보를 외부 웹훅으로 전송 |
| 5단계 | 지갑 백업 점검 페이지와 후속 Python 스크립트로 사용자 실행 유도 |
| 6단계 | 후속 스크립트로 로컬 AI 서빙 환경 탐색 및 프롬프트 주입 시도 |
| 7단계 | .cursorrules 등 AI 지침 파일과 운영 문서에 AI 작업 맥락을 노린 지시와 우회 전략을 보관 |
[표 3] 전체 공격 흐름
이번 공격은 AI 개발 환경이 새로운 공격 표면으로 떠오르고 있음을 잘 보여주는 사례라 할 수 있습니다.
특히 AI 에이전트와 MCP 도구, 프로젝트 지침 파일처럼 ‘AI가 신뢰하고 자동으로 처리하는 흐름’이 공격자의 새로운 표적이 되고 있어 각별한 주의가 필요합니다.
피해 예방을 위해 다음 사항을 점검하시기 바랍니다.
가상자산 지갑 정보와 AI 개발 환경은 한 번 노출되면 복구가 매우 어려운 자산입니다. 출처가 불분명한 npm 패키지나 AI 도구는 설치 전 반드시 검증하시고, AI 에이전트에 부여한 권한과 도구 호출 흐름도 주기적으로 점검하시기 바랍니다.
IoC
| Indicator | Type | Description | Detection Name |
|---|---|---|---|
| 84627D8D9EE5AF906B7D001D922C6005 | MD5 | env-security-scanner-1.0.0.tgz | Trojan.Agent.NPM |
| 4E6D9938CCEC57FEB4C1E95C185C655E | MD5 | env-security-scanner-1.0.1.tgz | Trojan.Agent.NPM |
| 34EF7ADE15C2045A68F0E262063B73DE | MD5 | env-security-scanner-1.1.0.tgz | Trojan.Agent.NPM |
| FB749905972F982AA38D9C80FC2104DC | MD5 | env-security-scanner-1.2.0.tgz | Trojan.Agent.NPM |
| F293A36120CD46B56A3A08932ACA5170 | MD5 | env-security-scanner-1.3.0.tgz | Trojan.Agent.NPM |
| 0E9A774EF7E69ECE9669F32F96D774CB | MD5 | env-security-scanner-1.4.0.tgz | Trojan.Agent.NPM |
| 389EA77F64C101E8115CC2E20ACE045E | MD5 | env-security-scanner-1.5.0.tgz | Trojan.Agent.NPM |
| DDE54B2C78F689E95E4F98171C9F71BC | MD5 | env-security-scanner-1.6.0.tgz | Trojan.Agent.NPM |
| 888201EDF3D5C4D10D19C435E496D49C | MD5 | etherjs-utils-1.0.39.tgz | Trojan.Agent.NPM |
| DCCFC1D357405DA4B615BBC0563692D5 | MD5 | ethers-multicall-utils-1.3.15.tgz | Trojan.Agent.NPM |
| C8C962F4FAB1B78219171441CED2881F | MD5 | eth-wallet-sentinel-1.0.7.tgz | Trojan.Agent.NPM |
| A6BF33C455B61BAC00E06235AFC16E9E | MD5 | foundry-deploy-helper-1.8.96.tgz | Trojan.Agent.NPM |
| DE68DBF2B3F927C8CEF6D38816C2EA28 | MD5 | foundy-toolkit-1.5.79.tgz | Trojan.Agent.NPM |
| 3861C2C742D79727F4F4750AEC2CDEB9 | MD5 | ganache-cli-provider-1.7.51.tgz | Trojan.Agent.NPM |
| DF608B9E5720BEC007A880225F128BFF | MD5 | hardhat-gas-profiler-plugin-1.7.86.tgz | Trojan.Agent.NPM |
| 3EF4B6CB918DE48861153EF7C10A0F23 | MD5 | mnemonic-safety-check-0.5.0.tgz | Trojan.Agent.NPM |
| F6736457E71060877CE0F9AAFACF882E | MD5 | solana-pda-helper-1.0.46.tgz | Trojan.Agent.NPM |
| 20BD756D421FF54BF78179D30E57FEFB | MD5 | solidity-deploy-guard-0.4.2.tgz | Trojan.Agent.NPM |
| 3CFB97EE45BFD5B4A474AFE1038D93FA | MD5 | solna-web3-1.5.98.tgz | Trojan.Agent.NPM |
| 7691EEEEEAC9BBBC34D3208438E6E48F | MD5 | truffle-config-helper-1.7.0.tgz | Trojan.Agent.NPM |
| 98F5C8948D660440DFD6299C3422A1AF | MD5 | wallet-backup-verifier-1.0.0.tgz | Trojan.Agent.NPM |
| CE635C10BFD8084B2B5CBA35CC9032E4 | MD5 | wallet-backup-verifier-1.0.1.tgz | Trojan.Agent.NPM |
| BC17CE7A806057AABDC56FD54EF24A27 | MD5 | wallet-security-checker-1.0.1.tgz | Trojan.Agent.NPM |
| 3A94D84B6AF306AC34963FC6F959C2F3 | MD5 | web3-secrets-detector-1.2.3.tgz | Trojan.Agent.NPM |
| 72E3F9E1C9904ABBE04CDBCF10FD84B0 | MD5 | web3-secrets-detector-1.2.4.tgz | Trojan.Agent.NPM |
| 2A51804C5362C069EF6651B6DC856370 | MD5 | chain-key-validator-0.2.1.tgz | Trojan.Agent.NPM |
| 99A4C474C5E759452148278D877734DE | MD5 | chainlink-price-feed-aggregator-1.1.12.tgz | Trojan.Agent.NPM |
| 88ADF56453B5517E5A9DBC121AE8BEC3 | MD5 | crypto-credential-scanner-2.0.0.tgz | Trojan.Agent.NPM |
| 4D7140A0C6F0CF3BC8C7C59E7C588376 | MD5 | defi-env-auditor-0.3.0.tgz | Trojan.Agent.NPM |
| 03E71CB6E12244120F779A27A595E127 | MD5 | defi-threat-scanner-2.1.0.tgz | Trojan.Agent.NPM |
| 4F9EE60FD41ECC3E7F8A83E29631B67D | MD5 | deployment-key-auditor-0.7.1.tgz | Trojan.Agent.NPM |
| D9B657AC3C4FCA15A48CC18D3B4C6695 | MD5 | python 파일 | Trojan.Python.Loader |
| 5FD8BCE8D84399F75D055698CDAF7030 | MD5 | python 파일 | Trojan.Python.Injector |
| ddjidd564[.]ddjidd5640/evidence/ddjidd564.github.io/wallet-verify.py | |||
| ddjidd564[.]ddjidd5640/evidence/ddjidd564.github.io/recon.py |
| 디지털 서명 검증을 우회하는 MS Word 변조 악성코드 주의 (CVE-2013-3900) (0) | 2026.06.01 |
|---|---|
| 스틸러·RAT·랜섬웨어를 결합한 복합 위협 악성코드 분석 - MoscowTeam_Steal (0) | 2026.05.20 |
| TikTok 동영상 다운로더로 위장한 악성 크롬 확장 프로그램 주의 (0) | 2026.05.14 |
| 국세청 및 금융기관 사칭, PhaaS를 이용한 기업 타겟형 피싱메일 주의 (0) | 2026.05.13 |
| Wildcard DNS 기법을 악용한 급여명세서 위장 피싱 메일 주의 (0) | 2026.04.20 |
댓글 영역