2012/06/06

Android:コンテンツプロバイダのアクセス制御

コンテンツプロバイダのアクセス制御について調査しました。

■exported="false"指定のコンテンツプロバイダにアクセス

・定義
<provider
    android:authorities="yuki.provider"
    android:name=".TestProvider"
    android:exported="false" />
・例外発生
java.lang.SecurityException: Permission Denial: opening provider
    yuki.provider.TestProvider from ProcessRecord{415ae568 1100:yuki.client/10042}
    (pid=1100, uid=10042) that is not exported from uid 10040



■permissionを持たないパッケージからアクセス

・定義
<provider
    android:authorities="yuki.provider"
    android:name=".TestProvider"
    android:exported="true"
    android:permission="yuki.provider.signature" >
・例外発生
java.lang.SecurityException: Permission Denial: opening provider
    yuki.provider.TestProvider from ProcessRecord{41465b68 1198:yuki.client/10042}
    (pid=1198, uid=10042) requires yuki.provider.signature or yuki.provider.signature



■特定の文字列から始まるパスへのアクセスを許可

・定義
<provider
    android:authorities="yuki.provider"
    android:name=".TestProvider"
    android:exported="true"
    android:permission="yuki.provider.signature" >
    <path-permission
        android:pathPrefix="/allow/"
        android:permission="yuki.provider.normal" />
</provider>
※クライアント側では下記パーミッションを宣言
<uses-permission android:name="yuki.provider.normal" />
・結果
アクセス成功:content://yuki.provider/allow/
アクセス失敗:content://yuki.provider/allow



■特定のパターンを持つパスへのアクセスを許可

・定義
<provider
    android:authorities="yuki.provider"
    android:name=".TestProvider"
    android:exported="true"
    android:permission="yuki.provider.signature" >
    <path-permission
        android:pathPattern=".*\\.xml"
        android:permission="yuki.provider.normal" />
    <path-permission
        android:pathPattern="/allow/test/.*"
        android:permission="yuki.provider.normal" />
    <path-permission
        android:path="/test/yuki"
        android:permission="yuki.provider.normal" />
</provider>
※クライアント側では下記パーミッションを宣言
<uses-permission android:name="yuki.provider.normal" />
・結果
アクセス成功:content://yuki.provider/test.xml
アクセス成功:content://yuki.provider/test/test/test.xml
アクセス成功:content://yuki.provider/.xml
アクセス失敗:content://yuki.provider/test/xml
-----
アクセス成功:content://yuki.provider/allow/test/
アクセス成功:content://yuki.provider/allow/test/yuki/test
アクセス失敗:content://yuki.provider/allow/test
-----
アクセス成功:content://yuki.provider/test/yuki
アクセス失敗:content://yuki.provider/test/yuki/


以上です。