Google Playアプリが有害なIFrameに感染

This post is also available in: English (英語)

概要

先日、私たちはGoogle Playの132個のAndroidアプリが小さな非表示IFrameに感染していることを発見しました。この非表示IFrameは、有害なドメインへのリンクをローカルのHTMLページ内において張っています。感染していたアプリのうち、最も人気のあるものはそのアプリだけでインストール回数が10,000を超えています。私たちの調査から、感染したこれらのアプリの開発者に非はなく、むしろ被害者である可能性の高いことが示されています。アプリ開発者の開発プラットフォームがマルウェアに感染したのはほぼ間違いないと私たちは信じています。この場合、マルウェアはHTMLページを探し出してその末尾に有害なコンテンツをインジェクトします。もしそうであるならば、これは、開発者の自覚しないうちに感染した開発プラットフォームがモバイル用マルウェアの発生源だったという新たな状況です。私たちから調査結果がGoogle Security Teamに伝えられ、感染したアプリはGoogle Playからすべて削除されています。

図 1: Google Playの感染した全サンプルの一部
図 1: Google Playの感染した全サンプルの一部

私たちが確認した際、感染したアプリには、図1のように、チーズケーキからガーデニング、コーヒー テーブルに至るデザイン アイディア用のアプリが含まれていました。すべてのアプリに共通しているのは、Android WebViewを使って静的HTMLページを表示していることです。一見したところ、どのページもローカル保存されている図をロードし、ハードコード化済みのテキストを表示しているだけです。しかし、実際のHTMLコードを深く分析してみると、小さな非表示IFrameの存在が明らかになりました。この非表示IFrameは、良く知られた有害なドメインにリンクを張っています。リンク先のドメインは調査時にダウンしていましたが、Google Playの極めて多くのアプリが感染しているという事実は注目に値します。

それ以上に目を引くのは、感染したページの1つが、ページのローディング時に、有害なMicrosoft Windows用実行可能ファイルのダウンロードおよびインストールも試みていることです。ただし、デバイスではWindowsが稼働していないため、この実行可能ファイルは実行されません。この挙動は、Google Android Securityが先日公表したNon-Android Threat(非Android脅威)というカテゴリとよく一致します。この分類によれば、Non-Android Threatとは、ユーザーまたはAndroidデバイスに危害を及ぼすことはできないものの、他のプラットフォームに対して潜在的に有害なコンポーネントを含んでいるアプリのことを指します。

感染の起こり方

今のところ、感染したアプリはいずれもINTERNET パーミッションしか必要とせず、2つの活動を行います。活動の1つは、すきま広告をロードすることであり、もう1つはメイン アプリをロードすることです。後者の活動により、Android WebViewコンポーネントがインスタンス化され、ローカルのHTMLページが表示されます(図2)。WebViewコンポーネントはJavaScriptInterfaceを有効にします。この機能は私たちが調査したサンプルでは使われていませんが、これがあれば、ロードされたJavaScriptがアプリのネイティブ関数にアクセスすることができます。

図 2: 感染したサンプルのUI およびその背後にあるコードの例
図 2: 感染したサンプルのUI およびその背後にあるコードの例

各HTMLページは図とテキストしか表示していませんが、どのHTMLページの最後にも、小さな非表示IFrameコンポーネントが追加されています。私たちは、2つの手法がこのIFrameを非表示にするのに使われていることに気付きました。1つは、高さと幅を1ピクセルに設定してIFrameを小さくすることです。もう1つの手法は、IFrame仕様における表示属性をNoneに設定することです。最後に、単純な文字列マッチングによる検出を回避するため、送信元URLがHTML番号コードを使って難読化されます。図3に示す例では、ブラウザが以下の変換を自動的に行います。

  • ‘.’ → ‘.’
  • ‘i’ → ‘i’
  • ‘u’ → ‘u’
