SELinux app權限配置


摘要:1.SEAndroidapp分類SELinux(或SEAndroid)將app划分為主要三種類型(根據user不同,也有其他的domain類型):1)untrusted_app 第三方app,沒有android平台簽名,沒有system權限2)platform_app  有android平台簽名,沒有system權限3)system_app   有android平台簽名和system權限從上面划分,權限等級,理論上:                

  • 1.SEAndroid app分類 

    SELinux(或SEAndroid)將app划分為主要三種類型(根據user不同,也有其他的domain類型):

    1)untrusted_app  第三方app,沒有android平台簽名,沒有system權限 2)platform_app    有android平台簽名,沒有system權限

    3)system_app      有android平台簽名和system權限

    從上面划分,權限等級,理論上:untrusted_app < platform_app < system_app

    2.seapp_contexts定義 

    external\sepolicy\seapp_contexts

    isSystemServer=true domain=system_server
    user=system seinfo=platform domain=system_app type=system_app_data_file
    user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file
    user=nfc seinfo=platform domain=nfc type=nfc_data_file
    user=radio seinfo=platform domain=radio type=radio_data_file
    user=shared_relro domain=shared_relro
    user=shell seinfo=platform domain=shell type=shell_data_file
    user=_isolated domain=isolated_app levelFrom=user
    user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user
    user=_app domain=untrusted_app type=app_data_file levelFrom=user

    從上面可以看出,domain和type由user和seinfo兩個參數決定。 比如:

    user=system  seinfo=platform,domain才是system_app

    user=_app,可以是untrusted_app或platform_app,如果seinfo=platform,則是platform_app。

    3.user和seinfo判定方式 

    首先看user,user可以理解為UID,例如ps -Z結果如下:

    u:r:system_app:s0              system    2414  1172  com.android.keychain
    u:r:platform_app:s0            u0_a6     2439  1172  com.android.managedprovisioning
    u:r:untrusted_app:s0           u0_a8     2460  1172  com.android.onetimeinitializer
    u:r:system_app:s0              system    2480  1172  com.android.tv.settings
    u:r:untrusted_app:s0           u0_a27    2504  1172  com.android.email
    u:r:untrusted_app:s0           u0_a28    2523  1172  com.android.exchange
    u:r:untrusted_app:s0           u0_a7     2567  1172  com.android.musicfx

    第一列是SContext,第二列是UID,只要UID是system的基本都是system_app,反過來一樣。 其他的U0_XXX要么屬於platform_app或untrusted_app

     

    seinfo由external\sepolicy\mac_permissions.xml決定,內容如下:

        <!-- Platform dev key in AOSP -->
        <signer signature="@PLATFORM" >
          <seinfo value="platform" />
        </signer>
    
        <!-- All other keys -->
        <default>
          <seinfo value="default" />
        </default>
    即如果簽名是platform,seinfo就是platform,其他的比如shared等,seinfo是default。  比如上面ps -Z的結果里面,OneTimeInitializer.apk是untrusted_app,ManagedProvisioning.apk是platform_app。 

    分別查看這兩個app的Android.mk

    packages\apps\OneTimeInitializer\Android.mk  沒有定義LOCAL_CERTIFICATE,默認是shared

    packages\apps\ManagedProvisioning\Android.mk    有定義LOCAL_CERTIFICATE := platform

    因為ManagedProvisioning.apk有platform簽名,所以seinfo是platform。

     

    TvSettings是system_app,查看對應的參數:

    packages\apps\TvSettings\Settings\Android.mk  有定義LOCAL_CERTIFICATE := platform

    packages\apps\TvSettings\Settings\AndroidManifest.xml  有定義android:sharedUserId="android.uid.system"

    TvSettings user是system,seinfo是platform,所以是system_app

    packages\apps\ManagedProvisioning\AndroidManifest.xml 沒有定義android:sharedUserId="android.uid.system"

    所以ManagedProvisioning雖然seinfo是platform,但是user不是system,因此只是platform_app,而不是system_app。

    4.app對應的te文件 system_app  ->  external\sepolicy\system_app.te  untrusted_app ->  external\sepolicy\untrusted_app.te  platform_app  ->  external\sepolicy\platform_app.te  對應的權限,通過allow語句給予,比如只有system_app才可以設置prop: 
    # Write to properties
    unix_socket_connect(system_app, property, init)
    allow system_app debug_prop:property_service set;
    allow system_app net_radio_prop:property_service set;
    allow system_app system_radio_prop:property_service set;
    auditallow system_app net_radio_prop:property_service set;
    auditallow system_app system_radio_prop:property_service set;
    allow system_app system_prop:property_service set;
    allow system_app ctl_bugreport_prop:property_service set;
    allow system_app logd_prop:property_service set;
    總結: 在引入SEAndroid后,app開發需要注意需要哪些權限,根據配置(shareuid和簽名)來決定domain,從而決定權限大小。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM