악성 로봇이 솔라나 생태계에 다시 등장: 구성 파일에 개인 키 유출 트랩이 숨겨져 있음

Rust 프로젝트는 구성 초기화 단계에서 은밀한 네트워크 요청을 수행하고 공격 서버 주소를 동적으로 디코딩합니다.

저자: 조커&씽킹

편집자: 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 주소는 미국에 있습니다.

악성 로봇이 솔라나 생태계에 다시 등장: 구성 파일에 개인 키 유출 트랩이 숨겨져 있음

 (https://www.virustotal.com/gui/ip-address/103.35.189.28)

이 프로젝트는 최근(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 서버를 서버에 구축했습니다.

악성 로봇이 솔라나 생태계에 다시 등장: 구성 파일에 개인 키 유출 트랩이 숨겨져 있음

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

악성 로봇이 솔라나 생태계에 다시 등장: 구성 파일에 개인 키 유출 트랩이 숨겨져 있음

그런 다음 .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 프로젝트, 특히 지갑이나 개인 키 작업과 관련된 프로젝트에 대해 각별한 주의를 기울이시기를 권장합니다. 실행이나 디버깅이 꼭 필요한 경우, 출처를 알 수 없는 악성 프로그램이나 명령이 실행되지 않도록 민감한 데이터가 없는 독립적인 환경에서 실행하는 것이 좋습니다.

공유하기:

작성자: 慢雾科技

이 글은 PANews 입주 칼럼니스트의 관점으로, PANews의 입장을 대표하지 않으며 법적 책임을 지지 않습니다.

글 및 관점은 투자 조언을 구성하지 않습니다

이미지 출처: 慢雾科技 침해가 있는 경우 저자에게 삭제를 요청하세요.

PANews 공식 계정을 팔로우하고 함께 상승장과 하락장을 헤쳐나가세요
추천 읽기
7분 전
28분 전
1시간 전
2시간 전
2시간 전
3시간 전

인기 기사

업계 뉴스
시장 핫스팟
엄선된 읽을거리

엄선 특집

App内阅读