PromptSpy:生成AIを活用したAndroidを狙う新たな脅威の到来

ESETの研究者が、実行フローで生成AIを悪用する初のAndroidマルウェア「PromptSpy」を発見

2026/03/09 Lukas Stefanko

ESETの研究者は、生成AIを悪用し、コンテキストに応じてユーザーインターフェイスの操作を行うAndroidマルウェアの初の事例を発見しました。機械学習は、すでに同様の目的で使用されています。つい最近、Dr.WEBの研究者がTensorFlow機械学習モデルを用いて広告スクリーンショットを分析し、検出された要素を自動クリックして大規模な広告詐欺を行うAndroid.Phantomを発見しています。しかし、こうした形で生成AIが展開されたのは今回が初めてです。攻撃者は、悪意のあるUI操作を誘導するためにAIモデル(この例ではGoogleのGemini)のプロンプトに依存しているため、ESETはこのマルウェア系統をPromptSpyと名付けました。AIを活用したマルウェアをESETが発見した事例としては、2025年8月のPromptLockに続いて、これが2件目になります。

生成AIが展開されているのは、PromptSpyのコードの比較的小さな部分(常駐化の実現)に限定されていますが、それでもマルウェアの適応性に大きな影響を与えています。具体的には、Geminiを使用して現在の画面を分析し、悪意のあるアプリを「最近使ったアプリ」のリストに固定された状態を維持するための段階的な手順をPromptSpyに提供することにより、システムによる強制終了やスワイプ削除を防止します。AIモデルとプロンプトはコード内で事前定義されており、変更できません。AndroidマルウェアはUI操作に依存することが多いため、生成AIを活用することで、攻撃者はほぼあらゆるデバイス、レイアウト、OSバージョンに対応できるようになり、潜在的な被害者層を大幅に拡大できます。

PromptSpyの主な目的は、内蔵VNCモジュールを展開し、オペレーターが被害者のデバイスにリモートからアクセスできるようにすることです。また、ユーザー補助サービスを悪用して不可視のオーバーレイでアンインストールを阻止し、ロック画面のデータを取得し、動画を記録します。VNCプロトコル経由でC&Cサーバーと通信し、AES暗号化を使用します。

言語ローカライゼーションの手がかりと分析中に観察された拡散経路から、このキャンペーンは金銭的動機によるものであり、主にアルゼンチンのユーザーを標的にしていると見られます。興味深いことに、分析されたPromptSpyの検体からは、中国語圏の環境で開発されたことが示唆されます。

PromptSpyは専用のWebサイトを通じて配布されており、Google Playで提供されたことはありませんが、ESETはApp Defense Allianceのパートナーとして、調査結果をGoogleと共有しました。Androidユーザーは、Google Playサービスを搭載したAndroidデバイスにおいてデフォルトで有効になっているGoogle Play Protectによって、このマルウェアの既知のバージョンから自動的に保護されます。

本ブログの要点:

  • PromptSpyは、目的が常駐化のみであるとは言え、生成AIを実行フローに使用した初のAndroidマルウェアです。
  • 侵害されたデバイスで画面上の要素を解釈し、特定のジェスチャーを実行して「最近使ったアプリ」リストに残留するための動的な指示をPromptSpyに提供するために、GoogleのGeminiが使用されます。
  • PromptSpyの主たる目的(生成AIの支援を伴わない部分)は、被害者のデバイス上にVNCモジュールを展開し、攻撃者がスクリーンを監視して遠隔操作できるようにすることです。
  • 現時点で、PromptSpyはESETのテレメトリでは観測されておらず、概念実証段階にある可能性があります。しかし、配布に使用された可能性のあるドメインが発見されたことから、アルゼンチンのユーザーを標的とする亜種の存在が示唆されます。
  • PromptSpyは、ロック画面のデータの取得、アンインストールの阻止、デバイス情報の収集、スクリーンショットの作成、画面操作の動画記録などを実行できます。

PROMPTSPYのAIを活用した機能

