一种基于Merkle树的Linux程序运行时验证与管控方法和系统与流程

文档序号:17697370发布日期:2019-05-17 21:43阅读:312来源:国知局
一种基于Merkle树的Linux程序运行时验证与管控方法和系统与流程

本发明属于计算机操作系统安全增强技术领域,具体涉及一种基于merkle树的linux程序运行时验证与管控方法和系统。



背景技术:

随着各类计算机系统的不断发展,各种形式的计算机系统已经深入到社会各个领域、各个层面,扮演着越来越重要的角色,特别是近年来移动智能终端和平板电脑等已经通过移动支付、移动办公等应用场景广泛用于承载和处理各类隐私和机密信息。由于所涉及信息的价值越来越高,计算机系统日益成为攻击者进行系统破坏和信息窃取的目标。

可信计算技术是一种基于硬件信任根、以度量和信任链为主要技术手段的新型安全技术。通过从硬件信任跟开始,可信计算技术通过一级加载一级、一级度量一级的方法构造设备内部或设备与设备之间的信任链,从而及时、可靠的发现系统中运行的非授权程序(潜在的恶意程序)并进行相应的处理(审计、管控和远程证明)。可信计算技术特别适用于对具有较高安全要求的计算设备进行保护。

作为可信计算技术所构建的信任链的重要一环,操作系统内核需要度量所启动的每个应用程序。目前,最具有代表性的内核度量技术是美国ibmtj.wason研究院于2004年提出的ima(integritymeasurementarchitecture)度量架构,该架构自2.6.30版本之后被linux基金会接受为内核主线代码并在不断更新中。

ima架构采用的是一种启动时度量技术,即对应用程序的度量时机选择在程序启动时。由于该类度量技术可以在很大程度上保障所执行程序的完整性,但是不会对程序(启动之后的)运行产生任何影响,在系统安全性和性能之间取得了良好权衡,因而被广泛认可和接受。但经过多年的研究与发展,ima的一些不足之处也不断暴露出来。第一是ima架构使得程序启动时就必须对整个程序(的代码段部分)进行读取,这在原生的linux程序启动逻辑之外额外引入了大量的磁盘io操作(原生linux程序启动并创建进程时只读取程序可执行程序的一部分),明显降低了程序加载启动的性能。第二是ima架构中程序片段被度量和实际运行时之间可能存在很长的时间间隔,这给予了敌手较大的可乘之机。



技术实现要素:

本发明的目的在于借鉴linux程序启动时度量技术(例如linux的完整性度量架构,即ima架构)和merkle哈希树方法,将程序度量时机由启动时转变为真正载入内存时和运行时,将程序度量对象由程序代码段转变为程序代码段的片段,从而为使用linux操作系统的计算机设备提供一个安全可靠的程序运行时度量与管控机制,保证指定的可执行文件在运行时受到验证,保障其运行时未受到篡改,或发生篡改时能够及时留证。

本发明是一种基于merkle树的linux程序运行时验证与管控方法,其构建原理和步骤如下:

1)将linux应用程序划分为与内存分页相同大小的分段,并以每个分段为叶子节点,为该应用程序的代码段生成merkle哈希树的所有非叶子节点;

2)基于所述merkle哈希树,将程序度量时机从可执行程序文件启动时推后至可执行程序文件实际载入内存时;

3)基于所述merkle哈希树,将程序度量对象从可执行程序文件整体转化为真正需要载入内存的程序片段。

进一步地,本发明方法包括准备阶段、系统引导阶段和系统运行阶段,具体说明如下:

1.准备阶段:

a)计算机设备厂商、linux操作系统厂商和应用程序厂商:共同定义一个需要保护的程序集合,标记为ta={ta1,ta2,...,tan},其中tai(i=1,2,…n)表示一个程序;另外协商一套公开的密码学参数;

b)计算机设备厂商:根据步骤1.a)中的公开密码学参数,生成一个非对称密钥对<pkc,skc>;使用支持uefi接口的固件作为整机第一个启动设备,并在其中内置<pkc,skc>的公钥部分pkc;

c)应用程序厂商:厂商生成应用程序时,在程序中增加一个扩展属性段,并在该段中增加一个标记,标记该程序是否属于ta;对ta中的每个程序,将其划分为与系统内存分页相同大小的分段(通常是4kb),然后以每个分段为叶子节点,为该程序代码段生成merkle哈希树的所有非叶子节点;

d)linux操作系统厂商:根据步骤1.a)中的公开密码学参数,生成一个非对称密钥对<pkl,skl>;

