嵌入式Linux内核安全防御技术和挑战
Linux的应用已经超出了原来的传统主机的范畴,Linux已经大量应用在移动设备和物联网设备上。人们利用这些设备不仅用来运算,还进行安全交易,存储安全数据等等
0x01石器时代的Linux内核安全 Linux的应用已经超出了原来的传统主机的范畴,Linux已经大量应用在移动设备和物联网设备上。人们利用这些设备不仅用来运算,还进行安全交易,存储安全数据等等。这对Linux内核提出了更高等级的安全需求。 Linux内核长期以其多年没有提升内核安全而深受诟病,主要原因是Linux社区里长期认为Linux的速度、效率是最重要的,而不是安全。LINUS认为如果因为安全问题而导致速度和效率受影响,那么提高安全是得不偿失的。另外还有些安全性的提升是没有用的,因为它们已经被证明很容易被攻破(比如内核地址随机化)。 正是有了这些不同的声音,多年来Linux内核并没有太大的安全提升,而且也正是因为当心快速修复漏洞而影响其他的性能,Linux内核的漏洞修复往往会太慢,而导致很多安全问题长期没有得到解决。 这些年除了SELinux及PXN技术还算是比较有效的防御手段之外,Linux的安全已经远远落后在windows之后。 0x02厂家的安全改进 这些年随着移动设备和物联网设备的发展,越来越多的厂家为了提升自家基于Linux内核产品的安全性,厂家百花齐放推出了一些新的防御手段: 小米公司在1S中加入了代码段只读保护。 华为公司在其荣耀6中推出的FBLOCK防御及内核代码段和常量数据只读保护。 这里面比较突出的是三星电子,三星一直是手机安全技术发展的引领者。 2014年三星在其NOTE3及GALAXYS4内核中引入了KNOX技术,三星KNOX实际是设备上的一个虚拟安卓环境。它拥有自己独立的界面,浏览器,应用以及组件,用户在KNOX里操作不会影响到外面的程序,外面的聊天记录、安装好的程序也不会影响到KNOX里,两者可以说是完全分离的。 三星KNOX终端适用于各类企业,包括中小型企业,大型企业,甚至严格受管控的企业。基于AD的管理使IT管理员十分容易的利用已有的AD管理工具来管理移动设备。而SSO可以使用户轻松实现多应用的单点登录。 三星KNOX提供了分层安全解决方案,包括以下特点: TrustedBoot保证了在启动时的安全性,但是他不能保障系统运行过程中的安全。 SEforAndroid在系统内核的基础上保证了系统的访问权限,但是它不能保障内核本身没有被篡改。 而TIMA的主要功能正是保障系统内核不被篡改。TIMA技术是三星为移动设备开发的KNOX平台的安全层一个核心部分。 TIMA技术由北卡州立大学的宁鹏教授(中国人)发明,并且通过第三方公司,授权三星公司使用。为了更好地开发TIMA技术,宁鹏教授辞去职位,加入三星美国研发中心。现在担任企业安全副总裁职位,负责KNOX技术的全球研发工作。 2014年三星在其NOTE3和GALAXYS4内核里引入了SELINUX,通过细粒度的权限设置,使得普通用户就利用驱动漏洞攻击内核的可能性大大降低。 在KNOX技术中三星GALAXYS4手机利用内置的数字签名,有效阻止了恶意的LKM模块,加载到手机内核中来。 2015年三星在GALAXYS5内核中引入了内核代码区和常量数据区只读保护。 2015年,三星在GALAXYS6中增强了内核的防护,引入了KAP和KDP技术。 0x03从产品的定位看安全 对于Linux社区来说,主要的应用在于为简单廉价的硬件提供高效可扩展的Linux内核,利用集群效率满足大规模的运算需求,以减少企业对大型主机的依赖,所以安全只是Linux的一个辅助需求。 对于传统通信企业三星来说,三星认为客户来源一方面是来自于个人,另外方面是来源于集团采购(如电信运营商,军队,政府,大的企业集团)。 三星为个人应用和企业应用了提供不同的安全环境,并借助硬件的安全加密芯片TRUST_ZONE,建立起用户空间和安全空间的平行世界。对于非法内核的攻击,设备能够主动防御。除此之外三星还提供可供企业后台管理终端设备的机制。 对于其他厂家来说,定位是个人消费电子产品,只要不容易被黑客利用一个漏洞就可以简单Root就可以。而正是不同厂家的产品定位决定了在产品中采用的安全防御手段的复杂度。 0x04常见的防御手段及攻击方法 1.内核代码段和常量数据只读保护。 在内核3.4开始,linux内核就提供了mark_rodata_ro的编译宏定义。厂家可以在自己的内核里实现相应的内核代码段和常量数据的只读保护。通过这个只读保护,可以防止攻击者向内核注入rootkit或是修改系统调用表。 面我们以华为荣耀6为例,介绍一下相应的实现。在荣耀6的内核启动日志里,我们可以看到这么一段提示信息。 [pid:1,cpu0,swapper/0]Writeprotectingthekerneltextsectionc0608000-c1327000 [pid:1,cpu1,init]init:initstarted! 从这段提示信息我们可以知道这init进程启动完成前,内核对内核虚拟地址c0608000-c1327000进行了写保护。 我们可以在内核的kernel/arch/arm/mm/rodata.c,找到该段代码: 这段代码的提示告诉我们从_text到_end_rodata到范围内都做了写保护,写保护的实现是通过set_memory_ro函数内部调用实现set_page_attributes来实现的。 攻击方法: 针对这种页保护的防御,较常用的方法是,从物理页表中取相应的页表条目,找到页表描述符,修改相应的权限。在2014年SyScan360中360团队的安全人员介绍了这种通用修改页表权限的攻击方式。 在华为荣耀6,我们可以通过利用内核中现成的代码来完成页表属性的修改。我们发现可以通过内核导出函数set_memory_rw来打开内核页表的读写权限。set_memory_rw函数的定义如下: intset_memory_rw(unsignedlongvirt,intnumpages) virt为起始虚拟地址,可以设置为_text的虚拟地址, numpages为页表的数量,可以设为(_end_rodata页对齐-_text页对齐)/4k的值。 2.System区写保护 为了防止root,有些厂家直接在/system/xbin里禁止su程序存在。如果su程序存在则直接警告。 华为则是通过FB_LOCK防护技术来禁止对mmc的system分区进行写操作,从而达到防止root的效果。为了防止持久ROOT,如果编译的时候开启了CONFIG_HW_SYSTEM_WR_PROTECT宏,而且ro_secure_debuggable变量是否为1,则在SYSTEM分区进行数据块写入操作,操作将被直接拒绝。 攻击方法: 可以通过直接修改ro_secure_debuggable内核变量,将该变量的值设为0,则使得条件判断为假,从而绕过System区写保护。 3.PXN防御 PXN(PrivilegedExecute-Never)“特权执行从不”技术由ARM公司提出,主要防御RET2USR的攻击,它的开启与否主要由页表属性的PXN位来控制。 64位内核中,内核对用户空间的内存页默认开启PXN位。通过设置PXN位,内核就不能直接执行用户空间的攻击代码,从而有效防御RET2USR攻击。 PXN的绕过方法: 1)利用ROP技术绕过PXN ROP主要原理是通过控制内存中的一段数据,通过控制数据来控制代码执行流,如组合执行内核中特定的代码片段,从而达到修改内核中的关键数据,达到提权限的目的。这种攻击方式是需要进行不同机型中查找到多段代码片段,如果需要root的机型较多,则需要攻击者投入较多精力去做适配。 2)利用RET2DIR技术 该技术由哥伦比亚大学在2014年提出,其利用原理是,Linux内核在设计的时候,在用户空间映射内存的时候,为了提高内存的操作效率,内核也相应地在内核的低端内存区地址映射一段影子内存。 攻击者利用该缺陷,将用户空间的攻击代码映射到内核的低端内存可执行区或者将特定数据进行喷射到内核的低端内存,进行内存布局,然后利用发现的漏洞,让内核执行攻击代码,从而达到提权的作用。这项技术在32位arm设备上有65%以上的成功率,而在64位arm中有96%的成功率。 与ROP不同,RET2DIR这项技术不需要对内核代码进行重利用和组合,就可以直接将攻击代码或数据映射到内核的低端内存。 由于64位ARM内核的设备都已经开启了PXN防护,这项技术成为通用root工具绕过64位ARM内核的PXN必备技术。在KingRoot的cve-2015-3636和cve-2016-1805漏洞利用中都使用到了该技术绕过PXN防护。 3)通过内核特定函数完成PXN绕过。 该技术在2016年MOSEC大会上由360团队公开,该技术巧妙地利用kernel_setsockopt函数的特性,通过控制r0,让内核执行set_fs(KERNEL_DS),实现任意地址读写权限的效果。 4.KNOX绕过 在三星KNOX里对内核保护主要由TIMA完成。TIMA使用ARMTrustZone硬件,持续的监控linux内核的完整性。 在KNOX1.0TIMA通过两种方法确保Linux内核不会受到侵害: 1.通过定期将内核的测量结果与原始出厂内核相比较来确定内核未遭到更改。 TIMA会对内核的Uevent事件进行监控,当关键的监控事件发生时,TIMA会对内核进行完整性测试和主动防御。 2.在动态加载时,对内核模块进行身份验证。 与Linux内核采用的CRC完整性认证机制不同,TIMA采用了数字证书签名技术对加载的内核模块进行合法性验证,以确保每个加载的模块都是合法的。 在2014年SyScan360大会上360团队的陈章琪和申迪介绍了TIMALKM验证机制的绕过方法。他们的思路是通过Patch内核的代码,绕过TIMA验证。具体的攻击方法如下: 在/kernel/module.c,copy_and_check函数 在KNOX2.0,TIMA引入了实时内核保护(RKP)技术。RKP可在TrustZone内对操作系统进行持续不断且富有策略性的实时监控,以防止篡改内核。 RKP可对内核内部发生的重要事件进行审计(可在ARM中进行检查)。如果确定某个事件对OS内核的完整性具有影响,则RKP将会停止该事件,或记录怀疑存在篡改行为的认证结论,并将其发送至MDM。这可以防止恶意修改和注入内核代码,包括强制内核破坏自身的数据。 在2.0版本的RKP除了保护页表之外,还保护一些关键的内核对象(如cred,real_cred)。RKP将存储关键安全信息对象的kmem_cache里所有的页都设为只读,只能在TIMA里面对kmem_cache里的页进行写操作。 在MOSEC2016大会上,科恩实验室的方家弘介绍了KingRoot产品中修改这些关键安全数据,实现DKOM的方法。KingRoot的方法是利用cve-2015-1805的任意地址写的漏洞,修改file_operations里的int(*check_flags)(int)函数指针,使得函数指针指向override_creds函数。 通过控制check_flags函数输入参数,使得TIMA主动修改cred的值,从而绕过RKP防护,达到提权的效果。 除了防止运行时修改关键的安全数据结构之外,RKP还对一些系统调用进行监控,如execve系统调用。 对于任何的ROOT进程,sec_restrict_fork函数将判断是否该进程的路径是来自/data目录,正常情况下,该目录是存放用户程序的唯一路径。三星希望这样可以阻止类似SU这样的程序可以给/DATA/目录下的用户程序赋权限的情况发生。但是,我们可以依然可以修改一些关键数据来绕过sec_restrict_fork函数的判断。 0x05Linux社区的改进 在2015年Linux内核大会上,Keescook(原红帽Linux的安全主管)提出对Linux的安全进行提升,这项建议得到了Linux大会与会人员的认可。KeesCook后来主导了Self-ProtectionProject(KSPP)项目,其目标是为了让Linux内核本身具有对漏洞利用的防御能力,主要工作是参考PaX/Grsecurity的实现来移植或者重新实现类似的功能,然后推进到Linux内核主线。 KSPP主要通过以下措施来提升Linux内核的安全: 1.减少内核的攻击面,安全漏洞防御的最基本是要减少对利用内核代码的进行内核攻击的范围。 为此需要限制公开的Api提供给用户空间,尽量减少API可写内核的内存范围等等。 2.严格限制访问内核内存权限。 3.内核的可执行代码和只读数据必须不能写入。 4.内核的函数指针和敏感变量必须不能非法写入。 5.分离用户空间内存和内核内存。用户空间不能访问内核内存,同样内核在默认情况下也不能访问用户空间内存,除非是特定的需要。 6.减少兼容的系统调用。 64位的Linux内核中依然存在兼容32位设备的代码。这些代码对Linux内核的安全造成了影响。近年来,出现了不少因为32位和64位兼容性产生的安全问题。 0x06总结 Linux的应用已经超出了原来的传统主机的范畴。Linux已经大量应用在移动设备和物联网设备上,人们利用这些设备不仅用来运算,还进行安全交易,存储安全数据等等。这对Linux内核提出了更高等级的安全需求。 近年来,设备厂家为了提高自身产品的安全性,设计出了新的Linux内核安全防御技术。这些技术一定程度上保证了Linux内核的安全。特别是三星,提出了KNOX安全解决方案,有效地抵御了可能的内核攻击。同时Linux社区也不断改进,推出了KSPP项目。 对应内核攻击者来说,许多攻击技术将被有效防御,但是以下的方法依然有效: 计算机的数据会影响代码流的执行,在一定条件下通过修改数据可以影响代码的执行流。 如果防御手段依然是由内核被动调用,那么通过代码重用可以击破这种的防护。 我们可以预见未来Linux内核的安全与对抗将会越来越精彩。 0x07参考资料 1.三星KNOX官网linux系统安全, 2.方家弘,科恩实验室,Emerging-Defense-in-Android-Kernel 3.VasileiosP.KemerlisMichalisPolychronakisAngelosD.Keromytis, ColumbiaUniversityret2dir:RethinkingKernelIsolation, 4.陈章琪、申迪,Android平台Bootkit高级攻击技术, (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |