タップジャック攻撃: Android端末に潜む未知の脅威

開発者は、さまざまな脅威をもたらす経路を生み出すために、ソーシャルエンジニアリングの手口を駆使します。そして、特別に細工された「トースト通知」と呼ばれるアプリのポップアップウィンドウをタップさせるようユーザに促すアプリを作成することができます。この攻撃は、「Tapjacking(タップジャック)」と呼ばれ、Android OS を搭載した端末(以下、Android端末)における「User Interaction(UI)」のコンポーネントに存在する特定の脆弱性を利用します。

この手法は、それほど複雑なものではありませんが、Android端末を使用するユーザーにとって深刻なセキュリティ上の影響を与えます。

まず、本ブログでタップジャックの詳細を説明する前に、この UI の脆弱性がどのようにして起こるのかについて簡潔に説明します。

■概要:アプリのアクティビティ
Android端末は、アクティビティ単位で UI の要素を表示します。アクティビティとは、画面全体を使用し、異なる複数の画面を持つことができ、端末の画面における長方形の部分に表示されるシステムのコンポーネントです。

以下は、2つのビューを含むアクティビティの例です。1つは、ユーザが文字を符号化できる「テキストビュー」と呼ばれるビューで、もう1つは、ユーザがクリック(またはタップ)するボタンです。以下の図1のとおり、アクティビティは、大部分が空欄または空白であっても、全画面に表示されます。以下の図1は、アプリ “WarGames” のアクティビティのスクリーンショットです(註:本ブログで使用している画像は、不正なアプリのものではありません)。

図1:アクティビティの例
図1:アクティビティの例

アプリは、画面全体を使用する UI の要素を表す各活動を行うさまざまなアクティビティを備えています。オペレーティングシステム(OS)は、スタックと呼ばれるデータ構造を用いて異なるアクティビティを管理しています。そして、最新のアクティビティはスタックの上に表示され、古いものは下に置かれます。現在表示されているアクティビティは、常に画面の一番上に表示され、ユーザのタップやスワイプに反応可能な唯一のアクティビティです。

多くの場合、アプリは、新しいアクティビティを表示し、画面全体を占める新たな UI 画面を表示するよう設計されています。しかし、これには例外があり、アプリケーションは、場合によってアクティビティ内にビューを配置することなくビューを表示することができます。この例外に該当するのは、「ダイアログ通知」およびトースト通知です。

■ダイアログ通知とトースト通知の違い
ダイアログ通知は、主にユーザとアプリケーションがやりとりを行うために使用されます。ダイアログは、双方向のやりとりであり、ユーザにいくつかの情報を表示し、ユーザはテキストの符号化またはボタンなどのウィジェットのクリックを行うことで応答します。ダイアログ通知は、一時的に表示されるため、できるだけ小さく設計されており、ユーザは依然として何が背景にあるかを確認することができます。なお、ユーザは、ダイアログの背後のアクティビティとやりとりすることができません。

図2:ダイアログ通知
図2:ダイアログ通知

しかし、さらに興味深いのは、トースト通知です。トーストは、Android端末では、「小さなポップアップ内で操作に関する簡単なフィードバック」と規定されています。通常、トースト通知は、文章に必要な部分しか表示しておらず、ユーザは、依然として背後にあるアクティビティとやりとりが行えます。以下の図3は、トースト通知の例です。

図3:トースト通知
図3:トースト通知

トースト通知は、アプリおよび開発者によっては上記図3のような簡潔な情報を表示する場合もありますが、その大きさは固定されているわけではありません。開発者は、自身のアプリに、より大きくトーストを表示したり、以下の図4のように画像を含めたりと自由に設計することができます。

図4:画像を含むトースト通知
図4:画像を含むトースト通知

そして、この部分がトースト通知の興味深い所なのです。ビュー内に任意の画像を表示する機能は、多くの可能性をもたらすことができます。トースト通知では、単にユーザのタップやスワイプは背後のアクティビティに反応するため、不正な開発者は、隠れたアクティビティとやりとりを行うようユーザを促すために、ポルノや有名人の画像といったユーザを誘惑するような画像や偽の UI を利用します。これにより、ユーザは、不正アプリのダウンロード、オンラインでの購入、高額の料金が発生するサービスへの登録および OS の削除といったさまざまな脅威がもたらされる可能性があります。

ただし、トーストを利用し、ユーザにタップを促すためには、問題があります。通常、トースト通知は、簡単な設計しかされておらず、わずか数秒間しか表示されない場合があります。トースト通知を攻撃として効果的に利用するためには、わずか数秒ではなく、長い時間、画面に表示させておく必要があります。

これは難しい問題であるかのように思えるかもしれませんが、完全に回避できない問題というわけではありません。不正な開発者は、タイマーを利用し、この制限を回避することができます。タイマーは、あらかじめ定義された時間内にコードの一部を実行するために、Android端末向けアプリを開発するためのツール「Android SDK」で提供されています。不正な開発者は、ビューが画面上から消える前に再び表示されるようにタイマーを利用することができます。

悪意あるアプリは、タップジャックの手口としてのみ利用され、このアプリ自体は不正活動を行わないため、端末から任意のアクセス許可を取得する必要はありません。問題のアプリは、単にこれらの画面を表示するのみでそれ以上のことは行わないため、静寂コード解析だけではこのアプリを不正プログラムとして分類することが難しく、セキュリティ専門家やセキュリティソフトにとって課題となります。

トレンドマイクロの調査によると、この脅威は、バージョン2.3(コードネーム「Gingerbread」)以前のバージョンが実行されているすべての Android端末に影響を与えます。Google は、別のビューに隠れた際にやりとりのイベントを阻止する機能で、開発者がこの不具合に対処できる対応策を提供しており、これによってユーザが隠されたビューとやりとりしてしまう可能性を取り除きます。

ただし、この新しい機能は、プロパティ「filterTouchesWhenObscured」を適切に設定するか、メソッド「onFilterTouchEventForSecurity」を実行するかの2つの手法のうちどちらか一方を行うことで使用することができます。この機能は、開発者が正確にコードを変更しなければなりませんが、すべての開発者がこの機能を知っているわけではありません。また、ユーザは、このような攻撃を防ぐために、OS およびアプリケーションの両方を最新のバージョンに更新しておく必要があります。

つまり、タップジャッキングの脅威は、無関係なことではなく、長い間存在する可能性があるのです。

参考記事:

  • Tapjacking: An Untapped Threat in Android
     by Yinfeng Qiu (Mobile Threat Analyst)
  •  翻訳:栗尾 真也(Core Technology Marketing, TrendLabs)