SEandroid 安全机制---整体框架
|
selinux_initialize方法如下, static void selinux_initialize(bool in_kernel_domain) { Timer t; selinux_callback cb; cb.func_log = selinux_klog_callback; selinux_set_callback(SELINUX_CB_LOG, cb); cb.func_audit = audit_callback; selinux_set_callback(SELINUX_CB_AUDIT, cb); if (selinux_is_disabled) { return; } if (in_kernel_domain) { INFO("Loading SELinux policy...n"); if (selinux_android_load_policy < 0) { ERROR("failed to load policy: %sn", strerror(errno)); security_failure; } bool is_enforcing = selinux_is_enforcing; security_setenforce(is_enforcing); if (write_file("/sys/fs/selinux/checkreqprot", "0") == -1) { security_failure; } NOTICE("(Initializing SELinux %s took %.2fs.)n", is_enforcing ? "enforcing" : "non-enforcing", t.duration); } else { selinux_init_all_handles; } }selinux_set_callback设置SEAndroid日志和审计回调方法, selinux_android_load_policy加载安全策略到内核空间的SELinux LSM模块; selinux_init_all_handles打开前面分析file_contexts和property_contexts文件,以便可以用来查询系统文件和系统属性的安全上下文。 selinux_android_load_policy方法在libselinux.so库中继续执行。 android.c的selinux_android_load_policy方法如下, int selinux_android_load_policy(void) { const char *mnt = SELINUXMNT; int rc; rc = mount(SELINUXFS, mnt, SELINUXFS, 0, NULL); if (rc < 0) { if (errno == ENODEV) { /* SELinux not enabled in kernel */ return -1; } if (errno == ENOENT) { /* Fall back to legacy mountpoint. */ mnt = OLDSELINUXMNT; rc = mkdir(mnt, 0755); if (rc == -1 && errno != EEXIST) { selinux_log(SELINUX_ERROR,"SELinux: Could not mkdir: %sn", strerror(errno)); return -1; } rc = mount(SELINUXFS, mnt, SELINUXFS, 0, NULL); } } if (rc < 0) { selinux_log(SELINUX_ERROR,"SELinux: Could not mount selinuxfs: %sn", strerror(errno)); return -1; } set_selinuxmnt(mnt); return selinux_android_load_policy_helper(false); }SELINUXMNT、OLDSELINUXMNT和SELINUXFS是三个宏,它们定义在文件external/libselinux/src/policy.h文件中,如下所示: /* Preferred selinuxfs mount point directory paths. */ #define SELINUXMNT "/sys/fs/selinux" #define OLDSELINUXMNT "/selinux" /* selinuxfs filesystem type string. */ #define SELINUXFS "selinuxfs"selinux_android_load_policy方法主要逻辑如下, A.以/sys/fs/selinux为安装点,安装一个类型为selinuxfs的文件系统,也就是SELinux文件系统, 用来与内核空间的SELinux LSM模块通信。 B.如果不能在/sys/fs/selinux这个安装点安装SELinux文件系统,那么再以/selinux为安装点,安装SELinux文件系统。 C.成功安装SELinux文件系统之后,接下来就调用另外一个函数selinux_android_load_policy_helper来将 SEAndroid安全策略加载到内核空间的SELinux LSM模块中去。 security_load_policy的实现很简单,它首先打开/sys/fs/selinux/load文件,然后将参数data所描述的安全策略 写入到这个文件中去。由于/sys/fs/selinux是由内核空间的SELinux LSM模块导出来的文件系统接口, 因此当将安全策略写入到位于该文件系统中的load文件时,就相当于是将安全策略从用户空间加载到SELinux LSM模块中去了。 以后SELinux LSM模块中的Security Server就可以通过它来进行安全检查。 1.2.3. Security Server用户空间的Security Server主要是用来保护用户空间资源的,以及用来操作内核空间对象的安全上下文的, 它由应用程序安装服务PackageManagerService、应用程序安装守护进程installd、应用程序进程孵化器 Zygote进程以及init进程组成。其中,PackageManagerService和installd负责创建App数据目录的安全上下文, Zygote进程负责创建App进程的安全上下文,而init进程负责控制系统属性的安全访问。 (编辑:无忧刷机网 - 51刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




