一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于KFramework的SELinux安全策略形式化验证方法

2022-11-19 06:58:02 来源:中国专利 TAG:

一种基于kframework的selinux安全策略形式化验证方法
技术领域
1.本发明设计计算机软件验证技术领域,尤其是一种基于kframework的selinux安全策略形式化验证方法。


背景技术:

2.selinux(security enhanced linux)安全策略:
3.在访问控制领域,运行中的程序,或者内存中的进程和线程被称为主题,而被主体操作的对象,或者一般意义上的文件资源被称为客体;
4.在传统的访问控制,即自主访问控制中,对客体的访问控制是根据主体的身份以及所属的组来实现的,即不区分用户与程序的概念,用户只依靠那些并非由自己创建的程序在计算机上执行操作,也就是说对于用户而言并没有真正的权限管理。
5.selinux是强制访问控制的一种经典实现,访问控制由操作系统或者系统管理员实现,目标是限制主体对客体执行某种操作的能力,每当一个主体尝试访问某个客体时,都会由操作系统内核强制实施授权规则——检查安全属性并决定是否可以访问,任何主体对任何客体的任何操作都会有与之相对应的授权规则,而任何用户也无法覆盖或者修改策略,安全管理员定义的策略得以在原则上保证向所有用户强制实施。
6.selinux作为经典的mac实现案例,已经进入上游linux内核多年,在一些追求稳定以及安全的linux发行版上selinux也被设置为默认开启的。
7.现有的技术有:
8.根据安全模型提取安全性质,根据安全性质编写相应的策略分析工具,先处理策略文件,在解析策略语句,再通过建立模型等方式对其性质进行验证。综上,现有技术的缺陷在于:
9.1)现有针对selinux策略的验证技术主要是针对安全模型编写分析工具然后再用分析工具对策略进行验证;
10.2)针对某种特定安全模型编写的分析工具往往针对性过强而缺乏泛用性;
11.3)编写分析工具的过程中策略文件解析的工作具有很多重复性。


技术实现要素:

12.本发明是针对现有对selinux策略以及类似安全策略验证技术的不足而设计的一种基于kframework的selinux安全策略形式化验证方法,利用kframework提供的语法解析功能,对策略配置源文件进行处理,再利用其语义执行功能,对策略进行安全性质的分析与验证,而且已经写好的语法和语义可以重复利用,可以验证多个安全模型,极大的简化了策略验证所需要的工作,方法简便,成本低廉且可靠性高,有效提高了问题的求解效率。本发明是通过以下技术方案来实现的:
13.本发明公开了一种用于selinux安全策略的形式化验证方法,
14.s1.对selinux安全策略语言进行建模,整理出bnf文法;
15.s2.在kframework中定义selinux安全策略语言的语法,定义好的selinux安全策略语言的语法为根据selinux安全策略语言的bnf文法写成的k framework中的syntax语句;
16.s3.以kframework中定义好的selinux安全策略语法为载体,通过selinux安全策略语言中语句的含义,对selinux安全策略语言的语义进行形式化建模,在kframework中以配置项和重写规则的形式写出来;
17.s4.获取安全模型;
18.s5.根据安全模型得到需要关注的安全属性以及相应约束;
19.s6.根据安全属性及约束在k中编写相应的规格,得到k中的规格代码;
20.s7.通过(k提供的编译器kompile)对s2得到的syntax语句部分、s3得到的以配置项和重写规则的形式写出来的语义部分、s6得到的规格部分编译k代码,得到selinux安全策略语言的语义执行环境;
21.s8.获取待验证的selinux安全策略源码;
22.s9.将selinux安全策略源码作为s8中得到的语义执行环境的输入,做语义执行,得到语义执行结果;
23.s10.根据语义执行结果判断安全属性是否被满足,得出验证结果。
24.作为进一步地改进,本发明所述的步骤s1,s2,s3中从语言层面对selinux做了形式化建模,将selinux策略语言的语法、语义用统一的语言(k代码)进行了明确描述。
25.作为进一步地改进,本发明所述的步骤s2中selinux策略语言的语法、s3中selinux安全策略语言中语句的含义从selinux官方提供的文档或者手册中获取,确保其正确性。
26.作为进一步地改进,本发明所述的步骤s5中的安全模型需要有明确形式化描述,包括模型中的状态量及状态量之间的约束关系。
27.作为进一步地改进,本发明所述的步骤s6中的安全属性是模型中状态量的约束关系。
28.作为进一步地改进,本发明所述的步骤s6中的规格是在原有的配置项和重写规则上做出的额外补充。
29.作为进一步地改进,本发明所述的步骤s8中需要获取的selinux安全策略源码是经过宏展开的、符合selinux安全策略语法的单文件源代码。
30.作为进一步地改进,本发明所述的步骤s9中语义执行的结果以配置项的最终状态来程序,如果配置项中还有未处理的语句,则表示该语句不满足s6中根据安全属性所编写的规格。
31.本发明的有益效果如下:
32.采用了语义框架k framework来做对selinux安全策略语言的形式化建模,k是一个基于重写的可执行语义框架,在其中可以使用配置和规则定义编程语言,类型系统和形式化分析工具。配置以称为单元的单元组织状态,这些单元被标记并且可以嵌套。k重写规则明确了术语的哪些部分是只读的、只写的、读写的或未使用的。这使得k适合定义真正的并发语言,即使在存在共享的情况下也是如此。计算被表示为原始语言抽象句法的句法扩展,使用嵌套列表结构对计算任务(例如程序片段)进行顺序化。计算就像重写环境中的任
何其他术语一样:它们可以匹配、从一个地方移动到另一个地方、修改或删除。这使得k适用于定义控制密集型功能,例如突然终止、异常或call/cc。
33.从语言层面对selinux安全策略做形式化建模,抽象层次更高,忽略了selinux安全策略具体实现中与操作系统内核强耦合的部分,只需关注策略本身的安全性质。
34.所获得的selinux策略语言的语法和语义在k中的描述是可以重用的,可以用于多种安全模型,泛用性高。
35.如果所验证的安全策略不符合安全模型的约束,所获得的语义执行环境可以准确定位问题所在。
附图说明
36.图1表示本发明完整操作流程图;
37.图2表示本发明装置结构示意图。
具体实施方式
38.本发明公开了一种基于kframework的selinux安全策略分析与验证方法及装置,包括:
39.1.根据selinux策略语言的语法和语句含义对selinux策略语言做形式化建模,并以统一的k代码的形式描述;
40.2.从待验证的安全模型中提取出安全属性以及相应的约束,并同样k代码描述,得到关于安全模型的规格;
41.3.编译k代码(包括语法、语义、规格)部分,得到selinux策略语言的语义执行环境;
42.4.将待验证的selinux的安全策略作为语义执行环境的输入,做语义执行,得到执行结果;
43.5.根据语义执行结果分析验证结果;
44.下面结合说明书附图、通过具体实施例对本发明的技术方案作进一步地说明:
45.一种基于k framework的selinux策略分析与验证方法,其特点是利用k framework的语法树解析和语义执行功能对selinux策略配置文件进行解析和安全性质的验证,其方法具体包括以下步骤:
46.a1,对selinux安全策略语言进行建模,整理出bnf文法;
47.a2.在kframework中定义selinux安全策略语言的语法,定义好的selinux安全策略语言的语法为根据selinux安全策略语言bnf文法写成的kframework中的syntax语句;
48.a3,以kframework中定义好的selinux安全策略语法为载体,通过selinux安全策略语言中语句的含义,对selinux安全策略语言的语义进行形式化建模,在kframework中以配置项和重写规则的形式写出来;
49.a4,获取安全模型;
50.a5,根据安全模型得到需要关注的安全属性以及相应的约束;
51.a6,根据安全属性以及相应约束在k中编写相应规格,得到k中的规格代码;
52.a7,通过(k提供的编译器kompile)编译k代码(包括之前得到的语法部分、语义部
分、规格部分),得到selinux安全策略语言的语义执行环境;
53.a8,获取待验证的selinux策略源码;
54.a9,将selinux安全策略源码作为8中得到的语义执行环境的输入,做语义执行,得到语义执行结果;
55.a10,根据语义执行结果判断安全属性是否被满足,得出验证结果。
56.图2表示本发明装置结构示意图,本发明还公开了一种基于kframework的selinux策略的形式化验证装置,包括
57.k framework,一个可执行语义框架,用于对selinux策略语言做形式化建模;
58.selinux策略语言建模,包括selinux策略语言的bnf语法和语义;
59.selinux策略语言语法解析器,在k中完成,用于解析selinux策略源码,生成语法树;
60.selinux策略语言语义执行环境,在k中完成,用于在k中对selinux策略源码作语义执行;
61.selinux语义执行结果分析器,用于分析语义执行结果,得出验证结论。
62.其中,步骤a1、a2、a3中对selinux策略语言的形式化描述将在kframework中以k代码的形式展现;
63.步骤a1、a2、a3中关于对selinux策略语言进行形式化建模所需要的selinux策略语言的语法和语句含义,应该从selinux官方文档或者手册中获取;k中的语法必须要按其特定的格式来写,即k中的syntax语句。
64.k中的syntax语句分为左右两部分
65.syntax boolean::="true"|"false"
66.左边是一个sort,可以理解为k中的语法类型,右边定义一个production,production可以有两种类型,constructor和function,书写语义就是书写constructor。
67.k中syntax语句的语法是按照bnf文法的规则来的,所以可以先将语句整理为bnf文法,再按k中的形式写出来。
68.书写语义的步骤可以大致分为:
69.1.选择语句,整理语句的结构
70.2.将语句的结构写成bnf文法
71.3.将bnf文法转化成k中constructor的形式
72.k中的配置项可以理解为程序运行时的各种状态量,如果把程序的运行当作图灵机状态转移的过程,那么配置项的意义就在于设置各种状态的初始阶段,而配置项的最后状态也就代表了程序执行的结果。
73.设置配置项的步骤大致可以分为:
74.整理出selinux策略配置中需要关注的状态量
75.确定状态量应有的数据结构和初始值
76.书写配置项
77.selinux策略语言在k中的语义可以通过重写规则来呈现,k中的重写规则可以理解为简单的替换,类似于符号执行的过程,k会在执行的时候对每一个语法单元进行重写规则的匹配,如果有匹配成功的规则就按照规则对其进行规约,直到没有规则可以成功匹配,
执行结束。
78.书写语义的步骤可以大致分为:
79.确定要进行处理的语法单元,这里的语法单元必须要为已被syntax语句定义的production
80.确定语义所影响的状态量及其下一个状态
81.对语法单元和状态量书写重写规则
82.确定语义所需要的约束条件
83.根据规约条件补充requires语句
84.步骤a5中的安全模型需要有明确形式化描述,包括模型中的状态量及状态量之间的约束关系。
85.步骤a6中的安全属性是模型中状态量的约束关系。
86.步骤a6中的规格是在原有的配置项和重写规则上做出的额外补充.
87.安全模型是对一个安全系统的建模,描述一个总是安全的系统,其中包含了一个有限状态机,其每一个状态都是满足安全要求的。安全性质即安全模型的性质。
88.将安全性质以k的规格书写出来的步骤可以大致分为:
89.根据安全模型的要求得到安全性质
90.确定各种安全性质所依赖的状态量或者配置项
91.将安全性质转化为状态量或者配置项之间的关系或者约束
92.将状态量间的约束用逻辑语言描述出来
93.将约束的逻辑描述写成requires语句或者重写规则步骤a7中编译用到的编译器kompile是kframework中内置的,可以将k代码编译成kore中间代码。
94.步骤a8中需要获取的selinux安全策略源码是经过宏展开的、符合selinux安全策略语法的单文件源代码。
95.获取的selinux策略源码会作为语义执行的输入。
96.k最后会以配置项的最终状态作为雨语义执行的结果,如果所有语句都被正确规约,k cell最后为空,说明所有的规格都被以某种方式正确处理,反之说明有语句不符合规格,即k cell中的下一条语句。
97.selinux policy语句结构示意:
98.class《class_name》[inherits《common_name》][{《perm_set》}]
[0099]
其中
[0100]
[]表示其中的内容是可选的
[0101]
《》表示非终止符,其余表示字面量
[0102]
k关键概念介绍
[0103]
k中的sort表示一个语法类别,可以出现在syntax语句的左边
[0104]
k中的syntax语句用来描述语法,也可以用来进行一些基本的函数包装
[0105]
k中的配置项用来记录语义执行的状态,配置项的初始状态表示程序的初始状态,包括输入,配置项的最终状态即是语义执行的结果
[0106]
k中的重写规则用rule语句表示,表示把在一定的规则下把某个语法单元规约为另一个语法单元
[0107]
k按照定义的syntax来分析输入文件,生成语法树并按照重写规则进行语义
[0108]
执行
[0109]
在k中验证安全性质就是将安全性质转化为形式语言后在k的语义执行过程
[0110]
中进行证明
[0111]
k syntax示意
[0112]
syntax classaccess::="class"classname"inherits"commonname
[0113]
|"class"classname"inherits"commonname
[0114]
{permnames}
[0115]
|"class"classname{permnames}
[0116]
其中
[0117]
双引号""表示其中的内容是字面量
[0118]
classname这种大写字母开头的表示k中的sort,即语法单元,可以成为语
[0119]
法树上的一个节点
[0120]
k配置项示意
[0121]
configuration《k》$pgm:k《/k》
[0122]
k的配置以xml标签的形式表达,标签的名字表示配置名,标签的内容表示配置项的值
[0123]
小写的k标签是一种特殊的标签,表示了待规约的语法项,会被初始为语义执行的输入
[0124]
k重写规则示意
[0125]
rule《k》.pgm=》....《/k》
[0126]
表示当输入为空的时候结束重写
[0127]
语义执行结果示意
[0128]
《generatedtop》
[0129]
《k》.《/k》
[0130]
《/generatedtop》
[0131]
表示所有语句都分析完毕。
[0132]
对于selinux配置中的语句,可以将其大致分为以下几个部分:
[0133]
对象与类
[0134]
类型强制
[0135]
访问控制
[0136]
用户与角色
[0137]
约束语句与条件语句
[0138]
多级安全
[0139]
下面通过具体例子来说明如何在k中撰写语义到验证安全性质。
[0140]
selinux为操作系统中的每种资源都规定了若干可执行的操作,被称为permission,每个资源实例被称为一个object,而资源的类别被称为class,同时也提供了由若干permission组成的集合common用来同时指定多个permission。
[0141]
首先在《selinux by example》一书中可以找到关于class,permission,common的
相关声明语句结构:
[0142]
class《class_name》
[0143]
common《common_name》{《perm_set》}
[0144]
class《class_name》[inherits《common_name》][{《perm_set》}]
[0145]
分别表示class声明,common声明,为class关联permission。
[0146]
其中用《》括起来的部分表示非终结符,其余则为字面量
[0147]
这些语句的语法在k中用syntax语句写出来是:
[0148]
syntax classname::=id
[0149]
syntax commonname::=id
[0150]
syntax permname::=id
[0151]
syntax permnames::=list{permname,""}
[0152]
syntax classdecl::="class"classname
[0153]
syntax commondecl::="common"commonname{permnames}
[0154]
syntax classaccess::="class"classname"inherits"commonname
[0155]
|"class"classname"inherits"commonname
[0156]
{permnames}
[0157]
|"class"classname{permnames}
[0158]
在k中非终结符即是一个sort,终结符或者字面量用双引号""引起来。
[0159]
在k中可以用`list`来表示若干相同语法单元排列的结构,其效果等价于
[0160]
syntax permnames::=permname""permnames
[0161]
|.permnames
[0162]
对于稍复杂的情况,比如访问控制语句的结构
[0163]
《rule_name》《type_set》《type_set》:《class_set》《perm_set》;
[0164]
其《type_set》在《selinux by example》中的描述(翻译后)为:
[0165]
一个或者多个类型或者属性,在源类型和目标类型之间有分隔,
[0166]
多个类型和属性需要用括号括起来并用空格分隔,比如
[0167]
{bin_tsbin_t},类型可以通过在前面加一个-表示被排除在集
[0168]
合外(比如,{exec_type-sbin_t}),关键词self被用在目标
[0169]
类型中表示和源类型一样,neverallow语句中还允许用通配符*
[0170]
表示取所有,或者在大括号外加一个-表示取补集
[0171]
对于这种有着复杂结构的语法单元,需要层层梳理
[0172]
一个type_set可以由一个type/attribute组成
[0173]
syntax typeset::=typename
[0174]
也可以由多个type/attribute组成,这时需要用`{}`括起来
[0175]
syntax typeitems::=list{typeitem,""}
[0176]
syntax typeset::="{"typeitems"}"
[0177]
可以在type前加一个减号-表示排除在外
[0178]
syntax typeitem::=typename
[0179]
|"-"typename
[0180]
可以用通配符表示所有type
[0181]
syntax wildcard::="*"
[0182]
syntax typeset::=wildcard
[0183]
可以在整个《type_set》前加~表示取补集
[0184]
syntax typeset::="~""{"typeitems"}"
[0185]
然后就有了《type_set》在k中的语法定义
[0186]
syntax typeitem::=typename
[0187]
|"-"typename
[0188]
syntax typeitems::=list{typeitem,""}
[0189]
syntax wildcard::="*"
[0190]
syntax typeset::=typename
[0191]
|"{"typeitems"}"
[0192]
|"~""{"typeitems"}"
[0193]
|wildcard
[0194]
其他部分也类似。
[0195]
在k中为selinux设计配置项需要考虑selinux运行时的状态量,并为状态量设计数据结构,k中已经提供了一些基本的数据额结构,比如set,map,list。
[0196]
拿对象与类模块来举例,需要有一个状态量来记录已经声明的class,已经声明的common,以及common和permssions之间的关系、class和permission之间的关系。
[0197]
已经声明的class应该是一个集合,初始是一个空的集合
[0198]
已经声明的common应该是一个集合,初始应该是一个空集合
[0199]
common和permission之间的关系应该是一个映射,每个common指向其关联的所有permission
[0200]
class和permission之间应该也是一个映射,每个class指向其关联的所有
[0201]
permission k中的配置项以xml标签的形式存在,配置项的结构应该类似于:
[0202]
《classes》...c1 c2 c3...《/classes》
[0203]
《commons》...cm1 cm2 cm3...《/commons》
[0204]
《class-perms》
[0205]
...
[0206]
c1|-》p1 p2 p3...
[0207]
c2|-》p2 p3 p4...
[0208]
《/class-perms》
[0209]
《class-perms》
[0210]
...
[0211]
cm1|-》p1 p2 p3...
[0212]
cm2|-》p2 p3 p4...
[0213]
《/class-perms》
[0214]
配置项的初始状态
[0215]
《classes》.set《/classes》
[0216]
《commons》.set《/commons》
[0217]
《class-perms》.map《/class-perms》
[0218]
《common-perms》.map《/common-perms》
[0219]
在k中为语句书写重写规则,需要考虑到语句所影响的配置项、配置项的变化、已经语句规约所需要的条件。
[0220]
拿k中很重要的访问控制语句来举例,
[0221]
allow{user_t domain}{bin_tfile_typesbin_t}:file execute;这条语句声明一条访问规则,表示允许从{user_t domain}到{bin_tfile_typesbin_t}的file上的execute操作。
[0222]
与该相关的配置项
[0223]
《allow》.set《/allow》
[0224]
表示所有allow语句作用下的访问控制向量
[0225][0226]
该访问规则解析后,配置项的状态应类似于
[0227]
《allow》
[0228]
...
[0229]
user_tbin_t file|-》execute
[0230]
domain bin_t file|-》execute
[0231]
user_tfile_type file|-》execute
[0232]
domain file_type file|-》execute
[0233]
user_tsbin_t file|-》execute
[0234]
domain sbin_t file|-》execute
[0235]
...
[0236]
《/allow》
[0237]
因此,要先对访问控制语句进行化简,将一条访问控制语句分解为若干只声明单个源类型、单个目标类型、单个类的简单语句,事实上,还要考虑通配符、取补集、剔除这些特殊写法。
[0238]
为了区分访问控制语句在化简过程中的各种状态,可以添加额外的语法
[0239]
syntax accesvector::=rulenametypesettypeset:classname perms
[0240]
syntax normalaccessvector::="normal"accessvector
[0241]
syntax finalaccessvector::="final"accessvector
[0242]
先处理通配符、取补、剔除:
[0243]
rule《k》r:rulename t1:typeset t2:typeset:c:classsetp:perms
[0244]
=》normal r resolvetype(t1,at,ts)resolvetype(t2,at,ts):cp
[0245]
...《/k》
[0246]
《attr-types》at《/attr-types》
[0247]
完成重写规则的书写后,k已经可以正确的处理每一条语句,接下来应该考虑安全模型的验证了,在这里以biba的完整性模型为例。
[0248]
biba的完整性模型要求对访问控制中的资源做完整性分类,低完整性的主体不能
对高完整性的客体进行写入操作,对于一个访问控制向量
[0249]
type
source
type
target
:classperm
[0250]
需要有
[0251][0252]
需要做的有:
[0253]
为所有的type进行完整性分类
[0254]
验证所有的访问控制向量。
[0255]
关于对所有的type进行完整性分类,这里简单起见,采用一种平凡的分类,分成两种完整性级别:高完整性(trusted)和低完整性(untrusted),下面在k中定义这两种完整性
[0256]
首先声明哪些类型是高完整性的(trusted):
[0257]
syntax trustedtypename::="root_t"
[0258]
|"kernel_t"
[0259]
syntax typename::=trustedtypename
[0260]
然后给出判断一个type是高完整性还是低完整性的方法
[0261][0262][0263]
syntax bool::="canwrite""("typename","typename")"[function]
[0264]
rule canwrite(t1:typename,t2:typename)
[0265]
=》istrustedtype(t1)orboolnotboolistrustedtype(t2)
[0266]
然后在allow语句处进行验证
[0267]
rule《k》
[0268]
final allow t1:typename t2:typename:
[0269]
c:classnameps:permitemsetset;=》.
[0270]
...《/k》
[0271]
requires haswriteperm(toset(ps))impliesboolcanwrite(t1,t2)
[0272]
如果最后语义执行顺利结束(配置项中kcell为空),说明目标策略安全性质满足;否则,说明目标策略安全策略不满足(配置项中kcell中的当前语句表示问题所在)。
[0273]
以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献