前回はセキュアコーディングにおけるC/C++とJavaの関係をみてきました。それではAndroidのセキュリティについてはどうなのでしょうか。
Androidの脆弱性と一口にいっても様々なものがあります。Android OSのカーネルの脆弱性やデバイスドライバの脆弱性、ライブラリの脆弱性、アプリケーションの脆弱性などです。
ですが、大きく分けるとAndroid端末側の脆弱性とアプリケーション側の脆弱性、の二つに分けることができます。
端末側の脆弱性は一般のアプリケーション開発者にはどうすることもできませんが、アプリケーション側で起こる脆弱性は、各アプリケーション開発者が対処できます。ここからはAndroidで用意されているアプリケーション側のセキュリティについて説明します。
サンドボックスモデルを利用
Androidのアーキテクチャでは、「ユーザーデータの保護」「ネットワークを含むシステムリソースの保護」「アプリケーションの分離」が掲げられています。それらを実現するために、LinuxカーネルによるOSレベルでのセキュリティ、サンドボックスによるアプリケーションの保護、保護されたアプリケーション間通信、アプリケーションへの署名、パーミッションによる権限付与、などのセキュリティ機能が備えられています。
サンドボックスモデルから説明します。サンドボックスとは、アプリケーションを保護された領域内で動作させることで、システムが不正に操作されるのを防ぐセキュリティモデルです(図5)。Androidは、Linuxカーネルを基盤にして、各種ライブラリやランタイム、フレームワークといったもので構成され、その上で各アプリケーションが動作しています。
各アプリケーションは、サンドボックスモデルを使用してそれぞれの関係を分離し、実行可能な処理を制限しています。各アプリケーションは、基本的にサンドボックスの中で実行されて、外部へのアクセスが許可されていません。そのため、悪意のあるアプリケーションがシステムやリソースにアクセスできないようになっています。
このサンドボックス機能は、Linuxカーネルの機能を利用し実現しています。一般的なLinuxでは、UID(ユーザー識別子)とGID(グループ識別子)を用いて、各ユーザーのファイルなどのリソースを分離しています。ユーザーはそれぞれのグループに所属し、グループには複数のユーザーが所属することができる仕組みです。それらのグループやユーザー単位で、ファイルやデバイスといったリソースへのアクセス制限が設定されています(図6)。
Androidではこの仕組みを流用し、UID/GIDで各アプリケーションのファイルなどのリソースを分離しています。ユーザーがアプリケーションをインストールすると、システムによってそのアプリケーションにユニークなUID/GIDが割り当てられます。それ以降、アプリケーションは割り当てられたUID/GIDで実行されることになります。