发明内容
本发明公开一种全虚拟化环境下启动加载器的可信验证方法,包括:
步骤1,部署生成可信基准值链表Encrypted_Link_Trusted;
步骤2,启动非特权域虚拟机时把链表Encrypted_Link_Trusted拷贝到非特权域虚拟机内存的指定位置;
步骤3,非特权域虚拟机的Rombios中验证非特权域虚拟机的GRUB的Stage1,其中Stage1为GRUB启动的阶段;
步骤4,非特权域虚拟机的GRUB的Stage1验证非特权域虚拟机的GRUB的Start;
步骤5,非特权域虚拟机的GRUB的Start验证非特权域虚拟机的GRUB的Stage1_5;其中Start为GRUB启动的阶段;
步骤6,非特权域虚拟机的GRUB的Stage1_5验证非特权域虚拟机的GRUB的Stage2,其中Stage1_5、Stage2为GRUB启动的阶段。
所述的全虚拟化环境下启动加载器的可信验证方法,所述步骤1还包括:
步骤21,修改Xen的Rombios的功能代码,增加GRUB的Stage1、GRUB的Start、GRUB的Stage1_5对BIOS的请求验证的中断响应函数;
步骤22,修改GRUB的Stage1功能代码,加入用BIOS中断的方式请求验证GRUB的Start的功能代码,并检查修改后的GRUB的Stage1代码是否满足编译后正好是512字节且安装在主引导扇区之后没有破环磁盘分区表的大小和结构,检查的方法是与没有修改过的GRUB的Stage1生成的二进制代码进行比较;
步骤23,修改GRUB的Start功能代码,加入用BIOS中断的方式请求验证GRUB的Stage1_5的功能代码,并检查修改后的Start代码是否满足编译后正好是512字节且安装后位于0面0道的第2扇区,检查的方法是与没有修改过GRUB的Start生成的二进制代码进行比较;
步骤24,修改GRUB的Stage1_5功能代码,加入用BIOS中断的方式请求验证GRUB的Stage2的功能代码,由于Stage1_5已经准备好C语言的运行环境,并且开始支持文件系统,所以修改后的GRUB的Stage1_5生成的二进制代码不需要与没有修改过的GRUB的Stage1_5生成的二进制代码相比较;
步骤25,计算出修改后的GRUB的Stage1、Start、Stage1_5的可信验证基准值,计算出没有修改的GRUB的Stage2的可信验证基准值,并把这四个基准值组成一个链表Link_Trusted,同时,将Link_Trusted用RSA算法加密生成Encrypted_Link_Trusted。
所述的全虚拟化环境下启动加载器的可信验证方法,所述步骤2还包括:
步骤31,特权域解析hvmloader并将可加载的段拷贝到非特权域虚拟机内存中;
步骤32,使用扫描虚拟机内存的方式找到预设空间标识的内存地址Mem_Address,然后将Encrypted_Link_Trusted拷贝到Mem_Address。
所述的全虚拟化环境下启动加载器的可信验证方法,所述步骤3还包括:
步骤41,在非特权域的Rombios跳转到GRUB的Stage1之前,计算GRUB的Stage1的二进制度量值,同时,解密Encrypted_Link_Trusted得到链表Decrypted_Link_Trusted,然后,查找Decrypted_Link_Trusted第一个链表元素可获得GRUB的Stage1的可信验证基准值;
步骤42,验证步骤41得到的可信验证基准值和二进制度量值是否一致,如果一致,把这个二进制度量值扩展(TPM_extend)到相应的平台配置寄存器PCR中,并继续正常的非特权Domain启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证方法,所述步骤4还包括:
步骤51,GRUB的Stage1运行到把内存0x7000开始的512字节转移到内存0x8000之后,使用BIOS中断请求的方式验证GRUB的Start,这个Start是从0面0道第2扇区的内容读到内存的0x7000处的。然后,在非特权域虚拟机的Rombios中找到这512字节的Start功能代码,计算出其二进制度量值。
步骤52,查找链表Decrypted_Link_Trusted第二个链表元素即可获得GRUB的Start的可信验证基准值,验证这个基准值和步骤51得到的GRUB的Start的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证方法,所述步骤5还包括:
步骤61,GRUB的Start运行到装载Stage1_5去内存0x2200之前,使用BIOS中断请求的方式验证GRUB的Stage1_5,非特权域虚拟机的Rombios中接收到这个验证请求后,结合0x2200的起始地址和从GRUB的Start传递过来的参数stage15_sectors,计算出GRUB的Stage1_5的功能代码的二进制度量值;
步骤62,查找链表Decrypted_Link_Trusted第三个链表元素即可获得GRUB的Stage1_5的可信验证基准值,验证这个基准值和步骤61得到的GRUB的Stage1_5的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证方法,所述步骤6还包括:
步骤71,GRUB的Stage1_5运行到装载GRUB的Stage2去内存0x8200之前,使用BIOS中断的方式请求获得GRUB的Stage2的可信验证基准值,非特权域虚拟机的Rombios接收到这个请求后,查找链表Decrypted_Link_Trusted第四个链表元素得到GRUB的Stage2的可信验证基准值;
步骤72,GRUB的Stage1_5根据内存地址0x8200和Stage2实际占用的扇区个数计算出GRUB的Stage2功能代码的二进制度量值,然后,验证这个二进制度量值和步骤71得到的GRUB的Stage2的可信验证基准值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
本发明公开一种全虚拟化环境下启动加载器的可信验证系统,包括:
生成可信基准值链表模块,用于部署生成可信基准值链表Encrypted_Link_Trusted;
启动非特权域虚拟机模块,用于启动非特权域虚拟机时把链表Encrypted_Link_Trusted拷贝到非特权域虚拟机内存的指定位置;
Rombios验证非特权虚拟机模块,用于非特权域虚拟机的Rombios中验证非特权域虚拟机的GRUB的Stage1;
Stage1验证非特权域虚拟机模块,用于非特权域虚拟机的GRUB的Stage1验证非特权域虚拟机的GRUB的Start;
Start验证非特权域虚拟机模块,用于非特权域虚拟机的GRUB的Start验证非特权域虚拟机的GRUB的Stage1_5;
Stage1_5验证非特权域虚拟机模块,用于非特权域虚拟机的GRUB的Stage1_5验证非特权域虚拟机的GRUB的Stage2。
所述的全虚拟化环境下启动加载器的可信验证系统,所述生成可信基准值链表模块还包括:
增加函数模块,用于修改Xen的Rombios的功能代码,增加GRUB的Stage1、GRUB的Start、GRUB的Stage1_5对BIOS的请求验证的中断响应函数;
检查Stage1模块,用于修改GRUB的Stage1功能代码,加入用BIOS中断的方式请求验证GRUB的Start的功能代码,并检查修改后的GRUB的Stage1代码是否满足编译后正好是512字节且安装在主引导扇区之后没有破环磁盘分区表的大小和结构,检查的方法是与没有修改过的GRUB的Stage1生成的二进制代码进行比较;
检查Start模块,用于修改GRUB的Start功能代码,加入用BIOS中断的方式请求验证GRUB的Stage1_5的功能代码,并检查修改后的Start代码是否满足编译后正好是512字节且安装后位于0面0道的第2扇区,检查的方法是与没有修改过GRUB的Start生成的二进制代码进行比较;
验证Stage2模块,用于修改GRUB的Stage1_5功能代码,加入用BIOS中断的方式请求验证GRUB的Stage2的功能代码,由于Stage1_5已经准备好C语言的运行环境,并且开始支持文件系统,所以修改后的GRUB的Stage1_5生成的二进制代码不需要与没有修改过的GRUB的Stage1_5生成的二进制代码相比较;
计算模块,用于计算出修改后的GRUB的Stage1、Start、Stage1_5的可信验证基准值,计算出没有修改的GRUB的Stage2的可信验证基准值,并把这四个基准值组成一个链表Link_Trusted,同时,将Link_Trusted用RSA算法加密生成Encrypted_Link_Trusted。
所述的全虚拟化环境下启动加载器的可信验证系统,所述启动非特权虚拟机模块还包括:
特权域解析模块,用于特权域解析hvmloader并将可加载的段拷贝到非特权域虚拟机内存中;
找寻内存地址模块,用于使用扫描虚拟机内存的方式找到预设空间标识的内存地址Mem_Address,然后将Encrypted_Link_Trusted拷贝到Mem_Address。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Rombios验证非特权虚拟机模块还包括:
计算Stage模块,用于在非特权域的Rombios跳转到GRUB的Stage1之前,计算GRUB的Stage1的二进制度量值,同时,解密Encrypted_Link_Trusted得到链表Decrypted_Link_Trusted,然后,查找Decrypted_Link_Trusted第一个链表元素可获得GRUB的Stage1的可信验证基准值;
扩展模块,用于验证计算Stage模块得到的可信验证基准值和二进制度量值是否一致,如果一致,把这个二进制度量值扩展(TPM_extend)到相应的平台配置寄存器PCR中,并继续正常的非特权Domain启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Stage1验证非特权域虚拟机模块还包括:
中断请求模块,用于GRUB的Stage1运行到把内存0x7000开始的512字节转移到内存0x8000之后,使用BIOS中断请求的方式验证GRUB的Start,这个Start是从0面0道第2扇区的内容读到内存的0x7000处的。然后,在非特权域虚拟机的Rombios中找到这512字节的Start功能代码,计算出其二进制度量值。
验证Start模块,用于查找链表Decrypted_Link_Trusted第二个链表元素即可获得GRUB的Start的可信验证基准值,验证这个基准值和中断请求模块得到的GRUB的Start的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Start验证非特权域虚拟机模块还包括:
中断验证模块,用于GRUB的Start运行到装载Stage1_5去内存0x2200之前,使用BIOS中断请求的方式验证GRUB的Stage1_5,非特权域虚拟机的Rombios中接收到这个验证请求后,结合0x2200的起始地址和从GRUB的Start传递过来的参数stage15_sectors,计算出GRUB的Stage1_5的功能代码的二进制度量值;
验证一致模块,用于查找链表Decrypted_Link_Trusted第三个链表元素即可获得GRUB的Stage1_5的可信验证基准值,验证这个基准值和中断验证模块得到的GRUB的Stage1_5的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Stage1_5验证非特权域虚拟机模块还包括:
获得验证基准值模块,用于GRUB的Stage1_5运行到装载GRUB的Stage2去内存0x8200之前,使用BIOS中断的方式请求获得GRUB的Stage2的可信验证基准值,非特权域虚拟机的Rombios接收到这个请求后,查找链表Decrypted_Link_Trusted第四个链表元素得到GRUB的Stage2的可信验证基准值;
验证基准值一致模块,用于GRUB的Stage1_5根据内存地址0x8200和Stage2实际占用的扇区个数计算出GRUB的Stage2功能代码的二进制度量值,然后,验证这个二进制度量值和获得验证基准值模块得到的GRUB的Stage2的可信验证基准值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
本发明的有益效果为:本发明的优点是提供一种适合在全虚拟化环境下进行启动加载器的验证方法,这种方法很好的解决了空间受限的代码条件下进行可信验证的问题,非常适合在当前云计算环境中虚拟机启动加载器的可信验证,具有良好的市场前景和应用价值。
具体实施方式
下面给出本发明的具体实施方式,结合附图对本发明做出了详细描述。
为了解决上述的技术问题,提供了一种在全虚拟化环境下基于本地BIOS中断调用实现的对虚拟机启动加载器进行可信验证的方法。
所述启动加载器为GRUB,所述全虚拟化环境为Xen支持的全虚拟化环境。
全虚拟化环境下启动加载器GRUB各功能阶段代码受字节个数限制,即GRUB的Stage1、GRUB的Start编译后只有512字节,使用MBR的方式安装GRUB后,Stage1安装在0面0道的第1扇区,这个扇区又称为主引导扇区,这个扇区在所有的系统分区之前不属于任何分区,其由主引导记录(大小为446个字节)、磁盘分区表(大小为64个字节)、引导记录标识(大小为2个字节)。Start安装在0面0道第2扇区,GRUB的Stage1_5安装在0面0道第3扇区开始的扇区里,其占据扇区的大小与具体的Stage1_5文件大小有关。使用BIOS中断调用的方法实现本地验证好处是:只将BIOS中断请求部分置于上述字节个数受限的代码中,具体的验证工作交由虚拟BIOS实现的中断响应函数完成,虚拟BIOS本身的实现是在Xen代码中完成的,其不受字节个数多少的限制,有效的解决了GRUB功能代码字节个数限制的瓶颈。
具体来说,本发明针对在全虚拟化环境下基于本地BIOS中断调用实现的虚拟机启动加载器GRUB可信验证方法包括下列步骤:
A.部署生成可信基准值链表Encrypted_Link_Trusted,其具体实现方法为:
A1.修改Xen的Rombios的功能代码,增加GRUB的Stage1、GRUB的Start、GRUB的Stage1_5对BIOS的请求验证的中断响应函数;
A2.修改GRUB的Stage1功能代码,加入用BIOS中断的方式请求验证GRUB的Start的功能代码,并检查修改后的GRUB的Stage1代码是否满足编译后正好是512字节且安装在主引导扇区之后没有破环磁盘分区表的大小和结构,检查的方法是与没有修改过的GRUB的Stage1生成的二进制代码进行比较;
A3.修改GRUB的Start功能代码,加入用BIOS中断的方式请求验证GRUB的Stage1_5的功能代码,并检查修改后的Start代码是否满足编译后正好是512字节且安装后位于0面0道的第2扇区,检查的方法是与没有修改过GRUB的Start生成的二进制代码进行比较;
A4.修改GRUB的Stage1_5功能代码,加入用BIOS中断的方式请求验证GRUB的Stage2的功能代码,由于Stage1_5已经准备好C语言的运行环境,并且开始支持文件系统,所以修改后的GRUB的Stage1_5生成的二进制代码不需要与没有修改过的GRUB的Stage1_5生成的二进制代码相比较;
A5.计算出修改后的GRUB的Stage1、Start、Stage1_5的可信验证基准值,计算出没有修改的GRUB的Stage2的可信验证基准值,并把这四个基准值组成一个链表Link_Trusted,同时,将Link_Trusted用RSA算法加密生成Encrypted_Link_Trusted。
B.启动非特权域虚拟机时把链表Encrypted_Link_Trusted拷贝到非特权域虚拟机内存的指定位置。其具体实现方法为:
B1.特权域解析hvmloader并将可加载的段拷贝到非特权域虚拟机内存中;
B2.使用扫描虚拟机内存的方式找到预设空间标识的内存地址Mem_Address,然后将Encrypted_Link_Trusted拷贝到Mem_Address。
C.非特权域虚拟机的Rombios中验证非特权域虚拟机的GRUB的Stage1,其具体实现方法为:
C1.在非特权域的Rombios跳转到GRUB的Stage1之前,计算GRUB的Stage1的二进制度量值,同时,解密Encrypted_Link_Trusted得到链表Decrypted_Link_Trusted,然后,查找Decrypted_Link_Trusted第一个链表元素可获得GRUB的Stage1的可信验证基准值。
C2.验证C1得到的可信验证基准值和二进制度量值是否一致,如果一致,把这个二进制度量值扩展(TPM_extend)到相应的平台配置寄存器PCR(Platform Configuration Register)中,并继续正常的非特权Domain启动的下一阶段,否则,阻止继续启动;
D.非特权域虚拟机的GRUB的Stage1验证非特权域虚拟机的GRUB的Start,其具体实现方法为:
D1.GRUB的Stage1运行到把内存0x7000开始的512字节转移到内存0x8000之后,使用BIOS中断请求的方式验证GRUB的Start,这个Start是从0面0道第2扇区的内容读到内存的0x7000处的。然后,在非特权域虚拟机的Rombios中找到这512字节的Start功能代码,计算出其二进制度量值。
D2.查找链表Decrypted_Link_Trusted第二个链表元素即可获得GRUB的Start的可信验证基准值,验证这个基准值和D1得到的GRUB的Start的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的非特权域虚拟机启动的下一阶段,否则,阻止继续启动;
E.非特权域虚拟机的GRUB的Start验证非特权域虚拟机的GRUB的Stage1_5,其具体实现方法为:
E1.GRUB的Start运行到装载Stage1_5去内存0x2200之前,使用BIOS中断请求的方式验证GRUB的Stage1_5,非特权域虚拟机的Rombios中接收到这个验证请求后,结合0x2200的起始地址和从GRUB的Start传递过来的参数stage15_sectors(该参数表示GRUB的Stage1_5实际完成安装后占用的扇区数),计算出GRUB的Stage1_5的功能代码的二进制度量值。
E2.查找链表Decrypted_Link_Trusted第三个链表元素即可获得GRUB的Stage1_5的可信验证基准值,验证这个基准值和E1得到的GRUB的Stage1_5的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动;
F.非特权域虚拟机的GRUB的Stage1_5验证非特权域虚拟机的GRUB的Stage2,其具体实现方法为:
F1.GRUB的Stage1_5运行到装载GRUB的Stage2去内存0x8200之前,使用BIOS中断的方式请求获得GRUB的Stage2的可信验证基准值,非特权域虚拟机的Rombios接收到这个请求后,查找链表Decrypted_Link_Trusted第四个链表元素得到GRUB的Stage2的可信验证基准值。
F2.GRUB的Stage1_5根据内存地址0x8200和Stage2实际占用的扇区个数计算出GRUB的Stage2功能代码的二进制度量值,然后,验证这个二进制度量值和F1得到的GRUB的Stage2的可信验证基准值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
本发明的优点是提供一种适合在全虚拟化环境下进行启动加载器的验证方法,这种方法很好的解决了空间受限的代码条件下进行可信验证的问题,非常适合在当前云计算环境中虚拟机启动加载器的可信验证,具有良好的市场前景和应用价值。
下面结合附图,通过一套具体的基于BIOS中断调用实现对非特权域虚拟机启动加载器进行可信验证的实例进一步描述本发明。
实现对非特权域虚拟机启动加载器进行可信验证的方法流程如图1所示,本发明的方法包括:A.部署生成可信基准值链表Encrypted_Link_Trusted;B.启动非特权域虚拟机时把链表Encrypted_Link_Trusted拷贝到非特权域虚拟机内存的指定位置;非特权域虚拟机的Rombios中验证非特权域虚拟机的GRUB的Stage1;非特权域虚拟机的GRUB的Stage1验证非特权域虚拟机的GRUB的Start;非特权域虚拟机的GRUB的Start验证非特权域虚拟机的GRUB的Stage1_5;非特权域虚拟机的GRUB的Stage1_5验证非特权域虚拟机的GRUB的Stage2。具体一种实施方式如下:
A.部署生成可信基准值链表Encrypted_Link_Trusted,其具体实现方法为:
A1.在Xen的Rombios的功能代码中,增加GRUB的Stage1请求验证的中断响应函数fun1_response_Stage1;增加GRUB的Start请求验证的中断响应函数fun2_response_Start;增加GRUB的Stage1_5请求验证的中断响应函数fun3_response_Stage1_5。
A2.在GRUB的Stage1功能代码中,增加BIOS中断请求的代码,使用BIOS的int 0x1a,子功能号使用bbf1,其作用是请求BIOS验证GRUB的Start,由fun1_response_Stage1响应该请求。之后,检查修改后的GRUB的Stage1代码是否满足编译后正好是512字节且安装在硬盘主引导扇区之后没有破环磁盘分区表的大小和结构,检查的方法是分别用Linux的dd命令得到图2和图3两种二进制影像,图中阴影部分表示了它们的不同之处,由已有的常识有:从地址0X00001BE到地址0X00001FD是磁盘的分区表,地址0X00001FE到地址0X00001FF中存储的是引导记录标识。观察图2,能够确认从地址0X00001BE到地址0X00001FF中存储的内容和图1完全相同,所以这种方法证明了这种修改确实没有破环磁盘分区表的大小和结构
A3.在GRUB的Start功能代码中,增加BIOS中断请求的代码,使用BIOS的int 0x1a,子功能号使用bbf2,其作用是请求BIOS验证GRUB的Stage1_5,由fun2_response_Start响应该请求。之后,检查修改后的GRUB的Start代码是否满足编译后正好是512字节且安装后位于硬盘的0面0道的第2扇区,检查的方法之后,检查的方法参照步骤A2。附图中,图4的第一个字节、最后一个字节与图5的的第一个字节、最后一个字节都一样,可以确认经过修改的GRUB的Start满足要求。
A4.在GRUB的Stage1_5功能代码中,增加BIOS中断请求的代码,使用BIOS的int 0x1a,子功能号使用bbf3,其作用是请求BIOS验证GRUB的GRUB的Stage2,由fun3_response_Stage1_5响应该请求。由于Stage1_5已经准备好C语言的运行环境,并且开始支持文件系统,所以修改后的GRUB的Stage1_5生成的二进制代码不需要与没有修改过的GRUB的Stage1_5生成的二进制代码相比较。
A5.计算出修改后的GRUB的Stage1、Start、Stage1_5的可信验证基准值,计算出没有修改的GRUB的Stage2的可信验证基准值,并把这四个基准值组成一个链表Link_Trusted,同时,将Link_Trusted用RSA算法加密生成Encrypted_Link_Trusted。
计算可信验证基准值的方法是使用SHA(Secure Hash Algorithm)算法,该算法的输出即是需要的可信验证基准值,该算法的输入参数是GRUB的Stage1、Start、Stage1_5、Stage2在磁盘上实际占用的扇区数。图6是一种这四个验证基准值计算结果的实例,将这四个可信验证基准值组成一个链表并用RSA算法加密都是公开的技术且非常简单,不再赘述。
B.启动非特权域虚拟机时把链表Encrypted_Link_Trusted拷贝到非特权域虚拟机内存的指定位置。其具体实现方法为:
B1.特权域解析hvmloader并将可加载的段拷贝到非特权域虚拟机内存中;
B2.使用扫描虚拟机内存的方式找到预设空间标识的内存地址Mem_Address,然后将Encrypted_Link_Trusted拷贝到Mem_Address。
其中扫描虚拟机内存找到预设空间标识的内存地址方法可以参照C库提供的函数memcmp的实现方法。
C.非特权域虚拟机的Rombios中验证非特权域虚拟机的GRUB的Stage1,其具体实现方法为:
C1.在非特权域的Rombios跳转到GRUB的Stage1之前,计算GRUB的Stage1的二进制度量值,计算的方法是使用BIOS中断的方式调用TPM(TrustedPlatform Module)的SHA引擎,其应用了BIOS的int 0x1a中断,子功能号为bb05。解密Encrypted_Link_Trusted得到链表Decrypted_Link_Trusted以及查找Decrypted_Link_Trusted第一个链表元素获得GRUB的Stage1的可信验证基准值的方法都是公开的技术且非常简单,不再赘述。
C2.验证C1得到的可信验证基准值和二进制度量值是否一致,如果一致,把这个二进制度量值扩展(TPM_extend)到TPM的相应的平台配置寄存器PCR(Platform Configuration Register)中,扩展的方法是利用BIOS中断的方式,使用的是BIOS的int 0x1a中断,子功能号为bb02。然后,继续正常的非特权域启动的下一阶段,否则,阻止继续启动。
D.非特权域虚拟机的GRUB的Stage1验证非特权域虚拟机的GRUB的Start,其具体实现方法为:
D1.GRUB的Stage1运行到把内存0x7000开始的512字节转移到内存0x8000之后,使用BIOS中断请求的方式验证GRUB的Start,这个Start是从0面0道第2扇区的内容读到内存的0x7000处的。然后,在非特权域虚拟机的Rombios中找到这512字节的Start功能代码,计算出其二进制度量值。
其中,中断请求应用了int 0x1a中断,子功能号为bbf1,BIOS验证请求的时刻非常关键,必须是保证GRUB的Start加载到内存后,否则,在非特权域虚拟机的Rombios无法通过查找内存的方式找到这512字节,也无法计算其二进制度量值;二进制度量值的计算方法同C1。
D2.查找链表Decrypted_Link_Trusted第二个链表元素即可获得GRUB的Start的可信验证基准值,验证这个基准值和D1得到的GRUB的Start的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。二进制度量值的扩展方法同C2。
E.非特权域虚拟机的GRUB的Start验证非特权域虚拟机的GRUB的Stage1_5,其具体实现方法为:
E1.GRUB的Start运行到装载Stage1_5去内存0x2200之前,使用BIOS中断请求的方式验证GRUB的Stage1_5,非特权域虚拟机的Rombios中接收到这个验证请求后,结合0x2200的起始地址和从GRUB的Start传递过来的参数stage15_sectors(该参数表示GRUB的Stage1_5实际完成安装后占用的扇区数),计算出GRUB的Stage1_5的功能代码的二进制度量值。
其中,中断请求应用了int 0x1a中断,子功能号为bbf2,BIOS验证请求的时刻也非常关键,二进制度量值的计算方法同C1。
E2.查找链表Decrypted_Link_Trusted第三个链表元素即可获得GRUB的Stage1_5的可信验证基准值,验证这个基准值和E1得到的GRUB的Stage1_5的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。二进制度量值的扩展方法同C2。
F.非特权域虚拟机的GRUB的Stage1_5验证非特权域虚拟机的GRUB的Stage2,其具体实现方法为:
F1.GRUB的Stage1_5运行到装载GRUB的Stage2去内存0x8200之前,使用BIOS中断的方式请求获得GRUB的Stage2的可信验证基准值,非特权域虚拟机的Rombios接收到这个请求后,查找链表Decrypted_Link_Trusted第四个链表元素得到GRUB的Stage2的可信验证基准值,并把这个可信验证基准值传送回GRUB的Stage1_5。
其中,中断请求应用了int 0x1a中断,子功能号为bbf3,BIOS验证请求的时刻也非常关键。
F2.GRUB的Stage1_5根据内存地址0x8200和Stage2实际占用的扇区个数计算出GRUB的Stage2功能代码的二进制度量值,计算的方法同C1。然后,验证这个二进制度量值和F1得到的GRUB的Stage2的可信验证基准值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。二进制度量值的扩展方法同C2。
如图7所示,本发明公开一种全虚拟化环境下启动加载器的可信验证系统,包括:
生成可信基准值链表模块,用于部署生成可信基准值链表Encrypted_Link_Trusted;
启动非特权域虚拟机模块,用于启动非特权域虚拟机时把链表Encrypted_Link_Trusted拷贝到非特权域虚拟机内存的指定位置;
Rombios验证非特权虚拟机模块,用于非特权域虚拟机的Rombios中验证非特权域虚拟机的GRUB的Stage1;
Stage1验证非特权域虚拟机模块,用于非特权域虚拟机的GRUB的Stage1验证非特权域虚拟机的GRUB的Start;
Start验证非特权域虚拟机模块,用于非特权域虚拟机的GRUB的Start验证非特权域虚拟机的GRUB的Stage1_5;
Stage1_5验证非特权域虚拟机模块,用于非特权域虚拟机的GRUB的Stage1_5验证非特权域虚拟机的GRUB的Stage2。
所述的全虚拟化环境下启动加载器的可信验证系统,所述生成可信基准值链表模块还包括:
增加函数模块,用于修改Xen的Rombios的功能代码,增加GRUB的Stage1、GRUB的Start、GRUB的Stage1_5对BIOS的请求验证的中断响应函数;
检查Stage1模块,用于修改GRUB的Stage1功能代码,加入用BIOS中断的方式请求验证GRUB的Start的功能代码,并检查修改后的GRUB的Stage1代码是否满足编译后正好是512字节且安装在主引导扇区之后没有破环磁盘分区表的大小和结构,检查的方法是与没有修改过的GRUB的Stage1生成的二进制代码进行比较;
检查Start模块,用于修改GRUB的Start功能代码,加入用BIOS中断的方式请求验证GRUB的Stage1_5的功能代码,并检查修改后的Start代码是否满足编译后正好是512字节且安装后位于0面0道的第2扇区,检查的方法是与没有修改过GRUB的Start生成的二进制代码进行比较;
验证Stage2模块,用于修改GRUB的Stage1_5功能代码,加入用BIOS中断的方式请求验证GRUB的Stage2的功能代码,由于Stage1_5已经准备好C语言的运行环境,并且开始支持文件系统,所以修改后的GRUB的Stage1_5生成的二进制代码不需要与没有修改过的GRUB的Stage1_5生成的二进制代码相比较;
计算模块,用于计算出修改后的GRUB的Stage1、Start、Stage1_5的可信验证基准值,计算出没有修改的GRUB的Stage2的可信验证基准值,并把这四个基准值组成一个链表Link_Trusted,同时,将Link_Trusted用RSA算法加密生成Encrypted_Link_Trusted。
所述的全虚拟化环境下启动加载器的可信验证系统,所述启动非特权虚拟机模块还包括:
特权域解析模块,用于特权域解析hvmloader并将可加载的段拷贝到非特权域虚拟机内存中;
找寻内存地址模块,用于使用扫描虚拟机内存的方式找到预设空间标识的内存地址Mem_Address,然后将Encrypted_Link_Trusted拷贝到Mem_Address。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Rombios验证非特权虚拟机模块还包括:
计算Stage模块,用于在非特权域的Rombios跳转到GRUB的Stage1之前,计算GRUB的Stage1的二进制度量值,同时,解密Encrypted_Link_Trusted得到链表Decrypted_Link_Trusted,然后,查找Decrypted_Link_Trusted第一个链表元素可获得GRUB的Stage1的可信验证基准值;
扩展模块,用于验证计算Stage模块得到的可信验证基准值和二进制度量值是否一致,如果一致,把这个二进制度量值扩展(TPM_extend)到相应的平台配置寄存器PCR中,并继续正常的非特权Domain启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Stage1验证非特权域虚拟机模块还包括:
中断请求模块,用于GRUB的Stage1运行到把内存0x7000开始的512字节转移到内存0x8000之后,使用BIOS中断请求的方式验证GRUB的Start,这个Start是从0面0道第2扇区的内容读到内存的0x7000处的。然后,在非特权域虚拟机的Rombios中找到这512字节的Start功能代码,计算出其二进制度量值。
验证Start模块,用于查找链表Decrypted_Link_Trusted第二个链表元素即可获得GRUB的Start的可信验证基准值,验证这个基准值和中断请求模块得到的GRUB的Start的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Start验证非特权域虚拟机模块还包括:
中断验证模块,用于GRUB的Start运行到装载Stage1_5去内存0x2200之前,使用BIOS中断请求的方式验证GRUB的Stage1_5,非特权域虚拟机的Rombios中接收到这个验证请求后,结合0x2200的起始地址和从GRUB的Start传递过来的参数stage15_sectors,计算出GRUB的Stage1_5的功能代码的二进制度量值;
验证一致模块,用于查找链表Decrypted_Link_Trusted第三个链表元素即可获得GRUB的Stage1_5的可信验证基准值,验证这个基准值和中断验证模块得到的GRUB的Stage1_5的二进制度量值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
所述的全虚拟化环境下启动加载器的可信验证系统,所述Stage1_5验证非特权域虚拟机模块还包括:
获得验证基准值模块,用于GRUB的Stage1_5运行到装载GRUB的Stage2去内存0x8200之前,使用BIOS中断的方式请求获得GRUB的Stage2的可信验证基准值,非特权域虚拟机的Rombios接收到这个请求后,查找链表Decrypted_Link_Trusted第四个链表元素得到GRUB的Stage2的可信验证基准值;
验证基准值一致模块,用于GRUB的Stage1_5根据内存地址0x8200和Stage2实际占用的扇区个数计算出GRUB的Stage2功能代码的二进制度量值,然后,验证这个二进制度量值和获得验证基准值模块得到的GRUB的Stage2的可信验证基准值是否一致,如果一致,把这个二进制度量值扩展到相应的PCR中,并继续正常的的非特权域虚拟机启动的下一阶段,否则,阻止继续启动。
本领域的技术人员在不脱离权利要求书确定的本发明的精神和范围的条件下,还可以对以上内容进行各种各样的修改。因此本发明的范围并不仅限于以上的说明,而是由权利要求书的范围来确定的。