著者: Joker&Thinking
編集者: 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 クライアントを作成し、取得した秘密鍵情報 payer を to_base58_string() を使用して Base58 文字列に変換します。
次に、悪意のあるコードはJSONリクエストボディを構築し、その中に変換された秘密鍵情報をカプセル化します。POSTリクエストを構築することで、秘密鍵とその他のデータは上記のURLで指定されたサーバーに送信され、レスポンス結果は無視されます。
サーバーから返される結果に関係なく、悪意のあるコードはユーザーの気付きを避けるために実行され続けます。

さらに、create_coingecko_proxy() メソッドには、悪意のある動作を隠すために価格を取得するなどの通常の機能も含まれており、メソッド名自体も偽装されており、混乱を招きます。

分析により、アプリケーションの起動時、具体的には main.rs の main() メソッドの構成ファイル初期化フェーズで、create_coingecko_proxy() メソッドが呼び出されることがわかります。

設定ファイル 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
動的解析
悪意のあるコードの盗難プロセスをより直感的に観察するために、動的分析手法を使用し、テスト用に Solana の公開鍵と秘密鍵のペアを生成する Python スクリプトを作成しました。

同時に、POST リクエストを受信できる HTTP サーバーをサーバー上に構築しました。

Python スクリプトを記述してテスト サーバーに対応するコードを生成し、それを元の攻撃者が設定した悪意のあるサーバー アドレス コード、つまり HELIUS_PROXY (攻撃者のサーバー アドレス) に置き換えます。

次に、.env ファイル内の PRIVATE_KEY を、先ほど生成したテスト秘密キーに置き換えます。

次に、悪意のあるコードを起動し、サーバー側インターフェースの応答を観察します。

テスト サーバーが、悪意のあるプロジェクトから送信された、PRIVATE_KEY 情報を含む JSON データを正常に受信したことがわかります。

侵害の兆候(IoC)
IP:
103.35.189.28
ドメイン:
storebackend-qpq3.onrender.com
SHA256:
- 07f0364171627729788797bb37e0170a06a787a479666abf8c80736722bb79e8 - ポンプファン・ポンプスワップ・スナイパー・コピー・トレーディング・ボット・マスター.zip
- ace4b1fc4290d6ffd7da0fa943625b3a852190f0aa8d44b93623423299809e48 - pumpfun-pumpswap-sniper-コピートレーディングボット-マスター/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プロジェクトに細心の注意を払うことをお勧めします。どうしても実行やデバッグが必要な場合は、機密データを含まない独立した環境で実行し、不明なソースからの悪意のあるプログラムやコマンドの実行を回避することをお勧めします。
