コラム

「Androidセキュリティの 今・昔」 タオソフトウェア株式会社 代表取締役 谷口 岳氏

日本スマートフォンセキュリティ協会(JSSEC)は 2017 年 2 月 8 日、都内のベルサール神田において、「JSSEC セキュリティフォーラム 2017 スマートフォン/IoT、その先にある ICT社会のセキュリティについて考える」を開催しました。JSSEC では、これまで「スマートフォンのセキュリティ」をテーマに様々な活動を展開してきましたが、今回は「IoT」や「AI」「制御システム」など、スマートフォンから一歩踏み込んだ企画を用意する一方、技術部会のセッションでは、Androidのバージョンアップにフォーカス。タオソフトウェア株式会社 代表取締役 谷口 岳氏が「Androidセキュリティの 今・昔」と題し、セキュリティが進化した歴史を振り返りました。

2012年当時のAndroidのセキュリティの課題は解消されたのか?

Androidが搭載されたスマートデバイスは、以前からセキュリティに懸念があると捉えられることが少なからずありました。約5年前の2012年6月に情報処理推進機構(IPA)が発表した「IPAテクニカルウォッチ 『Androidアプリの脆弱性』に関するレポート」(以下、IPAテクニカルウォッチ)でも、複数の脆弱性について注意喚起が行われています。

こうしたイメージに対し、谷口氏は「現在のAndroidのセキュリティレベルを再認識していただきたい」と訴えました。専門家の視点から見ると「今のAndroidは安心して使える印象を持っている」といいます。
谷口氏は、その根拠として先の「IPAテクニカルウォッチ」で指摘されたAndroidアプリの脆弱性、「ファイルのアクセス制限」「コンポーネントのアクセス制限」「ログ出力の内容」「アプリの権限」について、現在はどのように改善されているのか取り上げました。

「2012年当時は、Androidにはリスクがあると騒がれていた時代。今でも当時の印象を引きずっている人は多いと思いますが、ここ数年でAndroidは大きな変化を遂げています」と述べ、それぞれどのように進化したのか説明しました。

外部ストレージのファイル、アクセス制御強化で解決

まず、谷口氏が最初に注目したのは「ファイルのアクセス制限」に関する脆弱性。外部ストレージで管理するファイルに関する問題です。
「IPAテクニカルウォッチ」では、外部ストレージでファイルを管理する際には、「SDカードに機敏な情報を保存しない」「必要に応じて、SDカードに保存するデータを暗号化する」「ファイル作成時に、ファイルへのアクセス許可を適正に設定する」ことが必要とされていました。

脆弱性が指摘された背景としては、2012年当時、アプリ同士を連携させるため、ほかのアプリから閲覧可能なファイルを作るアプリが少なくありませんでした。
開発者は、やり取りしたいデータを外部ストレージにファイルを保存し、アクセス権を持たせる手法を多く用いました。その結果、外部ストレージ上のファイルが、第三者が作ったアプリからも呼び出し可能な状態になるという脆弱性が指摘されるようになったのです。

この経緯について谷口氏は、「アプリ間のデータ連携にはいろいろな手法があります。しかし当時はドキュメントに不備もあり、開発者が連携させる手法を、よくわかっていませんでした。そのため、もっとも簡単な手法である外部ストレージを用いるケースが多く見られました」と述べました。
さらに当時は端末の内部ストレージの容量が少なかった事情も影響しました。内部ストレージには、OSやアプリをインストールしますが、空き容量が少なくなると動作に支障が生じることもあります。そこで大きなサイズのファイルは、外部ストレージを活用するケースが多くありました。

また、端末で撮影した写真データ、動画データ、あるいは音楽データを保存する先としても、外部ストレージが使用されていました。写真データなどは、撮影に使用したアプリだけでなく、写真加工アプリなどでも活用したいものです。こうしたニーズに、外部ストレージは便利な存在だったのです。

しかし、2017年の段階で、こうしたファイルアクセス制限の問題は解決したと谷口氏は述べました。「Android 4.2」からファイルを用いたデータ連携は非推奨となり、「Android 7.0」では完全に廃止。現在、データを連携させる場合は、ファイルの「アクセス制限」ではなく、「コンテンツプロバイダ」や「ファイルプロバイダ」という、より簡単な手法が用意されています。
さらに、外部ストレージの仕様そのものも大きく変更されています。「Android 1.5」では、アプリから外部ストレージが自由にアクセスできましたが「Android 1.6」では外部ストレージへの書き込みを制限し、「WRITE_EXTERNAL_STORAGE」という権限の確認を求めるようになりました。

さらに「Android 4.1」からは読み取りも制限。アプリは、「READ_EXTERNAL_STORAGE」という権限の許可を得なければアクセスできません。サイズの大きなファイルに対しても、「Android 4.4」以降、権限の設定をしなくてもアクセス可能な、アプリ専用の外部ストレージエリアが用意されています。
写真や動画、音楽などのデータについては、「Android 7.0」で「Scoped Directory Access」という機能が搭載されました。音楽やポッドキャスト、着信音、画像、動画、音楽などのタイプによって、標準のディレクトリが用意され、それを介して安全に利用できます。

アプリ内のデータは他の参照できないように標準仕様を変更

2つめの「コンポーネントのアクセス制限」について、谷口氏は「アクティビティやサービスを、ほかのアプリからアクセス可能となるよう実装をしてしまう」「コンテンツプロバイダへ他アプリからアクセスできるように実装をしてしまう」の2点を挙げました。

その要因として谷口氏は、「Androidアプリは、アクティビティ、サービス、コンテンツ、ブロードキャストという4つのコンポーネントから成り立つという概念が、開発者に伝わっていなかった」と指摘しました。
ほかのアクティビティなどを呼び出すしくみとして「インテント」があり、データを渡すサービスを特定する「明示的インテント」と、サービスを指定せずにデータを渡す「暗黙的インテント」があります。「Android 5.0」で明示的インテントを使うようルールを変更しており、セキュリティの向上を図りました。

「コンテンツプロバイダ」は、本来はデータを外部に公開する目的で、GoogleがAndroidに搭載した機能です。ところが、多くのアプリでは、ほかのアプリとの連携ではなく、アプリ自身がデータベースにアクセスするための手法として実装してしまうケースが多く見られました。
「コンテンツプロバイダ」は本来外部に公開するために用意されていたため、デフォルト値が「true(公開)」でした。そのためアプリのデータにほかのアプリからもアクセスできる状態になっていたのです。

谷口氏は、「外部に公開する必要がないのに開発効率が良いということで、コンテンツブロバイダを活用し、その結果としてデータが外部に漏れてしまいかねない状況が生まれていました」と問題点を解説しました。
こうした問題も「Android 4.2」からはデフォルト値が「False(非公開)」に変わり、解消されました。

Android 4.1でデバッグログ経由の情報漏洩問題が解決

3つめの「ログの出力」の問題について、「IPAテクニカルウォッチ」では、「デバッグログに機微な情報を含めない」「インテントを送信する際のパラメータに機微な情報を含めない」ことが挙げられていました。

この問題を谷口氏は、「アプリをデバッグする際に、ログにさまざまな情報を書いてしまうことで起こる」と原因を説明。「ユーザーID」など機微な情報もログに記載し、ほかのアプリから参照できる状況にあったといいます。しかし「Android 4.1」からデバッグログは作成したアプリからのみ参照できるように仕様が変更されました。

この問題も開発者の認識の誤りに原因があったのではないかと谷口氏は指摘します。AndroidアプリはJavaを用いて開発しますが、同じくJavaは、ログの取得が重要なサーバサイドで稼働するプログラムでも多く利用されています。
サーバサイドのプログラムと同じ感覚でAndroidのアプリを開発しているため、必要以上にログを取得、端末内に保存してしまい、情報漏洩の脆弱性につながってしまったのではないかと問題の背景を分析しました。

アプリの権限確認、イントール時から実行時へ仕様変更

4つめの「アプリの権限」ですが、これまで必要以上に権限が要求されることが問題視されていました。
従来アプリの権限は、インストール時にユーザーに確認しています。その際に「カメラを使う」「GPSを使う」など、アプリ本来の機能では必要としないはずの権限まで求めるアプリも少なからず存在していました。

しかし「Android 6.0」になって、「Runtime Permission」の機能が搭載されました。これにより、インストール時ではなく、実行時にダイアログで権限を確認するよう仕様が変更されました。
「以前は、ユーザーが権限をよく考えずにアプリを入れてしまうと、アプリによって不要な権限が取得される状態でした。しかし『Android 6.0』以降は、インストール時には権限を取得できません。ユーザーにとってよい変更でした。(谷口氏)」

一方、この仕様変更は、開発者にとっても大きな影響があります。権限の取得にあたり、ユーザーに確認を求めるダイアログを実装する必要が生じます。谷口氏によれば、実装作業が面倒と感じる開発者は、不要な権限の取得を組み込まない方向へ切り替えているとのことです。

2012年当時のAndroidの課題に対して谷口氏は、「現状では、ほとんどの問題はクリアされました。Androidも地道にセキュリティ対策を施し、比較的安全な状況にあります」と総括。「セキュリティが重要視される、金融系で用いられるようなAndroidアプリも作られています。今後も継続して、適切にセキュリティ対策を施していくことで、より安心を得られると思います」とまとめました。

【編集協力:Security NEXT 企画制作部】