PromptSpyの機能のうち、Geminiを使用しているのは1つだけですが、こうしたAIツールを組み込むことで、マルウェアをより動的なものにし、従来のスクリプティングでは困難だった操作を自動化する方法を攻撃者に提供できることを示しています。 すでに簡単に触れたとおり、Androidマルウェアは通常、タップ、座標、UIセレクターなどのハードコードされた画面要素に依存しています。これらは、デバイスやOSバージョンの違い、あるいはメーカー独自のカスタマイズによってUIが変更されると機能しなくなる可能性があります。PromptSpyは、デバイスやメーカーによって異なる「最近使ったアプリにアプリをロックする」ジェスチャーを実行して、「最近使ったアプリ」のリストに埋め込まれた状態を維持し、常駐化を図ります(詳細なプロセスは分析セクションをご覧ください)。したがって、Androidマルウェアが従来使用してきた固定スクリプトによる自動化が困難になります。

そのため、PromptSpyは、Geminiに現在の画面のXMLダンプとともに、自然言語のプロンプトを送信し、すべてのUI要素の詳細(テキスト、タイプ、画面上の正確な位置)をAIに把握させます。

Geminiはこの情報を処理し、実行する操作(タップなど)とその位置を指示するJSON形式の応答をマルウェアに返します。マルウェアは、以前のプロンプトとGeminiの応答の両方を保存するため、Geminiはコンテキストを理解し、多段階の操作を調整できます。

図1は、PromptSpyがGeminiとの通信を初期化する際のコードスニペットを示しており、最初に使用されるプロンプトも含んでいます。Geminiに意思決定を委ねることで、マルウェアは正しいUI要素を認識し、適切なジェスチャーを実行できるため、ユーザーが終了を試みてもマルウェアを存続させることが可能です。

PromptSpyは、AIがアプリのロックが成功したことを確認するまでGeminiにプロンプトを送り続けます。これは、マルウェアが検証を待った上で次に進むというフィードバックループを示しています。

PROMPTSPYの概要

2026年2月、ESETは未知のAndroidマルウェアファミリーの2つのバージョンを発見しました。VNCSpyと命名された最初のバージョンは、2026年1月13日にVirusTotalに出現し、香港からアップロードされた3つの検体として観測されました。2026年2月10日には、VNCSpyを基盤とするより高度なマルウェアの4つの検体がアルゼンチンからVirusTotalにアップロードされました。

アルゼンチンからの検体を分析した結果、GoogleのGeminiを悪用した悪意のあるペイロードを持つ多段階マルウェアであることが明らかになりました。こうした発見に基づき、ESETはこのマルウェアの第1段階をPromptSpyドロッパー、そのペイロードをPromptSpyと命名しました。

ESETのテレメトリでは、PromptSpyドロッパーやそのペイロードの検体はまだ確認されておらず、どちらも概念実証段階にある可能性を示唆しています。しかし、後述するように、配布ドメインが存在する可能性があることから、PromptSpyドロッパーとPromptSpyが実環境に存在する可能性を否定できません。

VirusTotalのデータによると、4つのPromptSpyドロッパー検体はすべて、Webサイトmgardownload[.]comを通じて配布されました。しかし、分析時点では同サイトはすでに停止していました。

PromptSpyドロッパーをインストールして起動すると、m-mgarg[.]comでホストされたWebページが開きました。このドメインも停止していましたが、Googleのキャッシュ版から、Chase Bank(法的にはJPMorgan Chase Bank N.A.)のサイトになりすましている可能性が高いことが判明しました(図2を参照)。

このマルウェアは同様のブランディングを使用しており、アプリ名はMorganArg、アイコンはChase Bankを模倣したものとなっています(図3を参照)。「Morgan Argentina」の略語と思われるMorganArgも、キャッシュされたWebサイトの名前として表示されることから、この地域が標的であることが示唆されます。

m-mgarg[.]comドメインをVirusTotalでのピボットに使用したところ、さらに別のAndroidマルウェアの検体(Android/Phishing.Agent.M)にたどり着きました。VirusTotalは、なりすましのWebサイトをスペイン語で表示し、「Iniciar sesión」(ログイン)ボタンがあることから、このページは銀行のWebサイトを模倣したものと思われます(図4を参照)。

このトロイの木馬は、VNCSpyとPromptSpyの背後にいる同一の攻撃者によって開発されたコンパニオンアプリケーションとして機能すると見られます。バックグラウンドでは、トロイの木馬がサーバーに接続して設定ファイルを要求します。設定ファイルには、別のAPKをダウンロードするためのリンクが含まれており、被害者にはスペイン語で「更新」として提示されます。調査では設定サーバーにアクセスできなくなっていたため、正確なダウンロードURLは不明です。しかし、PromptSpyドロッパーと同じ銀行偽装サイト、アプリ名、アイコンを使用していること、そして特に重要な点として同じ開発者証明書で署名されていることを踏まえると、このアプリがPromptSpyのインストールへと被害者を誘導する初期段階として設計された可能性が強く疑われます。

