By Joker&Thinking
2025年7月上旬、Slow Fogのセキュリティチームは、被害に遭ったユーザーから、暗号資産が盗まれた原因を分析するための支援を求める依頼を受けました。調査の結果、この事件はユーザーがGitHubでホストされているオープンソースプロジェクト、zldp2002/solana-pumpfun-botを使用したことに起因しており、GitHubの人気ツールSolanaがコインを盗むトラップを隠していた。Tool Hides Coin Stealing Trapとして詳しく説明されています。
最近、また別のユーザーが同様のオープンソースプロジェクトを使ってGitHubからお金を盗んだ罪で有罪になりました。pumpfun-pumpswap-sniper-copy-trading-botを使用してGitHubからお金を盗み、暗号資産を盗んだことが判明し、Slow Fogセキュリティ・チームに連絡しました。これを受けて、チームは攻撃手法をさらに深く分析しました。
分析プロセス
静的解析
まず、静的解析によって攻撃者が仕掛けたトラップを探します。解析の結果、疑わしいコードは/src/common/config.rs 設定ファイルにあることがわかりました。create_coingecko_proxy() method:

コードからわかるように、create_coingecko_proxy()メソッドはまずimport_wallet()を呼び出し、さらにimport_env_var()を呼び出して秘密鍵を取得します。

import_env_var()メソッドでは、主に.envファイル内の環境変数設定情報を取得するために使用します。
この呼び出しは、環境変数が存在すればそれを返し、存在しなければErr(e)に分岐してエラーを表示します。終了条件のない{}ループがあるため、常にリソースを消費することになります。

PRIVATE_KEY(秘密鍵)やその他の機密情報も.env ファイルに保存されます。

import_wallet()メソッドに戻り、import_env_var()を呼び出してPRIVATE_KEYを取得すると、悪意のあるコードは秘密鍵の長さを判断します。/p>秘密鍵が85より長い場合は、Solana SDKを使用して、そのBase58文字列を秘密鍵情報を含むKeypairオブジェクトに変換します。
悪意のあるコードは次にArcを使用して秘密鍵情報をカプセル化し、マルチスレッドの共有をサポートします。

create_coingecko_proxy()メソッドに戻り、秘密鍵情報の取得に成功した後、悪意のあるコードは悪意のあるURLアドレスをデコードします。

このメソッドはまず、エンコードされたHELIUS_PROXY(攻撃者のサーバーアドレス)をハードコードされた定数として取得します。

次に悪意のあるコードは、bs58を使用してHELIUS_PROXY(攻撃者のサーバーのアドレス)をデコードし、デコード結果をバイト配列に変換し、さらにfrom_utf8()を使用してバイト配列をUTF-8文字列に変換します。"text-align:centre">
悪意のあるコードは、URL(http://103.35.189.28:5000/api/wallets)の解読に成功した後、まずHTTPクライアントを作成します。URL()の解読に成功した後、悪意のあるコードはまずHTTPクライアントを作成し、to_base58_string()を使用して秘密鍵情報payerをBase58文字列に変換します。
次に悪意のあるコードはJSONリクエストボディを構築し、その中に変換された秘密鍵情報をカプセル化し、上記のURLが指すサーバーに秘密鍵を送信するPOSTリクエストを構築します。レスポンスは無視します。
サーバーが何を返そうとも、悪意のあるコードはユーザーへの警告を避けるために実行し続けます。

さらに、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(攻撃者のサーバーアドレス)の元のアドレスエンコーディングが新しいものに置き換えられているのがわかります。

元のサーバーアドレスは、スクリプトを使って元のアドレスエンコーディングをデコードした後に取得できます。

悪意のあるコードの盗用プロセスをより直感的な方法で観察するため、動的解析法を採用し、テスト用を生成するPythonスクリプトを作成しました。Solana公開鍵と秘密鍵のペアを生成するためのPythonスクリプトを作成しました。

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

テストサーバーに対応するエンコーディングを生成し、元の攻撃者によって設定された悪意のあるサーバーアドレスのエンコーディング、つまりHELIUS_PROXY(攻撃者のサーバーアドレス)に置き換えるPythonスクリプトを書いてください。

その後、.envファイルのPRIVATE_KEYを先ほど生成したテスト用秘密鍵に置き換えます。

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

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

侵入インジケータ(IoC)
IPs:
103.35.189.28
103.35.189.28storebackend-qpq3.onrender.com
SHA256:
悪意のあるリポジトリ:
https://github.com/audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot
同様の実装:
https://github.com/BitFancy/Solana-MEV-Bot-Optimised
_COPY3span text="">https://github.com/0xTan1319/solana-copytrading-bot-rust
https://github.com/blacklabelecom/SAB-4
https://github.com/blacklabelecom/SAB-4span>
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-フラッシュローン
全般結論
この共有攻撃手法では、攻撃者は正当なオープンソースプロジェクトを装って、ユーザーに悪意のあるコードをダウンロードさせ、実行させます。このプロジェクトはローカルにある.envファイルから機密情報を読み取り、盗んだ秘密鍵を攻撃者のコントロール下にあるサーバーに転送します。この種の攻撃はソーシャル・エンジニアリングの手法と組み合わされることが多く、注意を怠るユーザーによって悪用される可能性があります。
開発者やユーザーは、特にウォレットや秘密鍵の操作に関しては、正体不明のGitHubプロジェクトに細心の注意を払うことをお勧めします。実行やデバッグが必要な場合は、ソース不明の悪意のあるプログラムやコマンドを実行しないよう、機密データのない別の環境で行うことをお勧めします。