図 3: 感染したサンプルにおいて確認された、IFrame領域を非表示にする2つの手法
図 3: 感染したサンプルにおいて確認された、IFrame領域を非表示にする2つの手法

最終的に、すべてのIFrameの送信元は次の2つのドメインに集約されます。

  • www[.]Brenz[.]pl/rc/
  • jL[.]chura[.]pl/rc/

2013年、ポーランドのCERT(cert.pl)がこれらのドメインを2つとも支配下に置き、シンクホール サーバに振り向けてユーザーに害が及ばないようにしました(図4)。そのことを考えれば、私たちの調査時に両ドメインはマルウェアを提供していませんが、これらのドメインには悪評の高い前歴[1,2,3,4,5]があります。

図 4: 有害なドメインは両方ともシンクホール サーバに解決される
図 4: 有害なドメインは両方ともシンクホール サーバに解決される

調査中、私たちは、感染したIFrameを中に含まないものの、VBScriptスクリプト全体がHTMLにインジェクトされているサンプルも、1つ突き止めました(図5)。スクリプトにはBase64エンコード化されたWindows実行可能ファイルが含まれていました。この実行可能ファイルは、(Windowsシステム上で)このスクリプトによってデコードされ、ファイル システムに書き込まれ、実行されます。VBScriptがMicrosoft Windows独自のスクリプト言語であるため、Androidプラットフォーム上でこのスクリプトは不活性であり実行しません。したがって、このコードはAndroidユーザーには害を及ぼしません。そもそも、このコードがタグの外側に追加されており、このため、HTMLページは違反したものになっています。しかし、形式に違反があろうがなかろうが、ブラウザは常にほとんど何でも表示しようとします。これは、標準規格を完全に理解していない可能性のある人にとって、HTMLページの作成が難しくならないようにするためです。

WildFireは、削除されたPEファイル内における有害な挙動を検出します。これには、以下のものが含まれます。

  • ネットワーク ホスト ファイルの変更
  • Windowsのファイアウォール設定の変更
  • 別のプロセスへのコード インジェクション
  • 自身のコピー
図5: 感染したサンプルによるWindows実行可能ファイルの削除に関する試み
図5: 感染したサンプルによるWindows実行可能ファイルの削除に関する試み

感染元

弊社が検出した132件もの感染アプリケーションは、関連性のない7人の異なる開発者によるものでした。これら7人の異なる開発者には、地理的な関連性があります。つまり、7人全員はインドネシアへのコネを持っていました。最も簡単なヒントは、アプリケーションの名前です。検出されたかなりの数のサンプルでは、名前に“Indonesia”という語が含まれます。また、1人の開発者のWebサイトは、インドネシア語で書かれた個人ブログ ページにリンクします。最も顕著な兆候は、1人の開発者の証明書に、国名がインドネシアであることが明記されていることです。

図6: 感染したサンプルのインドネシアへの接続
図6: 感染したサンプルのインドネシアへの接続

有害なIFramesに感染したHTMLファイルの一般的な経路は、Ramnitなどのファイル感染ウイルスによります。Windowsホストを感染させた後、これらのウイルスはハード ドライブ内のHTMLファイルを検索し、IFramesを各ドキュメントに追加します。これらのウイルスの1つに開発者が感染した場合、そのアプリケーションのHTMLファイルが感染する可能性があります。ただし、すべての開発者がインドネシアを拠点としている可能性があるとはいえ、これらの開発者が同じホスティングWebサイトから、感染したIDEをダウンロードした可能性もあります。さらに、感染した同じオンライン アプリケーション生成プラットフォームを使用した可能性もあります。

