一种基于TPM的Linux内核初始化中的数据结构保护方法及系统的制作方法

文档序号:6380683阅读:523来源:国知局

专利名称::一种基于TPM的Linux内核初始化中的数据结构保护方法及系统的制作方法
技术领域
:本发明涉及可信操作系统内核,特别涉及一种基于TPM的Linux内核初始化中的数据结构保护方法及系统。
背景技术
:在云计算模式下,Linux操作系统以镜像的形式在客服端为用户提供了大量的服务,但与此同时,Linux内核本身的关键数据结构比以往更多的受到恶意RootKit的攻击,并且这些RootKit本身具有隐蔽性、持续性、简洁性,所以,检查和彻底清除这些RootKit将更加困难。Linux操作系统本身为了正常的工作,Linux内核必须跟踪几千个对象,这些对象本身以队列,链表,树等数据结构错综复杂的交织在一起,其中有大量的表格存储了这些对象的一些固定属性,因此,对于RootKit的攻击者来说,修改Linux内核中这些表格及组织这些表格的数据结构是比较经常的选择,而要对这些数据结构进行修改的主要手段有I)通过可加载Linux内核模块机制LKM的方式进入Linux内核对关键数据结构进行修改;2)将中断描述符表IDT中已经注册的中断响应函数替换为恶意的RootKitJnkad提出工具方法、窃听个人银行密码信息的击键记录程序属于此类。作为IDT的一种特殊形式系统调用表systemcalltable也是Linux内核级RootKit攻击的主要手段,这种类型的RootKit典型代表是knark、lvtes、override;3)通过调用门技术进入Linux内核修改用于保存描述内存区域的地址和特权的段描述符的全局描述符表GDT或局部描述符表LDT;4)对动态库、模块、可执行程序注入恶意代码,如tOrn是这类程序的典型代表。针对4)的攻击手段,已有专利已经很好的解决。针对上述1)、2)、3)对Linux内核数据结构的主要攻击手段,当前已有的检测工具有kern_check、checkidt和StMichael,这些检测工具的共同特性是对文件的完整性进行检查,检测的时候通过比较文件的当前信息和保存的基准信息,如果不匹配说明攻击发生。这些检测工具存在的弊端是实时性差,工具本身的代码量庞大,对于运行时恶意代码注入或动态修改数据结构不能及时发现,且所有的检测都是基于软件,也不利于防止重放攻击。
发明内容本发明的目的是提供一种基于TPM的Linux内核初始化中的数据结构保护方法及系统,动态保护了Linux内核在初始化阶段的完整性,有效阻止了各种攻击手段,并动态保护了Linux内核在初始化阶段页表、IDT表、⑶T表的完整性。为此,本发明提供了一种基于TPM的Linux内核初始化中的数据结构保护方法,其特征在于,包括步骤1,在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;步骤2,对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data;步骤3,将所述Loader_Secure_Data发送到Linux内核中;步骤4,认证Linux内核的完整性,并对Linux内核进行解压缩;步骤5,分别对首次初始化页表、初始化GDT表、初始化IDT表进行基于TPM的数据绑定操作;步骤6,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。所述步骤I包括步骤11,使用TPM的随机数产生器产生一个随机数记为Loader-Random-Valuel;步骤12,把Linux内核加载到内存,用BIOS中断的方法调用TPM的SHA-1弓丨擎计算Linux内核的度量值记为Loader-Measure-Valuel,使用TPM扩展功能将该Loader-Measure-valuel扩展到PCR寄存器中,使用TPM读取功能将该PCR寄存器的内容读到内存变量中记为Mem_PcrValue;步骤13,使用SHA-1算法计算Loader-Random-Valuel和Mem_PcrValue的连接后的度量值,得到Kernel-1ntegrity-Valuel并将其存储在内存变量中。所述步骤2包括步骤21,使用TPM的RSA引擎产生一个公钥记为RSA_Pubkey和一个私钥记为RSA_Prvikey;步骤22,将签名操作后的结果保存在内存变量中记为Signed-Kernel-1ntegrity-Valuel;步骤23,定义所述Loader_Secure_Data,其内包含Signed-Kernel-1ntegrity-Valuel、RSA_Pubkey>Loader-Random-ValueI三个域。所述步骤3包括步骤31,在Linux内核空间预先设置一个特殊的空间标志并记为Integrity-Secure-Flag,在这个空间标志后定义一个大小为sizeof的数据结构;步骤32,采用内存扫描的方法查找到该Integrity-Secure-Flag后,将所述Loader_Secure_Data拷贝到所述Integrity-Secure-Flag后并记为Kernel_Secure_data。所述步骤4包括步骤41,使用扫描内存的方法查找所述Integrity-Secure-Flag后,取出所述Kernel_Secure_data;步骤42,釆用BIOS中断的方法调用TPM的SHA-1引擎计算Linux内核的度量值记为Kernel-Measure_Value2,然后使用SHA-1算法计算SHA-1((Kernel—Secure—data一Loader-Random-ValueI)||Kernel-Measure_Value2)后的结果记为Soft-Kerne1-Measure-Value2;步骤43,用所述Kernel—Secure—data的第二个域Kernel—Secure—data—RSA—Pubkey对Kernel_Secure_data的第一个域Kernel_Secure_data—Signed-Kernel-1ntegrity-Valuel进行签名的认证后记为Decrypted_Signed-Kernel_Integrity-Valuel;步骤44,比较所述Soft-Kernel-Measure_Value2与所述Decrypted_Signed-Kernel-1ntegrity-Valuel是否一致,若一致,继续解压Iinux内核,若不一致,贝丨J停机。所述步骤5包括若Linux内核进入到初始化内核页表,则将页目录记为swapper_pg_dir采用TPM_Bind绑定,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;若Linux内核进入到初始化⑶T表,则将全局描述符记为gdt_table采用TPM_Bind绑定,绑定操作使用作为Kernel_Secure_data—RSA_Pubkey作为密钥;若将中断描述表记为idt_table采用TPM_Bind绑定,则绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥。所述步骤6具体包括若内核函数paging_initO对所述swapper_pg_dir进行写操作,贝U先进行Bind_pg.data的解除绑定操作,解除绑定使用所述RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对swapper_pg_dir的进一步初始化,系统岩机,否则继续初始化;若内核函数do_basic_setupO中对gdt_table使用函数get_cpu_gdt_tableO读取,则先进行Bind_gdt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止获取gdt_table,系统宕机,否则继续初始化;若内核函数trap_init()和init_IRQ()中对idt_table进行写操作,则先进行Bind_idt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对idt_table的进一步初始化,系统岩机,否则继续初始化。为达到上述目的,本发明另外提供了一种基于TPM的Linux内核初始化中的数据结构保护系统,包括完整度量值计算模块,用于在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;签名初始化模块,用于对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data;第一发送模块,用于将所述Loader_Secure_Data发送到Linux内核中;认证压缩模块,用于认证Linux内核的完整性,并对Linux内核进行解压缩;绑定模块,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作;解除绑定模块,在Linux内核启动的Start_kernel阶段,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。所述完整度量值计算模块包括随机数产生模±夹,使用TPM的随机数产生器产生一个随机数记为Loader-Random-ValueI;扩展模块,把Linux内核加载到内存,用BIOS中断的方法调用TPM的SHA-1引擎计算Linux内核的度量值记为Loader-Measure-Valuel,使用TPM扩展功能将该Loader-Measure-valuel扩展到PCR寄存器中,使用TPM读取功能将该PCR寄存器的内容读到内存变量中记为Mem—PcrValue;第一计算模块,使用SHA-1算法计算Loader-Random-Valuel和Mem—PcrValue的连接后的度量值,得到Kemel-1ntegrity-Valuel并将存储在内存变量中。所述签名初始化模块包括产生模块,使用TPM的RSA引擎产生一个公钥记为RSA—Pubkey和一个私钥记为RSA—Prvikey;保存模块,将签名操作后的结果保存在内存变量中记为Signed-Kernel-1ntegrity-Valuel;定义模块,定义所述Loader—Secure—Data,其内包含Signed-Kernel-1ntegrity-Valuel、RSA—Pubkey、Loader-Random-ValueI三个域。所述第一发送模块包括预先设置模块,在Linux内核空间预先设置一个特殊的空间标志并记为Integrity-Secure-Flag,在这个空间标志后定义一个大小为sizeof的数据结构记为Kernel_Secure_data;第二发送模块,釆用内存扫描的方法查找到该Integrity-Secure-Flag后,将所述Loader—Secure—Data发送到所述Kernel—Secure—data中。所述认证压缩模块包括提取模块,使用扫描内存的方法查找所述Integrity-Secure-Flag后,取出所述Kernel_Secure_data;第二计算模块,釆用BIOS中断的方法调用TPM的SHA-1引擎计算Linux内核的度量值记为Kernel-Measure_Value2,然后使用SHA-1算法计算SHA-1((Kernel—Secure—data一Loader-Random-ValueI)||Kernel-Measure_Value2)后的结果记为Soft-Kerne1-Measure-Value2;签名认证模块,用所述Kernel—Secure—data的第二个域Kernel—Secure—data—RSA—Pubkey对Kernel—Secure—data的第一个域Kernel—Secure—data—Signed-Kernel-1ntegrity-Valuel进行签名的认证后记为Decrypted—Signed-Kernel-1ntegrity-Valuel;第一判断模块,比较所述Soft-Kernel-Measure_Value2与所述Decrypted—Signed-Kernel-1ntegrity-Valuel是否一致,若一致,继续解压Linux内核,若不一致,则停机。所述绑定模块包括第一绑定模块,用于在在Linux内核进入到初始化内核页表之后,将页目录记为swapper—pg—dir米用TPM—Bind绑定,绑定操作使用Kernel—Secure—data—RSA—Pubkey作为密钥;第二绑定模块,用于在Linux内核进入到初始化⑶T表之后,将全局描述符记为gdt—table米用TPM—Bingd绑定,绑定操作使用Kernel—Secure—data—RSA—Pubkey作为密钥;第三绑定模块,用于将中断描述表记为idt—table釆用TPM—Bind绑定,绑定操作使用Kernel—Secure—data—RSA—Pubkey作为密钥。所述解除绑定模块包括第一解除绑定模块,用于在内核函数paging_initO对所述swapper_pg_dir进行写操作之前,进行Bind_pg_data的解除绑定操作,解除绑定使用所述RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对swapper_pg_dir的进一步初始化,系统岩机,否则继续初始化;第二解除绑定模块,用于在内核函数do_basic_setup()中对gdt_table使用函数get_cpu_gdt_tableO读取之前,进行Bind_gdt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止获取gdt_table,系统宕机,否则继续初始化;第三解除绑定模块,用于在内核函数trap_init()和init_IRQ()中对idt_table进行写操作之前,进行Bind_idt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对idt_table的进一步初始化,系统宕机,否则继续初始化。本发明的有益效果在于对Linux内核镜像本身以及Linux内核初始化过程中加载的内核页表、GDT表、IDT表(包含系统调用表)进行了基于TPM的可信验证、可信数据绑定、可信数字签名等保护操作,避免了一些常见的RootKit对Linux内核在初始化过程中加载的机会,非常适合Linux内核的可信初始化以及当前云计算环境下虚拟机的可信初始化,对于构造可信云平台具有重要的实际意义,具有良好的市场前景和应用价值。具体如下1.克服了现有软件检测工具的不足,使用TPM硬件实时防御,有效的阻止了各种类型的攻击。2.动态保护了Linux内核在初始化阶段的完整性,有效阻止了
背景技术
中的攻击手段I)LKM形式的注入;3.动态保护了Linux内核在初始化阶段页表、IDT表、⑶T表的完整性,有效阻止了
背景技术
中的攻击手段2)、3)描述的入侵手段。以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的限定。图1是本发明的基于TPM的Linux内核初始化中的数据结构保护方法流程图2是本发明的基于TPM的Linux内核初始化中的数据结构保护系统示意图。具体实施方式以GRUB-0.9.7作为启动加载器,Linux-2.6.32内核的初始化为例对本发明的基于TPM的Linux内核初始化中的数据结构保护方法进一步描述。图1是本发明的基于TPM的Linux内核初始化中的数据结构保护方法流程图。如图1所示,该方法包括步骤1,在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;步骤2,对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader—Secure—Data;步骤3,将所述Loader—Secure—Data发送到Linux内核中;步骤4,认证Linux内核的完整性,并对Linux内核进行解压缩;步骤5,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作;步骤6,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。步骤1,在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuelο其实现方法为Al.用户获得TPM的使用权,使用TPM的RNG(随机数产生器)产生一个随机数记为Loader-Random-ValueI;本步骤中,使用TPM_TakeOwnershipO函数获得TPM的使用权,使用TPM_GetRandomO函数获得随机数。A2.把Linux内核加载到内存,用BIOS中断的方法调用TPM的SHA-1引擎计算Linux的度量值记为Loader-Measure-Valuel,同样使用BIOS中断的方法调用TPM扩展(TPMExtend)功能,将Loader-Measure-valuel扩展到指定PCR_Index的PCR寄存器中,使用TPM读取(TPM_PCRRead)功能将指定PCR_Index的PCR寄存器的内容读到Mem_PcrValue;本步骤中,调用SHA-1引擎的BIOS中断子功能号为0xBB05H,功能号为OxlAH,调用TPM_Extend的BIOS中断子功能号为0xBB04H,功能号为OxlAH,用TPM_PCRRead功能采用PCR_Index为8,即采用PCR8寄存器。A3.使用软件的SHA-1算法计算Loader-Random-Valuel和Mem_PcrValue的连接后的度量值,即计算SHA-1(Loader-Random-Valuel|Mem_PcrValue)的结果,计算完成后的结果存储在内存变量Kernel-1ntegrity-Valuel中。本步骤中,需要注意的是符号“II”表示连接操作,其含义是将这个符号前后两部分数据连接起来。SHA-1算法是已经公布的算法,具体实施方法不再赘述。上述的A1,A2,A3步骤在GRUB的Stage2阶段的builtins.c文件的boot_funcO中实现。步骤2,对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data。其实现方法为B1.使用TPM的RSA引擎产生一个公钥RSA_Pubkey和一个私钥RSA_Prvikey;本步骤中,米用命令TPM_CreateEndorsementKeyPair创建RSA_Pubkey和RSA_Prvikey密钥对。B2.使用TPM的签名操作对Kernel-1ntegrity-Valuel进行数字签名操作,签名操作后的结果保存在Signed-Kernel-1ntegrity-Valuel中,签名的私钥采用BI得到的RSA-Prvikey;本步骤中,签名操作采用函数TPM_Sign()进行数字签名。B3.定义数据结构Loader_Secure_Data,其内包含Signed-Kernel-1ntegrity-Valuel、RSA_Pubkey>Loader-Random-Valuel三个域;本步骤操作简单明显,无需赘述。步骤3,将所述Loader—Secure—Data发送到Linux内核中。其实现方法为Cl.在Linux内核空间预先设置一个特殊的空间标志Integrity-Secure-Flag,在这个空间标志后定义一个类型为Loader—Secure—Data,大小为sizeof(Loader—Secure—Data)的数据结构;本步骤中设置空间标志Integrity-Secure-Flag的原因是后续代码能方便找到其后定义的数据结构Kernel—Secure—data。C2.启动加载器把Linux内核加载到内存时,釆用内存扫描的方法查找到该Integrity-Secure-Flag后,将所述Loader—Secure—Data拷贝到所述Integrity-Secure-Flag后并记为Kernel_Secure_data中。本步骤中在GRUB的stage2阶段的builtins.c文件的boot—func()函数最后阶段实现,实现时定义一个工作指针,从Linux内核加载的起始地址开始扫描,直到找到标志Integrity-Secure-Flag后,使用内存拷贝的方法将Loader—Secure—Data拷贝到Cl定义的Kernel_Secure_data中。步骤4,在Linux内核启动的Setup阶段之后,认证Linux内核的完整性,并对Linux内核进行解压缩。其实现方法为Dl.使用扫描内存的方法查找Cl预设的Integrity-Secure-Flag,找到后取出Integrity-Secure-Flag之后Kernel—Secure—data的数据结构;本步骤中内存扫描的的实现方法同C2的方法。D2.在Linux内核解压缩前,釆用BIOS中断的方法调用TPM的SHA-1引擎计算Vmlinux的度量值记为Kernel-Measure_Value2,之后使用软件SHA-1算法计算SHA-1((Kernel_Secure_data一Loader-Random-Valuel)||Kernel-Measure_Value2)后的结果为Soft-Kernel-Measure_Value2;本步骤中特别需要注意的是计算Kernel_Measure_Value2时,必须通过SHA-1(Setup,bin||Vmlinux.bin)计算得到。因为在步骤A中对Linux内核的完整性度量值计算时度量对象包含了Setup,bin和Vmlinux.bin两个部分。D3.用Kernel—Secure—data数据结构的第二个域Kernel—Secure—data—RSA—Pubkey对Kernel—Secure—data的第一个域Kernel—Secure—data—Signed-Kernel-1ntegrity-Valuel进行签名的认证后得到的结果记为Decrypted—Signed-Kernel-1ntegrity-Valuel;本步骤中签名认证的方法是使用RSA—public—decrypt方法对Signed-Kernel-1ntegrity-Valuel进行解密得到Decrypted—Signed-Kernel-1ntegrity-Valuel;D4.t匕较Soft-Kernel-Measure-Value2与Decrypted_Signed-Kernel-1ntegrity-Valuel是否一致,若一致,继续解压Linux内核,否则停机。注意上述描述的Dl,D2,D3,D4步骤的实施方式可以在文件/arch/x86/boot/compressed/misc.c中定义一个函数attest—kernelO来实现,在文件/arch/x86/boot/compressed/head—32.S中Entry(startup—32)函数的调用calldecompress—kernel之前增加一个callattest—kernel调用。步骤5,在Linux内核解压缩完成后,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作。其实现方法为El.在Linux内核进入到ENTRY(startup_32)初始化内核页表之后,将页目录swapper_pg_dir米用TPM_Bind绑定为Bind_pg_data,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;E2.在Linux内核进入到ENTRY(startup_32)初始化⑶T表之后,将全局描述符gdt_table米用TPM_Bind绑定为Bing_gdt_data,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;E3.在Linux内核进入到ENTRY(startup32)初始化IDT表之后,将中断描述表idt_table米用TPM_Bind绑定为Bind_idt_data,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;注意上述的E1,E2,E3步骤的实施方式可以在文件/arch/x86/kernel/head_32.S中实现。步骤6,在Linux内核启动的Start_kernel阶段,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。其实现方法为Fl.内核函数paging_init()对swapper_pg_dir进行写操作之前,进行Bind_pg_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对swapper_pg_dir的进一步初始化,系统岩机,否则继续初始化。本步骤中,解除绑定的操作在文件/arch/x86/mm/init_32.c的paging_init()函数中实现。F2.内核函数do_basic_setupO中对gdt_table使用函数get_cpu_gdt_tableO读取之前,进行Bind_gdt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止获取gdt_table,系统宕机,否则继续初始化。本步骤中,get_cpu_gdt_tableO函数在/arch/x86/include/asm/desc.h中定义,所以解除绑定的操作可以在这个函数实现的开头部分完成。Linux内核文件/drivers/pnp/pnpbios/bioscalls.c,/drivers/lguest/x86/core,c,/arch/x86/power,c,/arch/x86/kernel/acpi/sleep,c等都要读取gdt_table,所以在get_cpu_gdt_table()函数的定义的/arch/x86/include/asm/desc.h文件中完成,保证了任何读取gdt_table的操作必须首先完成解除绑定操作。F3.内核函数trap_initO和init_IRQ()中对idt_table进行写操作之前,进行Bind_idt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对idt_table的进一步初始化,系统岩机,否则继续初始化。本步骤中trap_init()函数位于/arcr/x86/ke;rnel/traps·c中实现,init_IRQ()函数在/arch/x86/kernel/irqinit.c中实现,这两个函数最终都会调用对IDT表进行写操作的函数write_idt_entry(idt_table,…),而函数write_idt_entry(idt_table,…)在/include/asm_x86/desc_32.h中定义,所以在此函数的开头实现解除绑定操作。图2是本发明的基于TPM的Linux内核初始化中的数据结构保护系统示意图。如图2所示,该系统包括完整度量值计算模块100,用于在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;签名初始化模块200,用于对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data;第一发送模块300,用于将所述Loader_Secure_Data发送到Linux内核中;认证压缩模块400,用于认证Linux内核的完整性,并对Linux内核进行解压缩;绑定模块500,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作;解除绑定模块600,在Linux内核启动的Start_kernel阶段,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。完整度量值计算模块,用于在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;所述完整度量值计算模块100包括随机数产生模块,用户获得TPM的使用权,使用TPM的RNG(随机数产生器)产生一个随机数记为Loader-Random-Valuel;本模块中,使用TPM_TakeOwnershipO函数获得TPM的使用权,使用TPM_GetRandomO函数获得随机数。扩展模块,把Linux内核加载到内存,用BIOS中断的方法调用TPM的SHA-1引擎计算Linux的度量值记为Loader-Measure-Valuel,同样使用BIOS中断的方法调用TPM扩展(TPM_Extend)功能,将Loader-Measure-valuel扩展到指定PCR_Index的PCR寄存器中,使用TPM读取(TPM_PCRRead)功能将指定PCR_Index的PCR寄存器的内容读到Mem_PcrValue;本模块中,调用SHA-1引擎的BIOS中断子功能号为0xBB05H,功能号为OxlAH,调用TPM_Extend的BIOS中断子功能号为0xBB04H,功能号为OxlAH,用TPM_PCRRead功能采用PCR_Index为8,即采用PCR8寄存器。第一计算模块,使用软件的SHA-1算法计算Loader-Random-Valuel和Mem_PcrValue的连接后的度量值,即计算SHA-1(Loader-Random-Valuel|Mem_PcrValue)的结果,计算完成后的结果存储在内存变量Kernel-1ntegrity-ValueI中。本模块中,需要注意的是符号“II”表示连接操作,其含义是将这个符号前后两部分数据连接起来。SHA-1算法是已经公布的算法,具体实施方法不再赘述。上述的三个模块在GRUB的Stage2阶段的builtins.c文件的boot_funcO中实现。签名初始化模块200,用于对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data。该模块包括产生模块,使用TPM的RSA引擎产生一个公钥RSA_Pubkey和一个私钥RSA_Prvikey;本模块中,米用命令TPM_CreateEndorsementKeyPair创建RSA_Pubkey和RSA_Prvikey密钥对。保存模块,使用TPM的签名操作对Kernel-1ntegrity-Valuel进行数字签名操作,签名操作后的结果保存在Signed-Kernel-1ntegrity-Valuel中,签名的私钥采用产生模块得到的RSA-Prvikey;本模块中,签名操作釆用函数TPM—SignO进行数字签名。定义模块,定义数据结构Loader—Secure—Data,其内包含Signed-Kernel-1ntegrity-Valuel、RSA—Pubkey、Loader-Random-ValueI三个域;本模块操作简单明显,无需赘述。第一发送模块300,用于将所述Loader—Secure—Data发送到Linux内核中。该模块包括预先设置模块,在Linux内核空间预先设置一个特殊的空间标志Integrity-Secure-Flag,在这个空间标志后定义一个类型为Loader—Secure—Data,大小为sizeof(Loader—Secure—Data)的数据结构;本模块中设置空间标志Integrity-Secure-Flag的原因是后续代码能方便找到其后定义的数据结构Kernel—Secure—data。第二发送模块,启动加载器把Linux内核加载到内存时,米用内存扫描的方法查找到该Integrity-Secure-Flag后,将所述Loader—Secure—Data拷贝到所述Integrity-Secure-Flag后并记为Kernel_Secure_data中。本模块中在GRUB的stage2阶段的builtins.c文件的boot—func()函数最后阶段实现,实现时定义一个工作指针,从Linux内核加载的起始地址开始扫描,直到找到标志Integrity-Secure-Flag后,使用内存拷贝的方法将Loader—Secure—Data拷贝到预先设置模块定义的Kernel—Secure—data中。认证压缩模块400,用于认证Linux内核的完整性,并对Linux内核进行解压缩。该模块包括提取模块,使用扫描内存的方法查找预先设置模块预设的Integrity-Secure-Flag,找到后取出Integrity-Secure-Flag之后Kernel_Secure_data的数据结构;本模块中内存扫描的的实现方法同第二发送模块的方法。第二计算模块,在Linux内核Vmlinux解压缩前,釆用BIOS中断的方法调用TPM的SHA-1引擎计算Vmlinux的度量值记为Kernel-Measure_Value2,之后使用软件SHA-1算法计算SHA-1((Kernel_Secure_data一Loader-Random-Valuel)||Kernel-Measure_Value2)后的结果为Soft-Kernel-Measure_Value2;本模块中特别需要注意的是计算Kernel-Measure_Value2时,必须通过SHA-1(Setup,bin||Vmlinux.bin)计算得到。因为在完整度量值计算模块中对Linux内核的完整性度量值计算时度量对象包含了Setup,bin和Vmlinux.bin两个部分。签名认证模块,用Kernel—Secure—data数据结构的第二个域Kernel—Secure—data—RSA—Pubkey对Kernel—Secure—data的第一个域Kernel—Secure—data—Signed-Kernel-1ntegrity-Valuel进行签名的认证后得到的结果记为Decrypted—Signed-Kernel-1ntegrity-Valuel;本模块中签名认证的方法是使用RSA—public—decrypt方法对Signed-Kernel-1ntegrity-Valuel进行解密得到Decrypted—Signed-Kernel-1ntegrity-Valuel;第一判断模块,比较Soft-Kernel-Measure_Value2与Decrypted—Signed-Kernel-1ntegrity-Valuel是否一致,若一致,继续解压Linux内核,否则停机。注意上述描述的四个模块的实施方式可以在文件/arch/x86/boot/compressed/misc.c中定义一个函数attestkernel()来实现,在文件/arch/x86/boot/compressed/head_32.S中Entry(startup_32)函数的调用calldecompress_kernel之前增加一个callattest_kernel调用。绑定模块500,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作。该模块包括第一绑定模块,在Linux内核进入到ENTRY(startup_32)初始化内核页表之后,将页目录swapper_pg_dir采用TPM_Bind绑定为Bind_pg_data,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;第二绑定模块,在Linux内核进入到ENTRY(startup_32)初始化⑶T表之后,将全局描述符gdt_table采用TPM_Bingd绑定为Bind_gdt_data,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;第三绑定模块,在Linux内核进入到ENTRY(startup_32)初始化IDT表之后,将中断描述表idt_table米用TPM_Bind绑定为Bind_idt_data,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;注意上述三个模块的实施方式可以在文件/arch/x86/kernel/head_32.S中实现。解除绑定模块,在内核启动的Start_kernel阶段,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。该模块包括第一解除绑定模块,内核函数paging_init()对swapper_pg_dir进行写操作之前,进行Bind_pg_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对swapper_pg_dir的进一步初始化,系统岩机,否则继续初始化。本模块中,解除绑定的操作在文件/arch/x86/mm/init_32.c的paging_init()函数中实现。第二解除绑定模块,内核函数do_basic_setupO中对gdt_table使用函数get_cpu_gdt_table()读取之前,进行Bind_gdt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止获取gdt_table,系统宕机,否则继续初始化。本模块中,get_cpu_gdt_tableO函数在/arch/x86/include/asm/desc.h中定义,所以解除绑定的操作可以在这个函数实现的开头部分完成。Linux内核文件/drivers/pnp/pnpbios/bioscalls.c,/drivers/lguest/x86/core,c,/arch/x86/power,c,/arch/x86/kernel/acpi/sleep,c等都要读取gdt_table,所以在get_cpu_gdt_table()函数的定义的/arch/x86/include/asm/desc.h文件中完成,保证了任何读取gdt_table的操作必须首先完成解除绑定操作。第三解除绑定模块,内核函数trap_initO和init_IRQ()中对idt_table进行写操作之前,进行Bind_idt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对idt_table的进一步初始化,系统宕机,否则继续初始化。本模块中trap_init()函数位于/arcr/x86/kernel/traps.c中实现,init_IRQ()函数在/arch/x86/kernel/irqinit.c中实现,这两个函数最终都会调用对IDT表进行写操作的函数write_idt_entry(idt_table,…),而函数write_idt_entry(idt_table,…)在/include/asm_x86/desc_32.h中定义,所以在此函数的开头实现解除绑定操作。当然,本发明还可有其它多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明权利要求的保护范围。权利要求1.一种基于TPM的Linux内核初始化中的数据结构保护方法,其特征在于,包括步骤1,在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;步骤2,对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data;步骤3,将所述Loader_Secure_Data发送到Linux内核中;步骤4,认证Linux内核的完整性,并对Linux内核进行解压缩;步骤5,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作;步骤6,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。2.一种如权利要求1所述的数据结构保护方法,其特征在于,所述步骤I包括步骤11,使用TPM的随机数产生器产生一个随机数记为Loader-Random-Valuel;步骤12,把Linux内核加载到内存,用BIOS中断的方法调用TPM的SHA-1引擎计算Linux内核的度量值记为Loader-Measure-Valuel,使用TPM扩展功能将该Loader-Measure-valuel扩展到PCR寄存器中,使用TPM读取功能将该PCR寄存器的内容读到内存变量中记为Mem_PcrValue;步骤13,使用SHA-1算法计算Loader-Random-Valuel和Mem_PcrValue的连接后的度量值,得到Kernel-1ntegrity-Valuel并将存储在内存变量中。3.—种如权利要求2所述的数据结构保护方法,其特征在于,所述步骤2包括步骤21,使用TPM的RSA引擎产生一个公钥记为RSA_Pubkey和一个私钥记为RSA_Prvikey;步骤22,将签名操作后的结果保存在内存变量中记为Signed-Kernel-1ntegrity-Valuel;步骤23,定义所述Loader_Secure_Data,其内包含Signed-Kernel-1ntegrity-Valuel、RSA_Pubkey>Loader-Random-ValueI三个域。4.一种如权利要求3所述的数据结构保护方法,其特征在于,所述步骤3包括步骤31,在Linux内核空间预先设置一个特殊的空间标志并记为Integrity-Secure-Flag,在这个空间标志后定义一个大小为sizeof的数据结构;步骤32,采用内存扫描的方法查找到该Integrity-Secure-Flag后,将所述Loader_Secure_Data拷贝到所述Integrity-Secure-Flag后并记为Kernel_Secure_data。5.一种如权利要求4所述的数据结构保护方法,其特征在于,所述步骤4包括步骤41,使用扫描内存的方法查找所述Integrity-Secure-Flag后,取出所述Kernel_Secure_data;步骤42,采用BIOS中断的方法调用TPM的SHA-1引擎计算Linux内核的度量值记为Kernel-Measure_Value2,然后使用SHA-1算法计算SHA-1((Kerne1_Secure_data—Loader-Random-Valuel)||Kernel-Measure_Value2)后的结果记为Soft-Kerne1-Measure-Value2;步骤43,用所述Kernel_Secure_data的第二个域Kernel_Secure_data—RSA_Pubkey对Kernel_Secure_data的第一个域Kernel_Secure_data—Signed-Kernel-1ntegrity-VaIuel进行签名的认证后的结果记为Decrypted_Signed-Kernel_Integrity-Valuel;步骤44,比较所述Soft-Kernel-Measure_Value2与所述Decrypted_Signed-Kernel-1ntegrity-Valuel是否一致,若一致,继续解压Linux内核,若不一致,贝丨J停机。6.一种如权利要求5所述的数据结构保护方法,其特征在于,所述步骤5包括若Linux内核进入到初始化内核页表,则将页目录记为swapper_pg_dir采用TPM_Bind绑定,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;若Linux内核进入到初始化⑶T表,则将全局描述符记为gdt_table采用TPM_Bind绑定,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥;若将中断描述表记为idt_table采用TPM_Bind绑定,则绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥。7.—种如权利要求6所述的数据结构保护方法,其特征在于,所述步骤6具体包括若内核函数paging_init()对所述swapper_pg_dir进行写操作,则先进行Bind_pg_data的解除绑定操作,解除绑定使用所述RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对swapper_pg_dir的进一步初始化,系统岩机,否则继续初始化;若内核函数do_basic_setupO中对gdt_table使用函数get_cpu_gdt_tableO读取,则先进行Bind_gdt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止获取gdt_table,系统宕机,否则继续初始化;若内核函数trap_initO和init_IRQ()中对idt_table进行写操作,贝U先进行Bind_idt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对idt_table的进一步初始化,系统岩机,否则继续初始化。8.一种基于TPM的Linux内核初始化中的数据结构保护系统,其特征在于,包括完整度量值计算模块,用于在启动加载器后计算Linux内核的完整性度量值记为Kernel-1ntegrity-Valuel;签名初始化模块,用于对所述Kernel-1ntegrity-Valuel进行数字签名并初始化数据结构记为Loader_Secure_Data;第一发送模块,用于将所述Loader_Secure_Data发送到Linux内核中;认证压缩模块,用于认证Linux内核的完整性,并对Linux内核进行解压缩;绑定模块,分别对首次初始化页表、初始化GDT表、初始化IDT表的进行基于TPM的数据绑定操作;解除绑定模块,在Linux内核启动的Start_kernel阶段,分别对第二次初始化页表、读取GDT表、第二次初始化IDT表进行基于TPM的数据解除绑定操作。9.一种如权利要求8所述的数据结构保护系统,其特征在于,所述完整度量值计算模块包括随机数产生模±夹,使用TPM的随机数产生器产生一个随机数记为Loader-Random-ValueI;扩展模±夹,把Linux内核加载到内存,用BIOS中断的方法调用TPM的SHA-1弓丨擎计算Linux内核的度量值记为Loader-Measure-Valuel,使用TPM扩展功能将该Loader-Measure-valuel扩展到PCR寄存器中,使用TPM读取功能将该PCR寄存器的内容读到内存变量中记为Mem_PcrValue;第一计算模块,使用SHA-1算法计算Loader-Random-Valuel和Mem_PcrValue的连接后的度量值,得到Kernel-1ntegrity-Valuel并将存储在内存变量中。10.一种如权利要求9所述的数据结构保护方法,其特征在于,所述签名初始化模块包括产生模块,使用TPM的RSA引擎产生一个公钥记为RSA_Pubkey和一个私钥记为RSA_Prvikey;保存模块,将签名操作后的结果保存在内存变量中记为Signed-Kernel-1ntegrity-Valuel;定义模块,定义所述Loader_Secure_Data,其内包含Signed-Kernel-1ntegrity-Valuel、RSA_Pubkey>Loader-Random-Valuel三个域。11.一种如权利要求10所述的数据结构保护方法,其特征在于,所述第一发送模块包括预先设置模块,在Linux内核空间预先设置一个特殊的空间标志并记为Integrity-Secure-Flag,在这个空间标志后定义一个大小为sizeof的数据结构记为Kernel_Secure_data;第二发送模块,采用内存扫描的方法查找到该Integrity-Secure-Flag后,将所述Loader_Secure_Data发送到所述Kernel_Secure_data中。12.—种如权利要求11所述的数据结构保护方法,其特征在于,所述认证压缩模块包括提取模块,使用扫描内存的方法查找所述Integrity-Secure-Flag后,取出所述Kernel_Secure_data;第二计算模块,釆用BIOS中断的方法调用TPM的SHA-1引擎计算Linux内核的度量值记为Kernel-Measure_Value2,然后使用SHA-1算法计算SHA-1((Kernel—Secure—data一Loader-Random-Valuel)||Kernel-Measure_Value2)后的结果记为Soft-Kerne1-Measure-Value2;签名认证模块,用所述Kernel—Secure—data的第二个域Kernel—Secure—data—RSA—Pubkey对Kernel_Secure_data的第一个域Kernel_Secure_data—Signed-Kernel-1ntegrity-Valuel进行签名的认证后记为Decrypted—Signed-Kernel-1ntegrity-Valuel;第一判断模块,比较所述Soft-Kernel-Measure_Value2与所述Decrypted—Signed-Kernel-1ntegrity-Valuel是否一致,若一致,继续解压Linux内核,若不一致,则停机。13.—种如权利要求12所述的数据结构保护方法,其特征在于,所述绑定模块包括第一绑定模块,用于在在Linux内核进入到初始化内核页表之后,将页目录记为swapper—pg—dir米用TPM—Bind绑定,绑定操作使用Kernel—Secure—data—RSA—Pubkey作为密钥;第二绑定模块,用于在Linux内核进入到初始化⑶T表之后,将全局描述符记为gdt—table米用TPM—Bing绑定,绑定操作使用Kernel—Secure—data—RSA—Pubkey作为密钥;第三绑定模块,用于将中断描述表记为idt_table采用TPM_Bind绑定,绑定操作使用Kernel_Secure_data—RSA_Pubkey作为密钥。14.一种如权利要求13所述的数据结构保护方法,其特征在于,所述解除绑定模块包括第一解除绑定模块,用于在内核函数paging_init()对所述swapper_pg_dir进行写操作之前,进行Bind_pg_data的解除绑定操作,解除绑定使用所述RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对swapper_pg—dir的进一步初始化,系统岩机,否则继续初始化;第二解除绑定模块,用于在内核函数do_basic_setupO中对gdt_table使用函数get_cpu_gdt_table()读取之前,进行Bind_gdt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止获取gdt_table,系统宕机,否则继续初始化;第三解除绑定模块,用于在内核函数trap_init()和init_IRQ()中对idt_table进行写操作之前,进行Bind_idt_data的解除绑定操作,解除绑定使用RSA_Pubkey作为解密密钥,若解除绑定操作错误,禁止对idt_table的进一步初始化,系统宕机,否则继续初始化。全文摘要本发明提供了一种基于TPM的Linux内核初始化中的数据结构保护方法及系统,通过对Linux内核镜像本身以及Linux内核初始化过程中加载的内核页表、GDT表、IDT表(包含系统调用表)进行了基于TPM的可信验证、可信数据绑定、可信数字签名等保护操作,避免了一些常见的RootKit对Linux内核在初始化过程中加载的机会,非常适合Linux内核的可信初始化以及当前云计算环境下虚拟机的可信初始化,对于构造可信云平台具有重要的实际意义,具有良好的市场前景和应用价值。文档编号G06F21/55GK103020518SQ20121043894公开日2013年4月3日申请日期2012年11月6日优先权日2012年11月6日发明者薛栋梁,高云伟,杨鹏斐,展旭升,孙毓忠申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1