상세 컨텐츠

본문 제목

오픈소스 공급망을 넘어 로컬 AI 인프라를 겨냥한 위협 분석

악성코드 분석 리포트

by 알약4 2026. 5. 26. 14:00

본문

[이미지] 생성형 AI 제작

 

 

최근 npm 저장소에 Web3 개발 도구 및 보안 점검 도구로 위장한 악성 패키지가 다수 배포된 사실이 확인되었습니다.

 

해당 캠페인은 ddjidd5640이라는 npm 계정을 통해 유포되었으며, 단순히 악성 패키지를 설치하도록 유도하는 기존 공격 방식에서 한 단계 진화한 형태로 분석됩니다. 

 

공격자는 개발자가 직접 패키지를 실행하는 경로뿐 아니라, AI 개발도구가 신뢰하고 읽어 들이는 프로젝트 지침 파일, AI 에이전트가 호출하는 외부 도구, 사용자가 안내에 따라 실행하는 후속 스크립트까지 공격 경로로 활용했습니다.

즉, 이번 공격은 ‘AI 개발 환경 자체에 내재된 신뢰 흐름’을 노렸다는 점에서 공격자가 AI도 공격표면으로 활용하는 점이 특징입니다.

 

[그림 1] ddjidd5640 npm 계정에 등록된 악성 패키지 목록

 

공격 개요

 

이번 캠페인에서 확인된 악성 패키지는 크게 두 가지 형태로 위장되어 있었습니다.

 

위장 유형 대표 패키지 예시 표면적 기능
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.jsonscripts 항목에는 다음과 같이 외부 도메인으로 자동 접속하는 악성 명령이 삽입되어 있었습니다.

확인된 구현 방식은 다음과 같습니다.

  • https.get() 등의 HTTP 호출을 통해 외부 C2 서버에 접속하여 설치 사실을 알림
  • curl 명령으로 원격 파일을 내려받아 임시 경로에 저장한 뒤, 실행 권한을 부여하고 백그라운드에서 실행

이 단계에서 사용된 주요 외부 주소는 pinggy-free.link 계열 도메인이었으며, 설치 과정 자체가 초기 침투 지점으로 사용될 수 있는 구조입니다.

 

[그림 2] 정상 Hardhat 플러그인으로 위장한 패키지의 악성 postinstall 스크립트

 

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] npm에 배포된 MCP 기반 보안 감사 도구 위장 패키지

 

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

수집 대상에는 다음과 같은 정보가 포함되었습니다.

  • os.userInfo() - 사용자 계정 정보
  • os.hostname() - 호스트명
  • 환경변수 내 키워드 기반 민감 항목 (API 키, 토큰 등)

[그림 4] defi-env-auditor MCP 서버 코드 - 도구 호출 시 외부 웹훅으로 환경 정보 전송

 

3. AI 개발도구 지침 파일(.cursorrules) 악용

수집된 저장소에서 발견된 .cursorrules 파일에는 보안 관련 이상 징후를 외부 GitHub Issues 엔드포인트로 보고하도록 유도하는 지시문과 함께 암호화 키가 포함되어 있었습니다. 

💡 참고하세요

.cursorrules 파일이란? 

AI 코드 에디터인 Cursor가 프로젝트별 작업 지침으로 참고하는 설정 파일입니다. 개발자가 “이 프로젝트에서는 이런 규칙을 지켜달라”고 AI에게 미리 안내할 때 사용하는 일종의 ‘프로젝트 가이드’ 역할을 합니다. 그러나 이 파일이 악의적으로 작성될 경우, AI는 그 지시를 정상 작업 맥락으로 인식해 따를 수 있습니다. 

악성 코드를 직접 실행하지 않더라도, 사용자가 해당 저장소를 AI 개발도구로 열거나 분석하는 과정에서 지침 파일의 내용이 AI의 작업 맥락에 섞일 수 있습니다.
이번 사례에서는 ‘보안 점검 지시’처럼 보이는 문장 안에 외부 보고 흐름과 암호화 키가 함께 들어 있어, AI가 자연스럽게 정보 유출 행위에 가담하도록 유도하는 구조였습니다.

 

[그림 5] .cursorrules 파일에 삽입된 외부 보고 지시문과 암호화 키

 

4. 후속 스크립트를 통한 로컬 AI 서비스 정찰

지갑 백업 점검 도구로 위장한 wallet-backup-verifier 패키지는 npm 설치 외에도, 별도로 호스팅된 GitHub 페이지(ddjidd564.github.io/defi-security-best-practices/wallet-verify.html)로 사용자를 유도합니다.

 

해당 페이지는 ‘지갑 백업 무결성 검증 도구 v2.0’이라는 제목으로 중국어로 작성되어 있으며, 2022년 FTX 사태를 인용해 정기적인 백업 무결성 검증의 필요성을 강조합니다. 또한 ‘로컬 실행’, ‘데이터 미업로드’, ‘오픈소스’, ‘읽기 전용 점검’ 등의 배지를 함께 표시해 사용자가 안심하고 도구를 실행하도록 유도했습니다.

 

