JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「4.3. Content Provider を作る・利用する」のものとなります
詳細やサンプルコードについては原著の方を参考ください
チェックポイント
- 常時サービスを提供しない場合、一時許可Content Providerを使用している
- アプリ内のみで利用する場合は、非公開設定している
-
返送先アプリからの結果情報漏洩に注意している
- updateやdelete等の対象となったレコード数が結果情報として返送されるため、それらがセンシティブな意味を持つ場合は特に注意する必要があります
- Permissionの再委譲問題を起こしていない
- 作成側はリクエストとのパラメーターの安全性を確認している
- 利用側は受信データの安全性を確認している
非公開Content Provider
- 作成側
-
Android2.2以前で使用していない(実装できない)
- Android2.2以前では非公開設定は機能しません。DB等へ直接アクセスすることで代用できます
- exported="false"により、明示的に非公開設定している
公開Content Provider
- 作成側
- exported="true"により、明示的に公開設定している
- センシティブな情報を返送していない
- 不特定多数に利用されるため、データの抜き取りや、改竄される可能性を考慮している
- 利用側
- センシティブな情報をリクエストに含めていない
- 独自作成のContentProviderを利用する場合、成りすましたマルウェアにリクエストパラメーターを受信されたり、攻撃結果データを受け取る可能性を考慮している
- AndroidOS既定のものに関しては成りすまされることはありません
パートナー限定Content Provider
- 作成側
- exported="true"により、明示的に公開設定をしている
- 利用元アプリの証明書がホワイトリストに登録されていることを確認している
- 開示して良い情報のみ返送している
- 利用側
- 利用先アプリの証明書がホワイトリストに登録されていることを確認している
- パートナーに開示してよい情報のみリクエストに含まれている
自社限定Content Provider
- 作成側
- 独自定義Signature Permission を定義している
- 独自定義Signature Permission を要求宣言している
- exported="true"により、明示的に公開設定している
- 独自定義Signature Permission が自社アプリにより定義されていることを確認している
- 利用元アプリと同じ開発者鍵でAPK を署名している
- 利用側
- 独自定義Signature Permission を利用宣言している
- 独自定義Signature Permission が自社アプリにより定義されていることを確認している
- 利用先Content Provider アプリの証明書が自社の証明書であることを確認している
- 利用先アプリと同じ開発者鍵でAPK を署名している
一時許可Content Provider
基本的には非公開のContentProviderですが、特定のアプリに対して、一時的に特定URIへのアクセスを許可するContentProviderです
Content Provider 側アプリが能動的に他のアプリに、または、アクセス許可を求めてきた他アプリに受動的に、一時的なアクセス許可を与えることができます
- 作成側
- Android 2.2(API Level 8)以前では実装しない
- exported="false”により、一時許可するPath 以外を非公開設定している
- grant-uri-permission により、一時許可するPath を指定している
- 開示してよい情報のみ返送している
- 一時的にアクセスを許可するURI をIntent に指定している
- 一時的に許可するアクセス権限をIntent に指定している
- 一時的にアクセスを許可するアプリに明示的Intent を送信している
- 一時許可の要求元アプリにIntent を返信している
- 利用側
- センシティブな情報をリクエストに含めていない
参考
『Android アプリのセキュア設計・セキュアコーディングガイド』【2016年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf