著者: Kseniia Yamburh、Moonlock by MacPaw のマルウェア リサーチ エンジニア & Mykhailo Pazyniuk、Moonlock by MacPaw のマルウェア リサーチ エンジニア
オープンソースソフトウェアはイノベーションの基盤となるが、同時に悪用される可能性もある。最近、チェックマークスの研究者は
macOS ユーザーの保護に注力している Moonlock では、この問題についてさらに詳しく調査する必要があることはわかっていました。レイヤーを解明していくと、さらに 10 個のリポジトリが見つかりました。それぞれが、微妙な違いはあるものの、ほぼ同じコードを共有していました。これは自動展開によるものでしょうか。それとも、組織的なキャンペーンなのでしょうか。調査の経緯は次のとおりです。
物語は「Meme-Token-Hunter-Bot」から始まります。これは一見、暗号愛好家向けのユーティリティ ツールの 1 つに過ぎません。README には、ユーザーに main.py を実行するように指示されています。このファイルは、通常、ほとんどの Python ベースのアプリケーションでメイン機能を起動するファイルです。指示に従って main.py を詳しく調べたところ、base_helper.py というヘルパー スクリプトが呼び出されていることがわかりました。このヘルパー ファイルが、調査の要となるものです。
Meme-Token-Hunter-Bot がどのように攻撃を実行するかをより明確に理解するために、初期設定からデータの流出まで、マルウェアのプロセスの各ステップを示すフローチャートを作成しました。この視覚的表現により、パッケージ内に埋め込まれたエンコードとステルス戦術のレイヤーが明らかになり、その動作の全体像がわかります。
フローチャートは main.py から始まります。これは、パッケージが macOS 上で実行されていることを検出すると、base_helper.py を呼び出す開始点です。
このファイルには、encoded_base_key や encoding_licences などの変数に保存されている、base64 でエンコードされた URL とファイル名が含まれています。
これらのエンコードされた値はスクリプトの真の目的を隠し、https://coinsw[.]app/basec/ に接続してさらにファイルを ~/tmpcode/ ディレクトリにダウンロードする URL をマスクします。
ファイルがダウンロードされると、フローチャートの次のステップでは、マルウェアが MHTBot.py というファイルを起動し、すべての表示可能な出力を /dev/null にリダイレクトして、ユーザーや監視ツールからそのアクティビティを隠蔽します。
フローチャートでは、MHTBot.py が攻撃のターニングポイントとして際立っています。このファイルは PyQT5 を使用して、パスワード プロンプトと進行状況バーを表示する、正規のソフトウェアを模倣したグラフィカル ユーザー インターフェイスを作成します。この偽装はユーザーを安心させるために設計されていますが、実際には、MHTBot.py はバックグラウンドで一連のデータ取得モジュールを密かにアクティブ化します。
MHTBot.py は巧妙な回避技術を採用しています。最初のパスワード試行を「安全でない」として拒否し、2 回目だけを受け入れます。この組み込みの遅延は、サンドボックス検出を回避することを目的としていると思われます。多くのサンドボックス環境では実行時間が制限されており、マルウェアが完全にアクティブになる前に終了する可能性があります。
Meme-Token-Hunter-Bot は、回避策の一環として、主なデータ窃盗操作を開始する前に遅延を設けています。この遅延は、自動分析の実行時間が限られていることが多いサンドボックス環境による検出を回避するためにも設計されています。実行を遅らせることで、マルウェアは初期スキャンをすり抜け、実際のユーザーのシステムで完全にアクティブ化される可能性が高くなります。
以下のスクリーンショットは、この遅延の原因となっている特定のコードを示しています。start_one_py_main_after_delay 関数は、QTimer.singleShot を使用して 7000 ミリ秒 (7 秒) の遅延を開始し、その後 run_one_py_main 関数を呼び出します。次に、この関数は別のスレッドでメインのデータ盗難モジュール one.py をトリガーします。
MHTBot.py が制御を one.py に移行すると、マルウェアの主なデータ窃盗操作が開始されます。次のコード スニペットは、one.py がさまざまな関数とモジュールを使用してユーザーのシステムから機密情報を収集する方法を示しています。コードの各部分とその目的を分析してみましょう。
最初のスニペットでは、main() 関数が盗んだデータを一時的に保存するための隠しディレクトリを準備しているのがわかります。マルウェアは、ユーザーに警告することなくファイルを保存するための隠しディレクトリとして ~/.temp/premium/ を作成します。このディレクトリを設定した後、関数はさまざまなルーチンを呼び出して、特定のアプリケーションからデータを収集します。
mediax(): 保存されているメモを抽出するために Apple Notes をターゲットにしている可能性があります。
copy_stickies() および copy_stickies_database(): これらの関数は、Stickies アプリケーションからデータを収集します。
backup_ssh(): システムから SSH キーを収集します。
copy_terminal_history(): 端末履歴ファイルをコピーします。
copy_ssh_and_keychain(): SSH および macOS キーチェーンからデータを抽出します。
これらの関数は、アプリケーション、ユーザー資格情報、SSH 構成から幅広いデータを収集することに専念しており、one.py は包括的なデータ収集ツールとなっています。
次のコード スニペットに示す search_files() 関数は、特定のファイル タイプをターゲットにすることでデータ収集の範囲を拡大します。この関数は、一般的なディレクトリ (ダウンロード、ドキュメント、デスクトップ、ホーム ディレクトリ) で、.txt、.csv、.json、.config、.env などの拡張子を持つ機密ファイルを検索します。これらのファイル タイプには、多くの場合、構成設定、API キー、その他の貴重な情報が含まれています。
見つかったファイルは一時ディレクトリにコピーされ、圧縮されて、流出用に準備されます。この手順により、通常、ユーザー ディレクトリまたはプロジェクト構成ファイルに保存されるすべてのデータが収集されます。
次のスニペットでは、copy_terminal_history() 関数と copy_ssh_and_keychain() 関数が重要なユーザー データをキャプチャします。マルウェアは .zprofile ファイルと .zsh_history ファイルからターミナル履歴を抽出し、ターミナルに入力された機密情報や資格情報など、ユーザーが実行したコマンドを明らかにする可能性があります。
さらに、macOS キーチェーンと SSH ディレクトリにアクセスして、システムに保存されている暗号化された資格情報、パスワード、SSH キーを取得し、攻撃者に価値の高い資格情報を提供します。
このマルウェアの最も注目すべき点の 1 つは、暗号通貨ウォレットをターゲットにしていることです。zip_additional_wallets() 関数は、特に人気の暗号通貨ウォレットに関連付けられたディレクトリを探します。マルウェアは、Bitcoin、Electrum、Coinomi、Exodus などの主要な暗号通貨ウォレットに属するウォレット ファイルを体系的に検索します。特定されると、これらのウォレット ディレクトリは圧縮されて一時ディレクトリに保存され、抽出の準備が整います。
このマルウェアには、Telegram データの盗難に特化した機能も含まれています。backup_telegram() および backup_tdata() 関数は、Telegram データ ディレクトリを探し、アプリに保存されているメッセージ、連絡先、メディアにアクセスしようとします。これらのファイルをコピーすることで、マルウェアは攻撃者にユーザーの Telegram 通信とメディア履歴を再構築させる可能性があります。
機密情報を収集した後、Meme-Token-Hunter-Bot はデータをリモート サーバーに流出させます。この流出は、ファイルの名前変更、アップロード、攻撃者の Telegram ボットへの通知を処理する一連の関数を使用して実行されます。次のコード スニペットは、このプロセスがどのように展開されるかを示しています。
send_telegram_message 関数は、事前に設定された Telegram ボットにメッセージを送信し、盗まれたファイルの新しいバッチがアップロードされたことを攻撃者に警告します。この機能により、攻撃者は各データの流出に関する最新情報をタイムリーに受信できるようになり、データ盗難プロセスをリアルタイムで監視できるようになります。
さらに存在を隠蔽するため、マルウェアは盗んだファイルの名前を .minecraft 拡張子に変更します。これは、特定のファイルの種類を監視する基本的なネットワーク侵入検知システムを回避するための珍しいトリックであると考えられます。名前が変更されると、upload_file は攻撃者のリモート サーバーへのデータ転送を開始します。ファイルはバイナリ読み取りモードで開かれ、requests.post() を使用してパブリック ファイル共有プラットフォームである https://store1.gofile[.]io/ にアップロードされます。
アップロードが成功した場合(ステータス コード 200 で示されます)、関数はダウンロード リンクを取得し、Telegram 経由で攻撃者に送信します。
調査中、Meme-Token-Hunter-Botは独立したパッケージではないのではないかと疑っていました。標的を絞ったGitHub
興味深いことに、Meme-Token-Hunter-Bot は 10 か月間存在していましたが、悪意のあるコードを組み込み始めたのは、ステージ 2 Python スティーラーのダウンロードを担うファイルである base_helper.py が初めて導入された 2024 年 8 月になってからでした。このファイルの最新の更新は、2024 年 9 月 28 日に行われました。
一方、11 個の追加リポジトリは、base_helper.py が追加された約 2 か月前に悪意のある更新を受け取りました。この調整されたタイミングは、これらのリポジトリが、Meme-Token-Hunter-Bot で見られた初期の成功と手法に基づいて、マルウェアを配布するために特別に設定されたことを示唆しています。
これらのリポジトリのいくつかには、macOS のセキュリティ警告を回避するための Gatekeeper 回避手順も見つかりました。手順はステップバイステップのビジュアル形式で提示されており、ユーザーにアプリケーションを右クリックして「開く」を選択し、Gatekeeper の警告を回避するよう促しています。
さらに、特定された 10 個の追加リポジトリの中で、「Solana-Bot」という 1 つの亜種が際立っていました。Meme-Token-Hunter-Bot と同じ悪意のあるフローをたどりますが、特にファイル名と関数の使用においてわずかな変更が見られました。Solana-Bot の base_helper.py ファイルと Meme-Token-Hunter-Bot のファイルを並べて比較すると、これらの違いが明らかになります。
Solana-Bot と Meme-Token-Hunter-Bot の主な違いは、URL の変更です。
"aHR0cHM6Ly9jb2luc3cuYXBwL2Jhc2VjLw==" + "UENTQm90LnB5" = "https://coinsw.app/basec/PCSBot.py" <-- Solana-Bot "aHR0cHM6Ly9jb2luc3cuYXBwL2Jhc2VjLw==" + "TUhUQm90LnB5" = "https://coinsw.app/basec/MHTBot.py"
Meme-Token-Hunter-Bot とその関連亜種に関する今回の調査により、macOS ユーザーをターゲットにした綿密に計画されたキャンペーンが明らかになりました。Checkmarx によって最初に明らかにされたこの窃盗パッケージは、当初は暗号化ツールを装っていましたが、より広範な脅威へと拡大しました。当社の分析により、それぞれ元のコードに若干の違いがある 11 個の追加リポジトリが明らかになりました。攻撃者は、名前、UI ラベル、機能にわずかな変更を加えて検出を回避し、永続的な可用性を確保することで、これらのリポジトリを迅速に生成するために自動化を採用したようです。
しかしながら、macOS ユーザーを狙ったおなじみのソーシャル エンジニアリングの手法、特に Gatekeeper のバイパス手順も確認されました。これは、脅威アクターが依然としてユーザーの信頼を悪用することに大きく依存していることを示しています。このキャンペーンで確認された高度な手法にもかかわらず、ユーザーによるバイパスへの依存は、ユーザー教育を継続する必要があることを示しています。
認識こそが最善の防御です。Moonlockブログなどのリソース