勤快学

Linux多安全策略和动态安全策略框架模块代码分析报告(18)

Linux内核之旅  标签:Linux    发布于:2017年05月23日

5.convert_context()

当调用security_load_policy()函数加载了一个新的策略之后,就需要对客体的安全上下文进行修改。在Linux中,通过convert_context()函数来实现该功能,convert_context()函数将安全上下文c中的值由p->oldp指定的值转化为p->newp指定的值,并基于新策略确定安全上下文的有效性。其函数头如下所示:


static int convert_context(u32 key,struct context *c,void *p)


该函数包含3个参数:key表示待转换的安全上下文对应的SID;c表示待转换的安全上下文;p表示策略载入前后所使用的策略库。下面对该函数的主要执行步骤进行说明:

① 判断key是否小于等于SECINITSID_NUM,如果是,表示该SID为初始SID,函数直接返回。

② 判断待转换的安全上下文的字符串表示形式是否存在。若存在,则先复制该字符串,接着调用string_to_context_struct()函数将该字符串转化为相应的context结构体,最后根据string_to_context_struct()函数进行不同的处理,并返回。

③ 调用context_cpy()函数复制待转换的安全上下文到oldc中。

④ 调用hashtab_search()函数从新策略的用户符号表中查找待转换的安全上下文在旧策略中的用户符号串对应的安全属性,然后根据相应的值设置待转换的安全上下文c中的用户标识。

⑤ 使用同用户转换同样的方法来实现角色、类型、MLS域的转换。对于MLS域的转换根据新旧策略是否启动了MLS进行不同的处理。

⑥ policydb_context_isvalid()函数根据新策略判断安全上下文的有效性。如果某个域无效,则调用convert_context_handle_invaild_context()函数对待转换的安全上下文进行处理。

⑦ 调用context_destroy()函数释放oldc所占有的空间。

⑧ 结束并返回。

6.security_genfs_sid()

security_genfs_sid()函数用于为不支持扩展属性的文件系统、基于转换的或基于任务的标记行为的文件系统中的文件生成一个SID,函数头如下所示:


int security_genfs_sid(constchar *fstype,char *path,u16 orig_sclass,u32 *sid)


该函数包含4个参数:fstype表示文件系统的类型;path表示从文件系统的挂载点开始的路径;orig_class表示客体类别;sid表示路径对应的SID。对于该函数,其函数调用流程图如图2-15所示,下面结合源码对该函数的主要执行步骤进行说明:

① 调用unmap_class()函数获得类别映射值对应的策略内部的类别值。

② 通过for循环来判断策略库是否支持目标文件对应的文件系统,如果策略库不支持目标文件所属的文件系统,则该函数直接返回。

③ 通过for循环查找目标文件对应的安全上下文,并将结果存放到c中。如果没有找到,则该函数直接返回。

④ 判断目标文件的安全上下文对应的SID是否存在。如果不存在,则调用sidtab_context_to_sid()函数获取指定的安全上下文对应的SID。

⑤ 将目标文件的SID存放到sid中。

⑥ 结束并返回。

 


图2-15security_genfs_sid()函数调用流程图


上一篇:Imagination Creator Ci40荣获2017NED创新大奖

下一篇:Android Studio 常用技巧汇总