【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;
}
相关文章
相关标签/搜索