作者:Joker&Thinking

編輯:KrsMt.

背景

在 2025 年 7 月初,慢霧安全團隊接到一名受害用戶的求助,請求協助分析其加密資產被盜的原因。調查發現,事件源於該用戶使用了一個託管在 GitHub 上的開源項目 zldp2002/solana-pumpfun-bot,進而觸發了隱蔽的盜幣行爲,詳情見GitHub 熱門 Solana 工具暗藏盜幣陷阱。

近期,又有用戶因使用類似的開源項目 —— audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot,導致加密資產被盜,並聯繫到慢霧安全團隊。對此,團隊進一步深入分析了該攻擊手法。

分析過程

靜態分析

我們首先通過靜態分析的方式,尋找攻擊者設置的陷阱。經分析,發現可疑代碼位於/src/common/config.rs配置文件中,主要集中在create_coingecko_proxy()方法內:

從代碼可見,create_coingecko_proxy() 方法首先調用了 import_wallet(),該方法進一步調用 import_env_var() 來獲取私鑰。

在 import_env_var() 方法中,主要用於獲取 .env 文件中的環境變量配置信息。

調用過程中,如果環境變量存在,則直接返回;若不存在,則進入 Err(e) 分支,打印錯誤信息。由於存在無退出條件的 loop {} 循環,會導致資源持續消耗。

PRIVATE_KEY(私鑰)等敏感信息也存儲在.env文件中。

回到 import_wallet() 方法,當其中調用 import_env_var() 獲取到 PRIVATE_KEY(私鑰)後,惡意代碼會對私鑰長度進行判斷:

  • 若私鑰長度小於 85,惡意程序將打印錯誤信息,並由於存在無退出條件的 loop {} 循環,會導致資源持續消耗,惡意程序無法正常退出;

  • 若私鑰長度大於 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 客戶端,將獲取到的私鑰信息 payer 使用 to_base58_string() 轉換爲 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)

觀察到該項目在 GitHub 上於近期(2025 年 7 月 17 日)進行了更新,主要更改集中在 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(私鑰)信息。

入侵指標(IoCs)

IPs:

103.35.189.28

Domains:

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/Raypump-Executioner-Bot

  • https://github.com/deniyuda348/Solana-Arbitrage-Bot-Flash-Loan

總結

本次分享的攻擊手法中,攻擊者通過僞裝成合法開源項目,誘導用戶下載並執行該惡意代碼。該項目會從本地讀取 .env 文件中的敏感信息,並將盜取的私鑰傳輸至攻擊者控制的服務器。這類攻擊通常結合社會工程學技術,用戶稍有不慎便可能中招。

我們建議開發者與用戶對來路不明的 GitHub 項目保持高度警惕,尤其是在涉及錢包或私鑰操作時。如確需運行或調試,建議在獨立且無敏感數據的環境中進行,避免執行來源不明的惡意程序和命令。