e)linux操作系统厂商:利用skl为上述程序的merkle哈希树的根节点生成数字签名,以标识为tai的根节点为rooti为例,生成的数字签名为sigskl(rooti);

f)linux操作系统厂商:在生成linux操作系统镜像时,将ta中所有程序ta的数字签名sigskl(rooti)以及merkle树节点统一存储到内核文件系统的“签名区”;

g)linux操作系统厂商:在操作系统文件系统原有的inode节点(索引节点)数据结构中增加一个布尔型变量ta,用于记录该程序是否为ta中的程序,对非ta中程序,ta==0,对ta中程序,ta==1;

h)linux操作系统厂商:在操作系统内核原有的内存映射(mmap())系统调用中,增加对程序是否为ta中程序的判断逻辑;

i)linux操作系统厂商:在操作系统内核原有的缺页异常处理程序中,增加程序片段度量与验证逻辑;

j)计算机设备厂商:利用skc,为linux操作系统厂商所提供的内核进行数字签名,得到sigskc(kernel)。

2.系统引导阶段(操作系统安全引导阶段):

在计算机系统启动时,在系统启动固件中内置数字签名(和签名验证)算法程序以及操作系统镜像验证程序,形成安全启动固件,对linux操作系统内核镜像的数字签名进行验证,以安全方式启动操作系统内核以及系统应用程序,保证内核以及系统应用程序的可信性。

3.系统运行阶段:

a)程序类型判定:任何程序启动运行时都将调用mmap()系统调用从而将可执行程序(代码段)映射到内存,利用步骤1.h)新增加的判断逻辑,读取该文件的扩展属性并判断该程序是否为ta中的程序:

i.如果不是,则在可执行程序文件对应的内存inode节点中改写ta位为“0”,继续按照原有步骤正常执行;

ii.如果是,则在可执行程序文件对应的内存inode节点中改写ta位为“1”。

b)程序度量与管控:任何程序实际运行时,将实际访问程序片段并引发缺页中断,利用步骤1.i)新增加的度量与验证逻辑,首先对程序进行度量,并将度量结果存入内存中的度量结果列表当中,然后依据程序所对应的merkle树节点和根节点数字签名,验证当前调入内存的程序片段,如果发生错误,则根据系统配置采取行动,例如可直接阻止程序执行,或允许执行但用户发出提示,或运行执行但将错误信息写入审计日志。

c)系统优化:

步骤3.b)所述的度量与验证逻辑,可以采用如下方法进行优化:在内存中的度量结果列表中增加一个dc位,凡被度量的可执行文件的片段,该位被设置为clean,凡出现可执行程序文件被修改的情况,则将该位置为dirty;步骤3.b)所述度量与验证逻辑可以只度量dc位为dirty的文件片段。

d)用户管理:应用层提供接口,供用户开启或关闭安全引导程序、操作系统内核中的程序度量或程序管控功能;应用层还应提供接口,供用户指示修改签名区中所包含的程序及其签名。

与上面方法对应地,本发明还提供一种基于merkle树的linux程序运行时验证与管控系统,其包括:

merkle哈希树构建模块,负责将linux应用程序划分为与内存分页相同大小的分段,并以每个分段为叶子节点,为该应用程序的代码段生成merkle哈希树的所有非叶子节点;

程序度量时机管控模块,负责基于所述merkle哈希树,将程序度量时机从可执行程序文件启动时推后至可执行程序文件实际载入内存时;

程序度量对象管控模块,负责基于所述merkle哈希树,将程序度量对象从可执行程序文件整体转化为真正需要载入内存的程序片段。

本发明还提供一种使用linux操作系统的计算机设备,其包括上面所述的基于merkle树的linux程序运行时验证与管控系统。

本发明的优点如下:

1.相比于现有的程序完整性度量和管控技术,本发明将程序度量的时机从可执行文件启动时推后至可执行文件实际载入内存时,将程序度量的对象从可执行文件整体转化为真正需要载入内存的程序片段,避免了程序启动时对程序可执行文件的全部读取和密码杂凑值计算过程,从而在不降低安全性的情况下精简了度量对象。

2.本发明还缩小了程序被度量和实际运行时的时间间隔(本发明的度量发生在请求调页时,通常都是程序片段实际被访问的前序时刻),从而提升了系统安全性。相对于传统ima机制,本发明对系统启动时的性能影响较小(只度量启动时加载入内存的少量程序片段),并且减少了恶意程序能够利用的攻击时间(缩短了程序被度量以及实际访问之间的时间间隔)。

附图说明

图1是本发明方法准备阶段的流程图。

