최근, 다른 사용자가 유사한 오픈소스 프로젝트인 audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot을 사용하다가 암호화폐 자산을 도난당한 후 슬로우 미스트 (SlowMist) 보안팀에 연락했습니다. 이후 보안팀은 해당 공격 방식에 대한 심층 분석을 실시했습니다.
저자: Joker&Thinking, 슬로우 미스트 (SlowMist) Technology
편집자: KrsMt.
배경
2025년 7월 초, 슬로우 미스트 (SlowMist) 보안팀은 한 피해자로부터 암호화폐 자산 도난 원인 분석에 대한 지원 요청을 받았습니다. 조사 결과, 해당 사건은 사용자가 GitHub에 호스팅된 오픈소스 프로젝트 zldp2002/solana-pumpfun-bot을 사용하면서 은밀한 도난이 발생한 것으로 밝혀졌습니다. 자세한 내용은 "GitHub의 이슈 Solana 도구, 숨겨진 토큰 도난 함정"을 참조하세요.
최근, 다른 사용자가 유사한 오픈소스 프로젝트인 audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot을 사용하다가 암호화폐 자산을 도난당한 후 슬로우 미스트 (SlowMist) 보안팀에 연락했습니다. 이후 보안팀은 해당 공격 방식에 대한 심층 분석을 실시했습니다.
분석 프로세스
정적 분석
먼저 정적 분석을 사용하여 공격자가 설정한 함정을 찾았습니다. /src/common/config.rs 설정 파일, 특히 create_coingecko_proxy() 메서드에서 의심스러운 코드를 발견했습니다.

코드에서 볼 수 있듯이, create_coingecko_proxy() 메서드는 먼저 import_wallet()을 호출하고, 이는 다시 import_env_var()를 호출하여 개인 키를 얻습니다.

import_env_var() 메서드에서는 주로 .env 파일에서 환경 변수 구성 정보를 가져오는 데 사용됩니다.
호출 중에 환경 변수가 있으면 바로 반환하고, 없으면 Err(e) 분기로 진입하여 오류 메시지를 출력합니다. 종료 조건 없이 {} 루프가 존재하면 지속적인 리소스 소모가 발생합니다.

PRIVATE_KEY(개인 키)와 같은 민감한 정보도 .env 파일에 저장됩니다.

import_wallet() 메서드로 돌아가서, import_env_var()가 PRIVATE_KEY(개인 키)를 얻기 위해 호출될 때 악성 코드는 개인 키의 길이를 결정합니다.
개인 키 길이가 85보다 작으면 맬웨어는 오류 메시지를 출력합니다. 또한, 종료 조건이 없는 루프 {}가 존재하기 때문에 리소스가 계속 소모되어 맬웨어가 정상적으로 종료되지 않습니다.
개인 키 길이가 85보다 크면 Solana SDK를 사용하여 Base58 문자열을 개인 키 정보가 포함된 Keypair 객체로 변환합니다.
그런 다음 악성 코드는 Arc를 사용하여 개인 키 정보를 캡슐화하여 다중 스레드 공유를 지원합니다.

create_coingecko_proxy() 메서드로 돌아가서, 악성 코드는 개인 키 정보를 성공적으로 얻은 후 악성 URL 주소를 디코딩합니다.

이 방법은 먼저 인코딩된 HELIUS_PROXY(공격자 서버 주소) 하드코딩된 상수를 가져옵니다.

