首页 存档 技术 查看内容

Linux强制访问控制机制模块代码分析报告(三)

2018-3-30 13:00 |来自: 互联网 340 0

摘要: 详细分析 模块功能描述 对于SELinux中实现的MLS,其主要通过安全级别对系统资源的访问进行**,相关操作定义在security/selinux/ss/mls.c、security/selinux/ss/context.h及security/selinux/ss/mls_types.h中,对 ...

详细分析

模块功能描述

对于SELinux中实现的MLS,其主要通过安全级别对系统资源的访问进行**,相关操作定义在security/selinux/ss/mls.c、security/selinux/ss/context.h及security/selinux/ss/mls_types.h中,对于这些操作下面会进行详细介绍,这里不再赘述。

模块内部函数调用关系

如图所示,当主体对客体进行访问时,最终都会调用avc_has_perm_noaudit()函数来检查主体是否具有相应的权限,如果访问向量缓存中没有对应的访问向量,则该函数会调用avc_compute_av()函数来计算相应的访问向量决策。avc_compute_av()函数实际上是对安全服务器中security_compute_av()函数的封装,后者根据主体和客体的安全上下文及客体类别来计算相应的访问向量,在计算访问向量时,该函数首先根据TE规则获取主体对客体的访问权限,然后根据相应的约束删除被禁止的权限,其中MLS就在此处用于权限的**。对于图中涉及的函数,这里只对MLS相关的函数进行介绍,其功能如表所示。

函数名称

函数功能

mls_level_eq()

判断安全级别是否相等,若相等则返回真

mls_level_dom()

判断两个安全级别之间的支配关系,即若参数l1的敏感属性大于参数l2的敏感属性并且l1的分类集合时l2的超集,则l1支配l2,此时函数返回真

mls_level_incomp()

判断两个安全级别是否不具有可比性,若是则返回真。该宏实际上只是简单的调用了mls_level_dom()函数

函数实现机制

对于SELinux中实现的MLS,其主要函数包括mls_level_isvalid()、mls_context_to_sid()、mls_level_eq()、mls_level_dom()及mls_level_incomp(),下面分别对其进行介绍。


(1) mls_level_isvalid()

mls_level_isvalid()函数用于根据指定的安全策略判断安全级别是否有效,若有效,返回真。该函数定义在security/selinux/ss/mls.c中,其函数头如下所示:


int mls_level_isvalid(structpolicydb *p, struct mls_level *l)


该函数包含两个参数:p表示SELinux所使用的安全策略;l表示待检查的安全级别。对于该函数,其函数调用流程图如图2-2所示,下面结合源码对该函数的主要执行步骤进行说明:

① 对参数指定的安全级别的有效性进行检查,若无效,则函数直接返回0。

② 调用hashtab_search()函数从策略中定义的敏感属性表中查找指定的安全属性对应的敏感属性,若失败,则直接返回0。

③ 调用ebitmap_for_each_positive_bit()宏遍历待检查的安全级别中每一个置位的敏感属性,如果存在,首先判断该敏感属性是否有效,如果其大于p-

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部