图2是本发明方法系统引导和运行阶段完整性校验示意图。

图3是merkle哈希树原理示意图,其中block表示数据块,hash表示哈希值,roothash是merkle树的根节点。

具体实施方式

下面以在普通pc设备上实现应用程序度量和管控为例,说明本发明的具体实现方式。

本发明提出一种基于merkle树的linux程序运行时验证与管控方法,对于本领域的技术人员而言,可以参考该方法设计、实现出对应的系统安全防护系统。

本实施例的基于merkle树的linux程序运行时验证与管控方法,准备阶段的流程如图1所示,系统引导和运行阶段完整性校验流程如图2所示,具体包括以下步骤:

1.计算机设备厂商、linux操作系统厂商、应用程序厂商:遵循发明内容中步骤1的子步骤a),协商出将linux系统中的/sbin目录和/bin目录下的所有程序作为ta,同时遵循我国商用密码算法标准(包括sm2公钥密码学算法标准和sm3密码杂凑算法标准),其中sm2算法采用国家密码管理局推荐的参数。

2.计算机设备厂商:遵循发明内容中步骤1的子步骤b),生成sm2密钥对<pkc,skc>;在符合uefi接口规范的pc启动固件设备中内置pkc,并按照上述步骤确定的密码学参数实现密码学算法库,以及应用sm2/sm3算法和pkc进行内核度量和数字签名校验的程序逻辑,用于验证sigskc(kernel)(该数字签名由下述的步骤6生成)。如果计算机设备在启动固件之外还使用了操作系统引导程序,则在操作系统引导程序中,同样实现sm2/sm3算法以及度量和数字签名校验逻辑,内置厂商指定的pkc。

3.应用程序厂商:遵循发明内容中步骤1的子步骤c),为自身所提供的应用程序,例如/bin目录下的程序,计算merkle树信息,提供给linux操作系统厂商;类似的,linux操作系统厂商也可以对自己提供的某些系统应用程序,例如/sbin目录下的程序,计算merkle树信息;图3是merkle哈希树原理示意图。

4.linux操作系统厂商:遵循发明内容中步骤1的子步骤d)~f),按照公共协商出的密码学参数,生成sm2密钥对<pkl,skl>,如图1所示;其次,根据应用厂商以及自身生成的应用程序的merkle树信息,生成每个应用程序的merkle树根节点的数字签名;再次,为操作系统内核以及应用程序专门分配一个磁盘分区(从而保障该分区的大小不会随计算机系统的使用而变化),然后将应用程序的上述度量信息和数字签名存储到该分区中未被占用的磁盘空间中。

5.linux操作系统厂商:遵循发明内容中步骤1的子步骤g)~i),在所采用的标准linux内核的基础上,修改inode节点中的数据结构以及mmap()系统调用中的逻辑流程,增加对于应用程序完整性的判断。

6.计算机设备厂商:遵循发明内容中步骤1的子步骤j),利用skc,为linux操作系统厂商所提供的内核kernel进行数字签名,得到sigskc(kernel)。

7.linux系统引导阶段:遵循发明内容中的步骤2,形成安全启动固件并在启动时验证linux操作系统内核镜像的数字签名,保证内核镜像的可信性。

8.linux系统运行阶段:遵循发明内容中步骤3的子步骤a)~b),对系统上任何要启动的程序进行程序类型判定、程序度量与管控;可按照步骤3的子步骤c)对程序度量与管控进行优化,减少被度量的程序代码量,提高效率;遵循步骤3的子步骤d),在应用层为用户提供管理接口,供用户管理内核中的度量、管控、以及修改程序签名的功能。

本发明另一实施例提供一种基于merkle树的linux程序运行时验证与管控系统,其包括:

merkle哈希树构建模块,负责将linux应用程序划分为与内存分页相同大小的分段,并以每个分段为叶子节点,为该应用程序的代码段生成merkle哈希树的所有非叶子节点;

程序度量时机管控模块,负责基于所述merkle哈希树,将程序度量时机从可执行程序文件启动时推后至可执行程序文件实际载入内存时;

程序度量对象管控模块,负责基于所述merkle哈希树,将程序度量对象从可执行程序文件整体转化为真正需要载入内存的程序片段。

上述各模块的具体实现方式参见上文对具体方法的说明。

本发明另一实施例提供一种使用linux操作系统的计算机设备,其包括上面所述的基于merkle树的linux程序运行时验证与管控系统。

尽管为说明目的公开了本发明的具体实施例,其目的在于帮助理解本发明的内容并据以实施,本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1