前回はセキュアコーディングにおけるC/C++とJavaの関係をみてきました。それではAndroidのセキュリティについてはどうなのでしょうか。

 Androidの脆弱性と一口にいっても様々なものがあります。Android OSのカーネルの脆弱性やデバイスドライバの脆弱性、ライブラリの脆弱性、アプリケーションの脆弱性などです。

 ですが、大きく分けるとAndroid端末側の脆弱性とアプリケーション側の脆弱性、の二つに分けることができます。

 端末側の脆弱性は一般のアプリケーション開発者にはどうすることもできませんが、アプリケーション側で起こる脆弱性は、各アプリケーション開発者が対処できます。ここからはAndroidで用意されているアプリケーション側のセキュリティについて説明します。

サンドボックスモデルを利用

 Androidのアーキテクチャでは、「ユーザーデータの保護」「ネットワークを含むシステムリソースの保護」「アプリケーションの分離」が掲げられています。それらを実現するために、LinuxカーネルによるOSレベルでのセキュリティ、サンドボックスによるアプリケーションの保護、保護されたアプリケーション間通信、アプリケーションへの署名、パーミッションによる権限付与、などのセキュリティ機能が備えられています。

図5●Androidのサンドボックス機能
図5●Androidのサンドボックス機能
[画像のクリックで拡大表示]

 サンドボックスモデルから説明します。サンドボックスとは、アプリケーションを保護された領域内で動作させることで、システムが不正に操作されるのを防ぐセキュリティモデルです(図5)。Androidは、Linuxカーネルを基盤にして、各種ライブラリやランタイム、フレームワークといったもので構成され、その上で各アプリケーションが動作しています。

 各アプリケーションは、サンドボックスモデルを使用してそれぞれの関係を分離し、実行可能な処理を制限しています。各アプリケーションは、基本的にサンドボックスの中で実行されて、外部へのアクセスが許可されていません。そのため、悪意のあるアプリケーションがシステムやリソースにアクセスできないようになっています。

図6●LinuxにおけるUID/GIDのイメージ
図6●LinuxにおけるUID/GIDのイメージ
[画像のクリックで拡大表示]

 このサンドボックス機能は、Linuxカーネルの機能を利用し実現しています。一般的なLinuxでは、UID(ユーザー識別子)とGID(グループ識別子)を用いて、各ユーザーのファイルなどのリソースを分離しています。ユーザーはそれぞれのグループに所属し、グループには複数のユーザーが所属することができる仕組みです。それらのグループやユーザー単位で、ファイルやデバイスといったリソースへのアクセス制限が設定されています(図6)。

 Androidではこの仕組みを流用し、UID/GIDで各アプリケーションのファイルなどのリソースを分離しています。ユーザーがアプリケーションをインストールすると、システムによってそのアプリケーションにユニークなUID/GIDが割り当てられます。それ以降、アプリケーションは割り当てられたUID/GIDで実行されることになります。