【SELinux】Service xxx does not have a SELinux domain defined

背景:android N系統,須要集成一個第三方系統服務並在開機運行時啓動,但此係統服務是後期經過工具下載進機器中,並非初始系統img就帶有android

問題:運行此服務時,系統提示」Service xxx does not have a SELinux domain defined「,服務啓動失敗安全

一般須要增長一個系統服務,只須要在相應工程的init.xxx.rc中增長以下服務聲明便可:dom

service xxx /data/bin/xxx     //任意目錄
    class main
    user root
    group root
    disabled

on property:sys.boot_completed=1  //在合適的時機啓動服務
    start xxx

自android愈來愈重視權限保護後,新增服務須要在SELinux中註冊域,不然就會出現文中標題的錯誤。須要作如下修改:工具

在sepolicy/file_contexts中增長如下內容ui

/data/bin/xxx    u:object_r:xxx_exec:s0

而後新增xxx.te文件,在該文件中插入如下內容rest

type xxx, domain;
type xxx_exec, exec_type, file_type;

init_daemon_domain(xxx)

完成以上步驟並更新boot.img後,一般來講該系統服務就可正常運行了,但當把服務下載進機器後,仍然提示標題錯誤。code

排查過程再也不贅述,後面發現當下載到機器後,該文件的域被系統修改了:it

使用命令ls -Z查看,默認是下載到/cache/customer/bin/下,正常的域應該是「u:object_r:xxx_exec:s0 xxx 」,但被更改成了「u:object_r:cache_file:s0 xxx」io

u:object_r:cache_file:s0 xxx      錯誤

u:object_r:xxx_exec:s0 xxx        正確

 

解決辦法:在啓動服務前,經過restorecon命令從新恢復下SELinux的安全上下文便可function

on property:sys.boot_completed=1  //在合適的時機啓動服務
    restorecon /data/bin/xxx
    start xxx

 

注:android N init.rc腳本文件中支持的命令列表在system/core/init/builtins.cpp中

BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const {
    constexpr std::size_t kMax = std::numeric_limits<std::size_t>::max();
    static const Map builtin_functions = {
        {"bootchart_init",          {0,     0,    do_bootchart_init}},
        {"chmod",                   {2,     2,    do_chmod}},
        {"chown",                   {2,     3,    do_chown}},
        {"class_reset",             {1,     1,    do_class_reset}},
        {"class_start",             {1,     1,    do_class_start}},
        {"class_stop",              {1,     1,    do_class_stop}},
        {"copy",                    {2,     2,    do_copy}},
        {"domainname",              {1,     1,    do_domainname}},
        {"enable",                  {1,     1,    do_enable}},
        {"exec",                    {1,     kMax, do_exec}},
        {"export",                  {2,     2,    do_export}},
        {"hostname",                {1,     1,    do_hostname}},
        {"ifup",                    {1,     1,    do_ifup}},
        {"init_user0",              {0,     0,    do_init_user0}},
        {"insmod",                  {1,     kMax, do_insmod}},
        {"installkey",              {1,     1,    do_installkey}},
        {"load_persist_props",      {0,     0,    do_load_persist_props}},
        {"load_system_props",       {0,     0,    do_load_system_props}},
        {"loglevel",                {1,     1,    do_loglevel}},
        {"mkdir",                   {1,     4,    do_mkdir}},
        {"mount_all",               {1,     kMax, do_mount_all}},
        {"mount",                   {3,     kMax, do_mount}},
        {"umount",                  {1,     1,    do_umount}},
        {"powerctl",                {1,     1,    do_powerctl}},
        {"restart",                 {1,     1,    do_restart}},
        {"restorecon",              {1,     kMax, do_restorecon}},
        {"restorecon_recursive",    {1,     kMax, do_restorecon_recursive}},
        {"rm",                      {1,     1,    do_rm}},
        {"rmdir",                   {1,     1,    do_rmdir}},
        {"setprop",                 {2,     2,    do_setprop}},
        {"setrlimit",               {3,     3,    do_setrlimit}},
        {"start",                   {1,     1,    do_start}},
        {"stop",                    {1,     1,    do_stop}},
        {"swapon_all",              {1,     1,    do_swapon_all}},
        {"symlink",                 {2,     2,    do_symlink}},
        {"sysclktz",                {1,     1,    do_sysclktz}},
        {"trigger",                 {1,     1,    do_trigger}},
        {"verity_load_state",       {0,     0,    do_verity_load_state}},
        {"verity_update_state",     {0,     0,    do_verity_update_state}},
        {"wait",                    {1,     2,    do_wait}},
        {"write",                   {2,     2,    do_write}},
        {"init_dev_detect",         {0,     0,    do_init_dev_detect}},
    };
    return builtin_functions;
}
相關文章
相關標籤/搜索