VNCSpyとPromptSpyはどちらもVNCコンポーネントを含んでおり、被害者がユーザー補助サービスを有効にすると、オペレーターは侵害されたデバイスへの完全なリモートアクセスを得られます(図5を参照)。これにより、マルウェアのオペレーターは、デバイス上のすべての操作を監視し、あたかも物理的にデバイスを持っているかのようにタップ、スワイプ、ジェスチャー、テキスト入力を実行できます。

VNCSpyにすでに含まれている悪意のある機能に加えて、PromptSpyはAI支援型UI操作を追加します。これにより、悪意のあるアプリを「最近使ったアプリ」のリストにロックして常駐し続けます(リスト内でのロック表示の例は図6を参照)。

この機能は、VNCセッションが確立される前に、ユーザーまたはシステムが「最近使ったアプリ」のリストからPromptSpyの活動を強制終了させないように使用されると考えられます。図7は、PromptSpyとGemini AIの間のネットワーク通信を示しています。

出自

PromptSpyの分析では、簡体字中国語で書かれたデバッグ文字列が含まれていることが明らかになりました。さらに、中国語のさまざまなユーザー補助イベントタイプの処理(図8を参照)、コードでは無効化されていたものの削除されていないデバッグメソッドも含まれています。このメソッドの主な目的は、Androidデバイスで発生するさまざまなユーザー補助イベントについて、ローカライズされた中国語の説明を提供することです。これにより、生の整数コードを表示するだけでなく、中国語話者のユーザーや開発者がイベントログを理解しやすくなります。

これらの詳細から、中程度の確度ではあるものの、PromptSpyが中国語圏の環境で開発されたことが示唆されます。

分析

ESETの技術分析は、PromptSpyドロッパーとそのペイロードであるPromptSpyに焦点を当てています。PromptSpyは、ドロッパーのアセットディレクトリ内に埋め込まれています(app-release.apk)。このAPKが、中核となる悪意のある機能を保持しています。ドロッパーを起動すると、アプリの更新版と思われるものをインストールするよう促すプロンプトが表示されます。この「更新」は、実際にはPromptSpyペイロードであり、ユーザーは手動でインストールする必要があります(図9を参照)。

インストールされて起動したPromptSpyは、ユーザー補助サービスの権限を要求し、画面上のコンテンツを読み取ったり、自動クリックを実行したりする機能をマルウェアに付与します。

「Loading, please wait」画面がユーザーに表示されている間に、PromptSpyはユーザー補助サービスを使用して「最近使ったアプリ」画面を開き、詳細なUI情報(表示テキスト、コンテンツの説明、クラス名、パッケージ名、画面境界)を収集します。この動的UIスナップショットをXMLとしてシリアライズし、Geminiへのプロンプトに含めます。Geminiは、「アプリロック」ジェスチャーを実現する方法について、段階的なタップ指示を返します。

このプロセスは、以下の連続ループを形成します。

  • PromptSpyが更新されたUIコンテキストをGeminiに送信する
  • Geminiが新たな操作指示を返す
  • PromptSpyがそれらを実行し、結果の画面状態を返す

「最近使ったアプリ」でアプリが正常にロックされたことをGeminiが確認するまで、このループが続きます。構成例を以下に示します。

  • プロンプト: You are an Android automation assistant. The user will give you the UI XML data of the current screen. You need to analyze the XML and output operation instructions in JSON format to achieve the user's goal.\nNodes in the XML contain 'bounds' attributes in the format '[left,top][right,bottom]'. You need to calculate the center coordinates to generate click instructions.\n\n*** Core Judgment Rules ***\n1. **Do NOT guess that the task is completed**. Only return 'COMPLETED' when you clearly see visual evidence of success in the current UI XML (e.g., text like 'Saved', 'Success' appears, switch status becomes checked=\"true\", or the screen has navigated to the target state).\n2. If you performed the last step but the current XML does not reflect the result yet, return 'IN_PROGRESS' with action 'NONE' (or wait) to check the new UI state in the next cycle.\n3. If unsure, remain 'IN_PROGRESS' and attempt to verify.\n4. If the current UI XML is empty, use 'RECENTS' to access the recent apps list.\n\nYou can use SWIPE to scroll\/slide to find targets:\nWhen action_type = \"SWIPE\", you must provide x1,y1,x2,y2,duration_ms.\ne.g., Scroll UP: slide from bottom to top (y2 < y1).\n\nPlease strictly follow this JSON output format, do not output any Markdown tags or extra text:\n{\n \"status\": \"IN_PROGRESS\" | \"COMPLETED\" | \"IMPOSSIBLE\",\n \"reasoning\": \"Detailed explanation: what specific text or state I saw on the screen to judge the task is completed or needs next <REDACTED>User Goal: Lock the current MorganArgs app in the recent apps list. Device info: <DEVICE MODEL>\n\nCurrent UI XML: <UI>
  • Geminiの応答(操作の指示):status\": \"IN_PROGRESS\",\n \"reasoning\": \"I have accessed the recent apps list. I can see 'MorganArgs' listed in the recent apps. The next step is to long-click on the 'MorganArgs' app card to bring up the options menu, which should include an option to lock it.\",\n \"action_type\": \"LONG_CLICK\",\n \"x\": 586,\n \"y\": 1126,\n \"x1\": -1,\n \"y1\": -1,\n \"x2\": -1,\n \"y2\": -1,\n \"duration_ms\": -1\n}
  • 更新された画面結果に対するマルウェアのフォローアップ: The previous action has been executed. This is the new UI XML, please determine if the task is complete or provide the next instruction: <CURRENTLY VISIBLE ACTIVITY>

Geminiが提案されるすべての操作(タップ、スワイプ、ナビゲーション)は、ユーザー補助サービスを通じて実行されるため、マルウェアはユーザー入力なしにデバイスとやりとりできます。

PromptSpyの主な悪意のある機能は、組み込みのVNCサービス内にあります。これにより、攻撃者は被害者の画面をリアルタイムで遠隔監視し、デバイスを完全に制御できます。

マルウェアは、VNCプロトコルを使用して、ハードコードされたコマンドアンドコントロール(C&C)サーバー(54.67.2[.]84)と通信します。メッセージはハードコードされた鍵でAES暗号化されます。この通信チャネルを通じて、マルウェアは以下を実行できます。

  • Gemini APIキーを受け取る
  • インストールされているアプリのリストをアップロードする
  • ロック画面のPINまたはパスワードを傍受する
  • パターンロック解除画面を動画記録として取得する
  • 画面のオン/オフ状態を報告する
  • 現在のフォアグラウンドアプリを報告する
  • サーバーが指定したアプリの画面とユーザーのジェスチャーを記録する
  • オンデマンドでスクリーンショットを作成する

PromptSpyはまた、削除を防止するメカニズムとしてもユーザー補助サービスを悪用します。ユーザーがペイロードのアンインストールやユーザー補助サービスの無効化を試みると、マルウェアは特定の画面領域(特にstop、end、clear、Uninstallなどのサブ文字列を含むボタン上)に透明な長方形を重ねます。こうしたオーバーレイはユーザーには見えませんが、操作を妨害するため、除去が難しくなります。図11では、開発者が残したデバッグフラグを有効にした状態でPromptSpyを実行しています。このフラグを有効にすると、本来は透明な長方形に色が設定され、具体的に表示される場所を可視化できます。ただし、実際のデバイスでは完全に不可視です。

PromptSpyが画面上に不可視要素を重ねてアンインストールを阻止するため、被害者がこれを削除する唯一の方法は、セーフモードでデバイスを再起動することです。セーフモードでは、サードパーティアプリが無効化され、正常にアンインストール可能になります。

セーフモードに入るには、通常、電源ボタンを長押しし、さらに「電源を切る」を長押して、「セーフモードで再起動」のプロンプトを確認する必要があります(正確な方法はデバイスやメーカーによって異なる場合があります)。セーフモードで再起動したら、「設定」→「アプリ」→「MorganArg」を選択し、干渉を受けることなくアンインストールできます。

結論

PromptSpyは、Androidマルウェアの不穏な進化が始まっていることを浮き彫りにしています。画面上の要素を解釈し、操作方法を決定するために生成AIに依存することで、このマルウェアはほぼすべてのデバイス、画面サイズ、UIレイアウトに適応できます。ハードコードされたタップの代わりに、画面のスナップショットをAIに渡すだけで、正確な段階的な操作指示を受け取るので、UIの変更に耐性のある常駐化手法を実現しています。