いずれの場合でも、開発者と被害者の双方に、悪意はないものと弊社は見ています。また、このことを裏付ける証拠がほかにもあることを、弊社の調査は明らかにしています。

  • すべてのサンプルは、コーディング体系の面で類似しているため、同じプラットフォームから生成したものと思われます。
  • 有害なドメインは両方とも、シンクホールへの解決を活用しています。開発者がこれらすべての攻撃の大本である場合、それらのドメインを運用ドメインに置き換えて、重大なダメージを引き起こす可能性があります。
  • 感染したサンプルの1つは、Windows実行可能ファイルをダウンロードしようとします。つまり、攻撃者が標的となるプラットフォームについて無知であることを示唆しています。これは、アプリケーション開発者には当てはまらないことです。

潜在的なダメージとその軽減

現在のところ、感染したアプリケーションは、Androidユーザーに被害をもたらすことはありません。しかし、プラットフォームがマルウェア感染の“媒介”となる新たな方法になり得ます。これらのプラットフォーム自体は感染していないものの、気付かずに他のプラットフォームへマルウェアを拡散してしまう可能性があります。2015年に特定したXcodeGhost攻撃と同様、この脅威は、攻撃する開発者がエンドユーザーに対してどのような影響を与えるかを示しています。

これが、的を絞った有効な攻撃になることは簡単に想像できます。攻撃者が、現在の有害なドメインを広告URLに置き換えて、収益化することは目に見えています。これは、アプリケーション開発者から収益を奪うだけではなく、開発者の評判も失墜させてしまうことがあります。次に、攻撃者は、リモート サーバーに悪意のあるスクリプトを配置し、JavaScriptInterfaceを活用して、感染したアプリケーションのネイティブ機能にアクセスします。この感染ベクターを通して、アプリケーション内のすべてのリソースは攻撃者が利用できるようになり、その制御下にあることになります。また、密かに操作して、開発者のサーバを自身のサーバに置き換えることができます。その結果、開発者のサーバに送られた情報は、攻撃者の手に渡ることになります。高度な攻撃者は、アプリケーションの内部ロジックを直接変更することもできます。つまり、ルーティング ユーティリティを追加したり、追加の許可を宣言することができます。また、悪意のあるAPKファイルを削除して、その機能をエスカレートすることができます。

WildFireのお客様には、あらゆる感染サンプルからの保護が自動的に提供されます。WildFire内のAPK分析エンジンは、小さな非表示のIFrameを特定できるだけでなく、組み込まれたドメインとの相関付けを行うこともできます。

謝辞

調査に協力いただいたPalo Alto NetworksのZhi XuおよびClaud Xiaoに感謝いたします。感染アプリケーションの検証と対策実施の際に、迅速に対応いただいたGoogle Security Teamに深く感謝の意を表したいと思います。

付録

有害なドメイン

  • www[.]Brenz[.]pl/rc/
  • jL[.]chura[.]pl/rc/

感染したサンプルのハッシュとパッケージ名(追加サンプルは、ブログ コメントを介したリクエストで提供されます):

  • c6e27882060463c287d1a184f8bc0e3201d5d58719ef13d9ab4a22a89400cf61, com.aaronbalderapps.awesome3dstreetart
  • a49ac5a97a7bac7d437eed9edcf52a72212673a6c8dc7621be22c332a1a41268, com.aaronbalderapps.awesomecheesecakeideas
  • 1d5878dce6d39d59d36645e806278396505348bddf602a8e3b1f74b0ce2bfbe8, com.aaronbalderapps.babyroomdesignideas
  • db95c87da09bdedb13430f28983b98038f190bfc0cb40f4076d8ee1c2d14dae6, com.aaronbalderapps.backyardwoodprojects
  • 28b16258244a23c82eff82ab0950578ebeb3a4947497b61e3b073b0f5f5e40ed, com.aaronbalderapps.bathroominteriordesigns
  • b330de625777726fc1d70bbd5667e4ce6eae124bde00b50577d6539bca9d4ae5, com.aaronbalderapps.beautifulbotanicalgardens
  • d6289fa1384fab121e730b1dce671f404950e4f930d636ae66ded0d8eb751678, com.aaronbalderapps.bedroomdesign5d