그런 다음 악성 코드는 bs58을 사용하여 HELIUS_PROXY(공격자의 서버 주소)를 디코딩하고, 디코딩된 결과를 바이트 배열로 변환한 후, from_utf8()을 사용하여 바이트 배열을 UTF-8 문자열로 변환합니다.
스크립트를 작성하면 디코딩 후 HELIUS_PROXY의 실제 주소를 다음과 같이 복원할 수 있습니다.
http://103.35.189.28:5000/api/wallets
악성 코드는 URL(http://103.35.189.28:5000/api/wallets)을 성공적으로 디코딩한 후 먼저 HTTP 클라이언트를 생성하고 to_base58_string()을 사용하여 얻은 개인 키 정보 payer를 Base58 문자열로 변환합니다.
이후 악성 코드는 JSON 요청 본문을 구성하고 변환된 개인 키 정보를 캡슐화합니다. POST 요청을 구성하여 위 URL이 가리키는 서버로 개인 키와 기타 데이터를 전송하고, 응답 결과는 무시합니다.
서버에서 반환된 결과와 관계없이 악성 코드는 사용자가 감지하지 못하도록 계속 실행됩니다.

또한 create_coingecko_proxy() 메서드에는 악의적인 동작을 은폐하기 위해 가격을 얻는 등의 일반적인 함수도 포함되어 있으며, 메서드 이름 자체도 다소 혼란스럽게 위장되어 있습니다.

분석을 통해 create_coingecko_proxy() 메서드는 애플리케이션이 시작될 때 호출되며, 구체적으로는 main.rs의 main() 메서드의 구성 파일 초기화 단계에서 호출되는 것을 알 수 있습니다.

구성 파일 src/common/config.rs의 new() 메서드에서 악성 코드는 먼저 .env 파일을 로드한 다음 create_coingecko_proxy() 메서드를 호출합니다.

분석에 따르면 해당 서버의 IP 주소는 미국에 있습니다.

이 프로젝트는 최근(2025년 7월 17일) GitHub에 업데이트되었으며, 주요 변경 사항은 src 디렉토리의 구성 파일 config.rs에 집중되어 있는 것으로 나타났습니다.

src/common/config.rs 파일에서 HELIUS_PROXY(공격자의 서버 주소)의 원래 주소 인코딩이 새로운 인코딩으로 바뀐 것을 확인할 수 있습니다.

스크립트를 사용하여 원래 주소 인코딩을 디코딩한 후 원래 서버 주소를 얻을 수 있습니다.
// 원래 주소 인코딩 HELIUS_PROXY:
2HeX3Zi2vTf1saVKAcNmf3zsXDkjohjk3h7AsnBxbzCkgTY99X5jomSUkBCW7wodoq29Y
// 디코딩된 원본 서버 주소
https://storebackend-qpq3.onrender.com/api/wallets
동적 분석
악성 코드의 도난 과정을 보다 직관적으로 관찰하기 위해 동적 분석 방법을 사용하고 Python 스크립트를 작성하여 테스트를 위해 Solana 공개 키와 개인 키 쌍을 생성했습니다.

동시에, 우리는 POST 요청을 받을 수 있는 HTTP 서버를 서버에 구축했습니다.

테스트 서버에 해당하는 코드를 생성하고 이를 원래 공격자가 설정한 악성 서버 주소 코드, 즉 HELIUS_PROXY(공격자의 서버 주소)로 바꾸는 Python 스크립트를 작성하세요.

그런 다음 .env 파일의 PRIVATE_KEY(개인 키)를 방금 생성한 테스트 개인 키로 바꿉니다.

다음으로, 악성 코드를 실행하고 서버 측 인터페이스의 반응을 관찰합니다.

악성 프로젝트에서 보낸 JSON 데이터(PRIVATE_KEY 정보 포함)를 테스트 서버가 성공적으로 수신한 것을 확인할 수 있습니다.

침해 지표(IoC)
IP:
103.35.189.28
도메인:
storebackend-qpq3.onrender.com
SHA256:
07f0364171627729788797bb37e0170a06a787a479666abf8c80736722bb79e8 -pumpfun-pumpswap-sniper-copy-trading-bot-master.zip
ace4b1fc4290d6ffd7da0fa943625b3a852190f0aa8d44b93623423299809e48 - pumpfun-pumpswap-sniper-copy-trading-bot-master/src/common/config.rs
악성 저장소:
https://github.com/audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot
유사한 구현 방법:
https://github.com/BitFancy/Solana-MEV-Bot-Optimized
https://github.com/0xTan1319/solana-copytrading-bot-rust
https://github.com/blacklabelecom/SAB-4
https://github.com/FaceOFWood/SniperBot-Solana-PumpSwap
https://github.com/Alemoore/Solana-MEV-Bot-Optimized
https://github.com/TopTrenDev/레이펌프-실행-봇
https://github.com/deniyuda348/솔라나-아비트라지-봇-플래시-론
요약하다
이 공격에서 공격자는 합법적인 오픈소스 프로젝트로 위장하여 사용자를 속여 악성 코드를 다운로드하고 실행하도록 유도합니다. 이 프로젝트는 로컬 .env 파일에서 민감한 정보를 읽어 훔친 개인 키를 공격자가 제어하는 서버로 전송합니다. 이러한 유형의 공격에는 종종 사회 공학적 기법이 포함되어 있어 부주의한 사용자가 쉽게 공격 대상이 될 수 있습니다.
개발자와 사용자는 특히 지갑이나 개인 키 작업과 관련하여 확인되지 않은 GitHub 프로젝트에 대해 주의를 기울일 것을 권장합니다. 실행 또는 디버깅을 해야 하는 경우, 악성 프로그램 및 출처를 알 수 없는 명령이 실행되는 것을 방지하기 위해 민감한 데이터가 없는 격리된 환경에서 실행하는 것이 좋습니다.
보안에 대한 자세한 내용은 슬로우 미스트 (SlowMist) 에서 제작한 "블록체인 다크 포레스트 자가 구조 매뉴얼"을 참조하세요.
https://github.com/slowmist/블록체인-다크-포레스트-셀프가드-핸드북/blob/main/README_CN.md
면책 조항: 블록체인 정보 플랫폼으로서, 본 사이트에 게시된 글은 작성자와 방문자 관점 만을 반영하며 Web3Caff의 입장을 대변하지 않습니다. 본 글에 포함된 정보는 참고용일 뿐이며, 어떠한 투자 조언이나 제안도 구성하지 않습니다. 거주 국가 또는 지역의 관련 법률 및 규정을 준수하시기 바랍니다.
Web3Caff 공식 커뮤니티 에 오신 것을 환영합니다 : X(트위터) 계정 | Web3Caff Research X(트위터) 계정 | WeChat 리더 그룹 | WeChat 공개 계정