より広い観点では、このキャンペーンは、生成AIがマルウェアをはるかに動的にし、リアルタイムの意思決定を可能にし得ることを示しています。PromptSpyは、生成AIを活用したAndroidマルウェアの初期の事例であり、攻撃効果を高めるために攻撃者がAIツールを迅速に悪用し始めている実態を物語っています。

ESET Japanブログ、WeLiveSecurityに掲載されているESETの研究に関するお問い合わせは、threatintel@eset.comまでご連絡ください。

ESETは、プライベートのAPTインテリジェンスレポートとデータフィードを提供しています。詳細は、ESET脅威インテリジェンスのページをご確認ください。

IOC(セキュリティ侵害の痕跡)

ファイル

IoC(セキュリティ侵害の痕跡)の詳細なリストと検体は、ESETのGitHubリポジトリに掲載されています。

SHA-1ファイル名検出説明
6BBC9AB132BA066F63676E05DA13D108598BC29Bnet.ustexas.myavlive.apkAndroid/Spy.VNCSpy.AAndroid VNCSpyマルウェア。
375D7423E63C8F5F2CC814E8CFE697BA25168AFAnlll4.un7o6.q38l5.apkAndroid/Spy.VNCSpy.AAndroid VNCSpyマルウェア。
3978AC5CD14E357320E127D6C87F10CB70A1DCC2ppyzz.dpk0p.ln441.apkAndroid/Spy.VNCSpy.AAndroid VNCSpyマルウェア。
E60D12017D2DA579DF87368F5596A0244621AE86mgappc-1.apkAndroid/Spy.PromptSpy.AAndroid PromptSpyドロッパー。
9B1723284E311794987997CB7E8814EB6014713Fmgappm-1.apkAndroid/Spy.PromptSpy.AAndroid PromptSpyドロッパー。
076801BD9C6EB78FC0331A4C7A22C73199CC3824mgappn-0.apkAndroid/Spy.PromptSpy.AAndroid PromptSpyドロッパー。
8364730E9BB2CF3A4B016DE1B34F38341C0EE2FAmgappn-1.apkAndroid/Spy.PromptSpy.AAndroid PromptSpyドロッパー。
F8F4C5BC498BCCE907DC975DD88BE8D594629909app-release.apkAndroid/Spy.PromptSpy.AAndroid PromptSpy。
C14E9B062ED28115EDE096788F62B47A6ED841ACmgapp.apkAndroid/Phishing.Agent.MAndroidフィッシングマルウェア。

ネットワーク

IPドメインホスティングプロバイダー最初に確認された日付詳細
52.222.205[.]45m-mgarg[.]comAmazon.com, Inc.2026年1月12日フィッシングWebサイト。
54.67.2[.]84N/AAmazon.com, Inc.N/AC&Cサーバー。
104.21.91[.]170mgardownload[.]comCloudflare, Inc.2026年1月13日配布Webサイト。

MITRE ATT&CKの技術

この表は、MITRE ATT&CKフレームワークのバージョン18を使用して作成されています。

手法ID名前説明
常駐化T1398ブートまたはログオン初期化スクリプトPromptSpyは、デバイス起動時に動作を開始するため、BOOT_COMPLETEDブロードキャストインテントを受信します。
T1541フォアグラウンドでの常駐化PromptSpyは、フォアグラウンドでの常駐化によりサービスを実行し続けます。
防衛機能の回避T1516入力の挿入PromptSpyは、ユーザー補助サービスを悪用し、その削除を阻止します。
認証情報へのアクセスT1417.002悪意のあるサードパーティーキーボードアプリ:GUIの入力情報の取得PromptSpyは、Androidのロック画面のPINとパスワードを傍受できます。
探査T1426システム情報の検出PromptSpyは、デバイス名、モデル、OSバージョンを取得します。
収集T1418ソフトウェアの検出PromptSpyは、インストールされたアプリケーションのリストを取得できます。
T1513画面キャプチャPromptSpyは、画面を録画できます。
C&C(コマンド&コントロール)T1663リモートアクセスソフトウェア PromptSpyは、VNCを使用して、侵害されたデバイスを遠隔操作できます。
T1521.001標準の暗号化プロトコル:対称暗号方式 PromptSpyは、AESを使用してC&C通信を暗号化します。
情報の外部への送信T1646C&Cチャネルからの送信 PromptSpyは、収集したデータを自動的にC&Cサーバーに流出させることができます。