Android アプリケーションの脆弱性について考えてみた
今月はAndroid アプリを作ってみたり、Android セキュリティのセミナーに参加してみたりしましたので、この辺で頭の中を整理してしておこうと思います。
とりあえず、Android アプリケーションの脆弱性を以下のように分類してみました。
- アクセス制御の不備
- 入力値検証の不備
- 機能の悪用
- 情報の漏えい、取扱いの不備
- インジェクション
- アプリケーション外の脆弱性
細かいところは突っ込みどころ満載ですが、大枠は外していないはず・・・?!
アクセス制御の不備
アプリケーションが提供する機能や管理するデータの適切な利用範囲を定めてアクセスを制御することと、他のアプリケーションやデバイスが提供する機能に対するパーミッション要求を必要な範囲で最小限に止めること
- アプリケーションコンポーネントのアクセス制御
アプリケーションを構成する各コンポーネント(アクティビティ、サービス、コンテントプロバイダ、ブロードキャストレシーバ)に対して、他のアプリケーションから利用できるか否かを制御します。 - ファイルコンテンツのアクセス制御
アプリケーションが利用する各種ファイル、SQLiteデータベース、プリファレンスなどに対して、他のアプリケーションから利用できるか否かを制御します。 - 他のアプリケーションが提供する機能に対するパーミッション要求
電話帳やプライベートデータを扱うコンテントプロバイダなど他のアプリケーションが提供する機能に対するパーミッションを要求するか否かを適切に定めます。 - デバイスが提供する機能に対するパーミッション要求
通信、カメラ、マイク、センサーなどデバイスが提供する機能に対するパーミッションを要求するか否かを適切に定めます。
入力値検証の不備
UIからのユーザ入力、他のアプリケーションから送信されたインテントの受信、ファイルコンテンツや通信からのデータ受信において値を検証せずに処理を実行しないこと
- 仕様外のデータ入力
入力値検証がない場合、致命的なエラーの発生や機能の停止、データの破壊・消失につながります。 - データの改ざん
入力値改ざんを検知しない場合、決済価格の改ざん、得点の改ざんなどサービス運営上の損失につながります。
機能の悪用
処理の順序性や同時性、並行性を違えた要求に対して処理を実行しないこと
- 状態による処理の実行制御
アプリケーションやデータの現在の状態に応じて処理を実行するか否かを適切に制御します。 - トランザクション制御
トランザクション制御が不十分の場合、矛盾したデータの発生やデッドロックにつながります。
情報の漏えい、取扱いの不備
アプリケーションが管理する情報を適切に取り扱うこと、必要な機密性を担保すること
- 機密情報の漏えい
画面に表示する、他のアプリケーションに連携するなどの処理によって機密情報の漏えいにつながります。 - 機密情報の保持
不必要な情報を保持しない、情報を保持する場合は暗号化するなど機密情報を適切に取扱います。
インジェクション
標準的なAndroid アプリケーションにおいて、構文があり、文法が定められたコマンドを発行するのはSQLiteのみか?
- SQLiteにおけるSQLインジェクション
SQL文の組み立てにおいて外部から与えられた値がSQLの構文に作用しないように注意します。
アプリケーション外の脆弱性
Android の脆弱性やWebアプリケーションなど連携する外部システムの脆弱性による影響がないか
- Android の脆弱性
脆弱性を回避するコード記述や警告表示、アプリケーションの提供停止を含むバージョン要件の再検討が必要となります。 - 連携システムの脆弱性
Webアプリケーションと連携する場合は、Webアプリケーションの脆弱性の検討が必要となります。