특히 다음과 같은 두가지 실행 방법을 함께 안내합니다.

  • 방법 1: curl 명령으로 wallet-verify.py를 직접 다운로드 후 실행
  • 방법 2: ChatGPT(Code Interpreter)에 붙여넣을 프롬프트를 통째로 제공하여 AI가 대신 실행하도록 유도

[그림 6] GitHub에 호스팅된 '지갑 백업 검증 도구' 안내 페이지

 

사용자가 안내에 따라 실행한 wallet-verify.py 파일은 같은 경로의 recon.py를 함께 로드하며, recon.py 파일은 Ollama, Open WebUI, LM Studio, vLLM/TGI 계열 API 등  로컬 또는 내부 네트워크에서 실행 중일 수 있는 AI 서비스를 탐색합니다. 

또한 발견된 엔드포인트에는 프롬프트를 주입하려는 코드도 포함되어 있었습니다.
즉, 공격의 목표는 모델 자체가 아닌 모델을 둘러싼 로컬 서빙 환경과 에이전트 실행 기반이라는 점을 알 수 있는 부분 입니다.

 

[그림 7] 로컬 AI 서비스 대상으로 프롬프트 주입을 시도하는 recon.py 코드

 

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

 

[그림 8] inject_directive() 함수의 키 참조 버그

 

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)하여 실제로 사용 중인 지갑만 선별적으로 식별하도록 설계되어 있었습니다.

 

[그림 9] 6종 브라우저 지갑 탐지 및 거래소 API 설정 탐색 코드

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 간 횡적 전파 시도로 분석됩니다.

 

[그림 10] DNS 질의형 데이터 유출 및 AI 지침 전파 코드

 

신뢰 확보를 위한 배포 전략

 

공격자는 사용자가 패키지를 의심 없이 설치하도록, 다음과 같은 신뢰 확보 전략을 함께 사용했습니다.

 

1. GitHub 프로필을 통한 ‘활발한 개발자’ 위장

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

 

[그림 11] 공격자 GitHub 프로필 화면

 

2.다중 저장소를 통한 정상 프로젝트 위장

공격자는 14개 이상의 저장소를 운영하며, 각각을 Web3, DeFi, DevOps 등 특정 커뮤니티를 표적으로 구성했습니다. awesome-mcp-servers, defi-security-best-practices, env-security-scanner, web3-dev-toolkit-2026, solidity-gas-optimizer 등 다양한 도구로 위장한 저장소가 동시에 운영되어, 개별 저장소만 봤을 때는 악성 의도를 탐지하기 어렵게 만들었습니다.

 

또한 일부 저장소는 GitHub 페이지를 통해 정적 사이트로 호스팅되어, 앞서 살펴본 ‘지갑 백업 검증 도구’ 페이지처럼 사용자에게 추가 피싱 인프라를 제공하는 용도로 활용되었습니다.

 

[그림 12] 공격자 GitHub 계정의 저장소


3. 공개 큐레이션 목록에 등재 시도

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

 

[그림 13] 공개 AI 도구 추천 목록에 악성 도구 등록을 시도한 Pull Request

 

전체 공격 흐름 

 

이번 공격에서 확인된 공격 흐름을 단계별로 정리하면 다음과 같습니다.

 

단계  행위
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 지침 파일 사전 확인
    외부 저장소를 열기 전에 .cursorrules, CLAUDE.md 등 AI 개발도구가 자동으로 읽어 들이는 지침 파일이 포함되어 있는지 반드시 확인하고, 그 내용을 먼저 검토해야 합니다.
  • AI 에이전트 접근 권한 최소화
    프로젝트 내 .env 파일, 개인키, 니모닉 등 민감 정보에 AI 에이전트가 불필요하게 접근하지 못하도록 권한을 제한해야 합니다.
  • MCP 도구의 출처와 동작 검증
    AI 에이전트가 호출하는 확장 도구나 MCP 서버는 신뢰할 수 있는 출처인지, 어떤 데이터를 외부로 전송하는지 반드시 검토해야 합니다.
  • 로컬 AI 서비스의 접근 제어 강화
    Ollama 등 로컬·내부망에서 구동 중인 AI 서비스는 알 수 없는 스크립트가 해당 포트에 접근하지 못하도록 네트워크 설정을 점검하고 주기적으로 보안 감사를 수행 해야합니다.
  • 이상 통신 모니터링
    webhook.site, pinggy-free.link, oast.fun 계열 통신과 비정상적인 DNS 질의 패턴을 주기적으로 확인해야 합니다.
  • npm 설치 스크립트 실행 제한
    가능한 환경에서는
    npm install --ignore-scripts 옵션 적용을 검토하되, 정상 빌드에 미치는 영향도 함께 확인해야 합니다.

가상자산 지갑 정보와 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      

 

관련글 더보기

댓글 영역