Linux内核结构:
Linux内核由七个部份构成,每位不同的部份又有多个内核模块组成,结构框图如下:
Linux剪裁场景剖析:
通过剖析Linux内核源代码可以听到不同目录中储存着不同模块的实现代码,同时在编译时可以config中配置的信息来控制什么模块编译到最终的二补码中linux内核漏洞,什么模块被裁切掉,例如以IPV6模块为例,控制该模块的配置名称为CONFIG_IPV6,假如该配置项为设置为y,则表示该功能模块未被编译到最终的二补码文件中,如下所示:
假如该功能模块被裁切了,虽然该漏洞没有被补丁修补linux内存管理,这么该功能模块中存在的漏洞在二补码中也是不受影响的,因而和IPV6相关的漏洞在漏洞检查时就应当在报告中明显的标示出不受该漏洞的影响,如CVE-2013-0343(Linuxkernel3.8之前版本内的net/ipv6/addrconf.c中的函数ipv6_create_tempaddr没有正确处理IPv6临时地址生成问题,可容许远程功击者通过ICMPv6RouterAdvertisement(RA)消息,导致拒绝服务,之后获取敏感信息)。
业界二补码SCA工具不能测量的诱因剖析:
为何目前业界一般的二补码SCA工具难以做到精准测量,缘由是由于业界二补码SCA工具是基于测量到的开源软件名称和版本号来关联出已知漏洞清单的,而这些通过剪裁功能模块的方式来应用Linux内核,开源软件名称和版本号是不会改变的,因而工具就难以精准的测量下来了。
二补码SCA工具怎样实现该功能:
要实现Linux内核剪裁场景下的已知漏洞精准测量,二补码SCA工具必须在原先检查开源软件名称和版本号的基础上,须要实现更新细颗粒度的测量技术,基于源代码文件颗粒度、函数颗粒度的测量能力,进而实现剪裁场景下已知漏洞的精准测量,即可以晓得什么代码被编译到最终的二补码文件中,什么代码没有参与编译。同时漏舱室也必须实现对细颗粒维度的支持,即漏洞信息必须精准定位是由什么文件和函数中的代码片断引入的。
以CVE-2013-0343为例,通过剖析漏洞描述信息和Linux内核源代码,可以获取到该漏洞和下边这种位置代码相关的定位信息:
"CVE-2013-0343":{
"net/ipv6/addrconf.c":[
“addrconf_add_ifaddr”,
“addrconf_dad_begin”,
“addrconf_dad_stop”,
“addrconf_dad_work”,
“addrconf_del_ifaddr”,
“addrconf_prefix_rcv”,
“addrconf_verify_rtnl”,
“addrconf_verify_work”,
“inet6_addr_add”,
“inet6_addr_del”,
“inet6_addr_modify”,
“inet6_rtm_deladdr”,
“inet6_rtm_newaddr”,
“inet6_set_iftoken”,
“inet6_set_link_af”,
“ipv6_create_tempaddr”,
“manage_tempaddrs”
基于假如引入漏洞的源代码没有参与编译出二补码,这么编译下来的二补码也就是不存在该漏洞的原理;因而只要二补码SCA工具能测量出上述位置的源代码没有参与编译出最终的vmlinux二补码文件linux移植,这么此vmlinux文件就不受CVE-2013-0343漏洞的影响。
总结:
二补码SCA工具要想更好的辅助安全人员实现安全审计、降低漏洞测量的误报率,必须向更细颗粒度的测量维度发展linux内核漏洞,而不仅仅逗留在开源软件的层面,同时对漏舱室的要求也须要向细颗粒度的精准信息提出的挑战。