以下内容节选自本书
理解了守护进程的安全上下文的创建过程后,我们再看看应用进程的安全上下文是如何创建的。应用进程是通过Zygote进程fork出来的,但是不会调用exec。在前面介绍Zygote进程时我们已经知道了创建应用进程时会调用函数ForkAndSpecializeCommon(),这个函数则通过调用selinux_android_setcontext()函数来设置应用进程的安全上下文,如下所示:
rc =selinux_android_setcontext(uid,is_system_server,se_info_c_str,se_name_c_str);
selinux_android_setcontext()函数的代码如下:
intselinux_android_setcontext(uid_t uid, int isSystemServer,
const char *seinfo, const char *pkgname)
{
char *orig_ctx_str = NULL, *ctx_str;
context_t ctx = NULL;
int rc = -1;
......
__selinux_once(once, seapp_context_init); // 调用一次seapp_context_init函数
rc = getcon(&ctx_str); // 得到当前进程从Zygote进程继承的安全上下文
......
ctx = context_new(ctx_str); // 以ctx_str为模板创建一个新的安全上下文
orig_ctx_str = ctx_str;
......
// 在SEAPP_DOMAIN中查找新的安全上下文
rc = seapp_context_lookup(SEAPP_DOMAIN, uid,isSystemServer, seinfo, pkgname, ctx);
...... // 检查新的安全上下文
if (strcmp(ctx_str, orig_ctx_str)) { // 如果新的安全上下文和原来的不相同
rc = setcon(ctx_str); // 为当前进程设置安全上下文。
if (rc < 0)
goto err;
}
......
return rc;
}
selinux_android_setcontext()函数首先调用了seapp_context_init()函数来装载“seapp_context”文件的内容。然后通过函数seapp_context_lookup()查找合适的安全上下文,最后调用setcon()函数来设置进程的安全上下文。我们先看看seapp_context_init()函数的代码:
static voidseapp_context_init(void)
{
selinux_android_seapp_context_reload();
}
seapp_context_init()函数只是调用了selinux_android_seapp_context_reload()