すべてのコンピューティングデバイスと同様、Android の AIR は、ネイティブセキュリティモデルに準拠しています。同時に、AIR では、安全なインターネット接続アプリケーションを開発者が簡単に作成できるようにするための独自のセキュリティ規則を維持しています。
Android 上の AIR アプリケーションでは Android パッケージ形式を使用するので、インストールには Android セキュリティモデルが適用されます。AIR アプリケーションインストーラーは使用されません。
Android セキュリティモデルには、次に示す主要な 3 つの要素があります。
-
権限
-
アプリケーションの署名
-
アプリケーションユーザーID
Android 権限
Android の多くの機能は、オペレーティングシステムの権限メカニズムによって保護されます。保護された機能を使用するには、アプリケーションに権限が必要であることを AIR アプリケーション記述子で宣言する必要があります。ユーザーがアプリケーションをインストールしようとすると、Android オペレーティングシステムでは、インストールを続行するために必要な権限がすべて表示されます。
ほとんどの AIR アプリケーションでは、アプリケーション記述子に Android 権限を指定する必要があります。デフォルトでは、権限は含まれていません。AIR ランタイムを通じて公開される Android の保護された機能を使用するには、次の権限が必要です。
-
ACCESS_COARSE_LOCATION
-
アプリケーションが、Geolocation クラスを介して Wi-Fi およびセルラーネットワーク位置データにアクセスすることを許可します。
-
ACCESS_FINE_LOCATION
-
アプリケーションが Geolocation クラスを介して GPS データにアクセスすることを許可します。
-
ACCESS_NETWORK_STATE and ACCESS_WIFI_STATE
-
アプリケーションが、NetworkInfo クラスを介して ネットワーク情報にアクセスすることを許可します。
-
CAMERA
-
アプリケーションがカメラにアクセスすることを許可します。
-
INTERNET
-
アプリケーションがネットワーク要求を行うことを許可します。また、リモートデバッグも許可します。
-
READ_PHONE_STATE
-
着信呼び出しがあったときに、AIR ランタイムがオーディオをミュートすることを許可します。
-
RECORD_AUDIO
-
アプリケーションがマイクにアクセスすることを許可します。
-
WAKE_LOCK および DISABLE_KEYGUARD
-
アプリケーションが、SystemIdleMode クラス設定を使用してデバイスのスリープ状態を防ぐことを許可します。
-
WRITE_EXTERNAL_STORAGE
-
アプリケーションがデバイスの外部メモリカードへ書き込むことを許可します。
アプリケーションの署名
Android プラットフォーム用に作成されたすべてのアプリケーションパッケージには署名が必要です。Android 上の AIR アプリケーションはネイティブの Android APK 形式でパッケージ化されるので、アプリケーションの署名は AIR の規則ではなく Android の規則に従って行われます。Android と AIR で使用するコード署名はよく似ていますが、次のような大きな違いがあります。
-
Android では、開発者が秘密キーを所有しているかどうかが署名によって検証されますが、開発者の ID の検証には署名が使用されません。
-
Android マーケットに送信されるアプリケーションの場合、少なくとも 25 年間有効な証明書が必要です。
-
Android では、別の証明書へのパッケージの署名の移行がサポートされません。更新の署名が別の証明書によって行われている場合、ユーザーは、更新されたアプリケーションをインストールする前に元のアプリケーションをアンインストールする必要があります。
-
同じ証明書を使用して署名された 2 つのアプリケーションでは、互いにキャッシュやデータファイルにアクセスできる共有 ID を指定できます(このような共有は AIR では容易ではありません)。
アプリケーションユーザーID
Android では Linux カーネルを使用します。インストールされたすべてのアプリケーションには Linux タイプのユーザー ID が割り当てられます。この ID によって、ファイルアクセスなどの操作の権限が決定されます。アプリケーションディレクトリ、アプリケーション記憶領域ディレクトリ、および一時ディレクトリ内のファイルは、ファイルシステムの権限によってアクセスから保護されます。外部ストレージへ書き込まれるファイル(つまり、SD カード)は、SD カードがマスストレージデバイスとしてコンピューターにマウントされている場合、他のアプリケーションまたはユーザーが読み込み、変更、削除を行うことができます。
インターネット要求と共に受け取った Cookie は、AIR アプリケーション間で共有されません。
バックグラウンドイメージのプライバシー
ユーザーがアプリケーションをバックグラウンドに切り替えると、一部の Android バージョンでは最近使用したアプリケーションリスト内のサムネイルとして使用するためのスナップショットがキャプチャされます。このスクリーンショットはデバイスメモリ内に保存され、攻撃者がデバイスの物理的な制御時にアクセスすることが可能です。
アプリケーションで機密情報を表示する場合は、このような情報がバックグラウンドのスクリーンショットによってキャプチャされないよう保護する必要があります。NativeApplication オブジェクトによって送出される
deactivate
イベントは、アプリケーションがバックグラウンドに切り替えられる直前の状態であることを通知するものです。このイベントを使用して、機密情報を消去するか隠してください。
Android における暗号化されたデータ
Android 上の AIR アプリケーションでは、ビルトイン SQL データベースに用意されている暗号化オプションを使用して、暗号化されたデータを保存できます。最適なセキュリティを確保するため、アプリケーションが実行されるたびに入力されるユーザー入力のパスワードに基づいた暗号化キーを使用してください。ローカルに保存された暗号化キーやパスワードは、アプリケーションファイルにアクセス可能な攻撃者から「隠す」のが難しいか、不可能です。攻撃者がキーを取得できると、データを暗号化しても Android システムに用意されているユーザー ID ベースのファイルシステムセキュリティ以上の保護は行われません。
EncryptedLocalStore クラスはデータの保存に使用できますが、そのデータは Android デバイスでは暗号化されません。代わりに、Android のセキュリティモデルではアプリケーションのユーザー ID を使用して、他のアプリケーションからデータを保護します。共有ユーザー ID を使用し、かつ同じコードサイニング証明書を使用して署名されているアプリケーションは、暗号化されたローカルストアとして同じものを使用します。
重要:
ルート化された電話では、ルート権限で実行されたアプリケーションが他のあらゆるアプリケーションのファイルにもアクセスできます。そのため、暗号化されたローカルストアを使用して保存されたデータは、ルート化されたデバイスでは安全ではありません。