前言
最近关注了一个很牛的公众号,因为看到了一些关于安全的文章,这里转载学习一下:
地址:https://mp.weixin.qq.com/s?__biz=MzAxMDM0NjExNA==&mid=2247488551&idx=1&sn=dc325d9d69b60d8d3dd2c46821fee401&chksm=9b509fcaac2716dc0d40b20a774163944f515f76b78cd230a732dc12dd8b202255393fd30986&scene=21#wechat_redirect
感谢前辈们的优秀博客,如果侵权,请联系删除。
一、概述
如今Android智能设备的安全和隐私保护技术&体验已越来越好,但很多老用户,可能对早年Android手机的各种漏洞、“一键root”工具还有印象。(记得当时买的小米,有个专门的root论坛,时光好快)
那位于Android系统底层的Linux内核,在这些年发展中,它的安全特性有哪些变化呢?
本文是Linux内核安全技术系列的第一篇,希望通过回顾开源内核安全技术演进过程,回答上述问题。
1.1 说明
本文主要分析开源社区中Linux内核安全加固技术、入侵检测和防御技术,常见漏洞类型及缓解技术等。不涉及Linux内核传统安全特性&机制的分析,如LSM、MAC(SELinux)、IMA等;也不涉及某个或某些内核漏洞的详细分析。
1.2缩略语和术语
本文使用的缩略语和术语说明如下
二、内核主线
通过梳理2009~2022相关公开资料,我们将Linux Kernel Security开源发展分成三个阶段,如下图所示:
第一阶段,200x~2014年,主要特征是“Out-of-Tree”,一方面内核社区对待安全的主流态度是“Reactive”和“security bugs are just bugs”,相对被动消极;另一方面,内核主线社区外,已经有系统全面的内核加固方案(Grsecurity/PaX)。
第二阶段,2015年,内核社区集中讨论安全加固必要性,最终以华盛顿邮报批判报道(参考文末链接 2015.11 net of security: the kernel of the argument)为标志,社区态度转变并启动KSPP(Kernel Self Protection Project)内核自保护项目。
第三阶段,2016~2022年,主要特征是“KSPP”,大量内核安全特性通过KSPP项目陆续合入主线,并广泛应用在Android设备上。同时,内核安全涌现新的研究热点(Compiler Security、RUST)。
2.1、Out-of-Tree
这个阶段,Linus本人及内核社区对待安全的主流态度相对消极和被动(reactive)的,一方面认为安全加固对性能、稳定性有负面影响,一方面认为安全漏洞按常规bug处理,发现并快速修复即可。比较典型如2010年10月Kernel Summit上关于security的讨论,节选如下:
相反,此阶段也有不少开发者建议采用更积极主动(proactive)的态度应对内核安全和漏洞。例如当时还在Canonical负责Ubuntu Kernel Hardening的Kees Cook提出“Security is more than bug fixing”,建议采用主动防御机制提前发现问题,或封堵漏洞利用路径。
并且,此阶段已涌现多个非主线社区安全项目,如RedHat ExecShield、Ubuntu AppArmor(2010年10月部分合入主线2.6.36)等,其中业界公认最全面系统的Linux内核安全方案则是Grsecurity/PaX项目。Grsecurity/PaX项目Maintainer Bradley Spengler更是在2010年8月的Linux Security Summit上发表了《Linux Security in 10 Years》演讲,阐述内核安全性不足及加固必要性。
Grsecurity/PaX
Grsecurity/PaX 由两个独立社区(分别成立于2001和2000)合并而来,是一组针对Linux Kernel的安全加固补丁,以一个大patch的源码形式发布。
融合后的Grsecurity/PaX提供全面的内核安全防御机制,
- 包括RBAC访问控制、
- 内存corruption防御、
- 基于编译器(GCC Plugin)特性的安全加固、
- 文件系统加固等。
Grsecurity/PaX是Linux内核安全开源领域的重要源头,其研究和特性不仅影响Linux内核及其发行版,也影响到Windows、OpenBSD等操作系统。
2017年4月26日,Grsecurity/PaX宣布不再公开patch源码,仅向付费客户提供服务。围绕此事,社区和开发者有众多讨论,非本文重点,感兴趣读者可参考文末链接 2017.05 Grsecurity goes private文章及评论。
(说明:Grsecurity/PaX大部分经典特性,随着KSPP项目推进,已被借鉴、移植到内核主线,在此不详细介绍)
2.2、Turning Point
随着Android智能手机普及,采用Linux Kernel的Android系统早期饱受安全困扰(如各种一键root工具)。
- 一方面Android通过修复bug、使能安全特性(SELinux)增强系统安全性;
- 另一方面,内核社区也兴起新一轮关于安全加固必要性的讨论。
2015年8月 Linux Security Summit会议上,Linux foundation Administrator Konstantin Ryabitsev 发表《Securing your IT Infrastructure by Securing your Team》演讲,通过类比汽车领域安全理念和技术发展过程,强调Linux增强安全机制必要性。
Linux Security Summit会后,Linux 内核安全子系统Maintainer James Morris在邮件中倡议2015年10月Kernel Summit会议中增加“Kernel Hardening” 主题topic,不少开发者响应并在邮件列表中进行了积极讨论。
2015年10月Kernel Summit上Kees Cook & James Morris 做了《Improving Kernel Security》演讲,强调security is more than bug fixing,并主张进行内核自保护建设。Kees梳理了常见漏洞bug及exploitation攻击类型、以及对应防御技术。Linus仍然很关注性能,建议避免对性能影响过大的安全特性。
Kees Cook提到了内核安全加固面临的挑战,比如内核社区对待安全的传统观念、方案复杂性、专家资源等。这个议题引起了开发者广泛讨论,并似乎有了一些共识:为了提升用户安全性,一些牺牲是必要的(some sacrifices may need to be made to provide the level of security that our users need)。
从2015年11月4日的文章security part2看,在10月上述议题后,社区核心Maintainer对增强内核安全的一些细节也进行了充分技术讨论,虽然没有明确结论,但社区对安全的接受程度似乎有了明显转变。
从上述信息看,社区内部对安全态度已经有了转变。但巧合的是,2015年11月5日华盛顿邮报刊登了文章《net of security: the kernel of the argument》,对Linus及内核社区忽视安全的态度进行了“批判”,文章加速了社区转变进程。该报道原文较长,读者可参考文末链接,下图是11月6日的 “精简版”:
华盛顿邮报道发出后,引发社区广泛讨论。几个小时后Kees Cook 发布了KSPP项目启动邮件。
11月6日,社区对报道事件进行了相对正式回应/总结:A new Mindcraft moment。从内容看,社区态度相对积极,一方面能够客观的正视邮件中提到的问题(如前期社区对安全的消极态度)。
另一方面,也进行了说明/辩解(如开发者背后商业公司的目标、投入支持等)。
最后社区认为在转变安全观念(报道加速了这一过程)后,KSPP项目一定能够取得较好的结果(do amazing things)。
2.3、KSPP
KSPP启动后,几乎每年(2016~2019、2021)的Linux Security Summit会议上,Kees Cook都会进行第一次status update,说明KSPP加固项目原因、目标、最新进展。
2020年Linux Security Summit会上,Grsecurity/PaX项目Maintainer Bradley Spengler又一次发表了《10 Years of Linux Security》演讲,系统回顾了2011~2020年间Linux内核安全加固的重要事件、特性。
通过整理上述资料及相关信息,我们将KSPP项目整体情况归纳如下:
漏洞窗口期
KSPP在阐明加固必要性时,多次引用过内核漏洞信息。一方面,虽然开发者在发现并修复bug,但外部attacker更擅长挖掘漏洞并利用,且一般不公开其成果,因此有潜在漏洞/利用路径存在;另一方面,内核漏洞的修复时间比多数开发者想象的要长,从引入到修复平均5.5年,因此attacker有较长利用窗口期。下面是具体数据:
-
1)2010年10月 Jonathan Corbet在其文章《Kernel vulnerabilities: old or new?》中研究了2010年内核CVE的“生命周期”,即从commit提交引入bug到最后修复,平均持续5年。
-
2)2015年开始Kees Cook跟踪分析了Ubuntu内核CVE数据,从2015~2021统计数据显示,“Critical”和“High”类CVE漏洞(138个)平均修复时间为5.5年(2021.09 KSPP status)。如下图中,横坐标为CVE ID,纵坐标为对应内核版本号(时间),柱图表示CVE在内核中的版本(时间)跨度。
KSPP目标
KSPP目标从低到高可描述为:killing bugs -> killing bug classes -> killing exploitation。
在参考安全业界对漏洞及攻击分类基础上,KSPP将bug classes、exploitation进行了划分,并规划制定了对应缓解技术方案(2016 KSPP status)。本文整理如下:
KSPP方案
KSPP规划的Mitigations方案,从防御效果上可分成两类:
-
第一类是probabilistic protection,概率性防御或漏洞缓解,增加攻击者利用漏洞的难度,典型的如KASLR(Kernel Address Space Layout Randomization)内核地址随机化。
-
第二类是deterministic protection,确定性防御,即修复/封堵攻击者可能利用的缺陷和路径,如内存保护方案中的W^X(堆、栈内存不可执行,无法在堆栈内存上部署恶意代码)、 XoM(eXecute Only Memory)代码段内存只可执行不可读(依赖硬件)等。
除Linux Security Summit上的例行演讲外,Kees Cook在个人博客上也会总结每个kernel 版本合入的新安全特性,可参考文末链接 Security things in Linux v4.x/v5.x。
结合上述信息,本文梳理了2015.11之后kernel各版本安全加固特性(已精简),汇总说明如下:
- kernel 4.x阶段,不少特性参考或移植了Grsecurity/PaX对应特性(或部分),下图中第五列说明;
- kernel 4.x阶段,加固特性数量和类型都较多,主要类型有:
- 缩小攻击面,解决设计实现缺陷。例如W^X detection、VMAP_STACK、THREAD_INFO_IN_TASK、read only after init等。THREAD_INFO_IN_TASK是一个典型缩小攻击面特性,将原本放在栈内存上的thread_info结构体,移到task struct全局变量中,防止攻击者通过stack overflow对thread_info结构体敏感数据(addr_limit)进行篡改。
下图是该特性对应commit(c02433dd6de32f042cf3ffe476746b1115b8c096)删除部分,及修改后thread_info位置。
+ 漏洞利用防御和缓解。**例如为缓解堆喷射(heap spray)攻击**,堆内存free list增加随机化处理,即SLAB/SLUB free list ASLR;例如为防止stack buffer overflow被利用为ROP攻击,**引入stack protector**;以及**内核地址随机化KASLR等**。
+ 信息防泄漏,**在敏感场景对特定内存清零**。例如STRUCTLEAK、STACKLEAK、zero-poison after free、new kernel stacks clear on fork等。
+ 编译器安全技术。例如GCC Plugin infrastructure(STRUCTLEAK、STACKLEAK基于此特性)
- kernel 5.x阶段,安全特性和4.x相比有较大变化,主要有:
- 硬件安全特性使能。例如ARM64 硬件安全特性TBI、PAC、BTI、MTE等;
- 编译器安全技术。例如基于Clang的控制流完整性技术,包括防ROP攻击的shadow call stack、防JOP攻击的CFI等。
KSPP总结
KSPP历经多年开发迭代,许多特性也多次优化重构,特性基线已相对成熟稳定,早期目标基本达成,具体表现:
文档和特性分类
相比早期按bug classes 和exploitation进行分类(特性分散),新的分类简单聚合,具体可参考Linux kernel官方文档 https://docs.kernel.org/security/self-protection.html。本文在该文档基础上,对特性和内核配置进行了简单梳理,供参考:
目标完成情况
回顾KSPP早期目标(killing bugs -> killing bug classes -> killing exploitation),及各版本安全特性合入情况对比,可看出主要bug类型、exploitation攻击路径基本都有了对应缓解/加固方案,近几年安全特性的合入数量频率均降低(Kees Cook博客更新频率、LSS会议上KSPP status update频率)。
2018~2022阶段,内核安全领域研究的重心和热点,已不仅是内核代码的修复升级、软件加固方案,而是:
- 新硬件安全特性使能(ARM64)、
- 编译器安全特性(GCC & Clang)、
- 安全编程语言(Making C Less Dangerous、RUST)。
开源安全生态
相比多年前开源社区对待安全的态度,现在内核安全得到了软硬件厂商、各领域开发者越来越多的关注和积极参与。例如一个好的现象是:一些安全特性(尤其硬件安全特性),非安全领域的开发者或Maintainer不经过KSPP就直接完成了。
三、Android Kernel
在近年内核安全领域发展中,Android(Google)扮演了重要的角色。下图是LSS、LPC会议上相关安全topic的一个梳理。
第一阶段
第一阶段,采用Linux内核的Android设备饱受安全困扰,并且内核安全漏洞占比不少(见下图)。一方面Android通过使能安全特性(SELinux)、修复bug、缩小攻击面等手段提升系统安全性;另一方面积极推动和投入KSPP项目(Kees Cook Join Google in 2011),引入更多安全加固特性。详情可参考文末资料2016 Android: Protecting the kernel和2018 Year in Review: Android Kernel Security。
第二阶段
第二阶段,针对Android系统和内核碎片化、升级慢问题,先后引入Treble和GKI项目进行架构解耦,方便设备厂商快速升级内核,减少使用低版本(漏洞)内核的设备数量和暴露时间,同时引入高版本内核安全增强。
第三阶段
第三阶段,探索新技术提升Android 和Kernel安全性。例如推动Clang build kernel,使内核态和用户态编译工具链归一,便于在GKI内核中默认开启Clang安全特性(如CFI),提升整体安全性;另外,2019年业界RUST for kernel module有了阶段进展后,Android(Google)也在加快探索使用RUST语言开发内核驱动(2021 Android drivers in RUST),因为driver漏洞在内核漏洞中占大多数。
GCC和Clang编译器安全特性对比见下图,详情可参考文末链接:2021 Compiler Features for Kernel Security。
四、开源社区
除主线社区KSPP内核自保护项目外,开源社区也有许多其他内核安全方案。
- 其中一类是HIDPS(Host-based Intrusion Detection & Prevention System)主机入侵检测&防御系统。这类方案聚焦如何实时、动态的监测入侵/攻击行为,并拦截或及时上报。
- 典型开源方案有OpenWall社区的LKRG(Linux Kernel Runtime Guard)、HITACHI的AKO(Another Kernel Observer)等。
限于篇幅,本文只做简单介绍,待后续文章中再做详细分析。
除主线社区KSPP内核自保护项目外,开源社区也有许多其他内核安全方案。其中一类是HIDPS(Host-based Intrusion Detection & Prevention System)主机入侵检测&防御系统。这类方案聚焦如何实时、动态的监测入侵/攻击行为,并拦截或及时上报。典型开源方案有OpenWall社区的LKRG(Linux Kernel Runtime Guard)、HITACHI的AKO(Another Kernel Observer)等。
限于篇幅,本文只做简单介绍,待后续文章中再做详细分析。
LKRG
LKRG是OpenWall社区2018年发布的内核入侵检测防御技术,以内核KO形式加载(故可适应多种Linux发行版和内核)。
其主要原理是通过
- 监控内核代码段、只读数据段、敏感变量/数据(如selinux_enabled/selinux_enforcing)、
- 任务权限数据(如cred、uid/euid)等的完整性,来判断是否有入侵行为并及时拦截。
2020.03 Effectiveness of Linux Rootkit Detection Tools 论文评测显示,LRKG对于内核Rootkit的防御有较好的效果。
AKO
AKO是HITACHI研究者在2017年Linux Security Summit上公开的内核入侵检测防御技术(参考文末链接 2017 Proposal of a method to prevent privilege escalation attacks for Linux kernel)。
其主要原理是监控系统调用前后caller进程的credential权限数据,排除合法提权(setuid/setgid等)后,判断是否发生了非法提权/攻击。
原理和性能影响如下图,测试效果和2020年论文(Additional kernel observer: privilege escalation attack prevention mechanism focusing on system call privilege changes)显示对此类系统调用提权攻击有较好的检测效果。
五、总结&展望
本文回顾2010~2022年开源内核安全技术的发展和演进过程,包括早期内核社区对待安全的态度及转变、KSPP项目的背景方案及进展,Android(Google)在内核安全领域的技术和贡献、及其他开源社区HIDS方案等。希望能帮助读者对Linux内核安全技术的发展有一个整体的认识。
受限于篇幅,很多技术细节和专题(如ARM64硬件安全特性、编译器安全特性、CFI技术方案对比、HIDS方案细节等)无法深入分析,这些内容计划在后续《Linux内核安全技术》系列文章中再展开分享。(超级期待,呜呜呜前辈快快更新!!!)
六、参考资料
(好牛,大佬们读了好多论文)
2010.08 Linux Security in 10 Years, https://grsecurity.net/spender_summit.pdf
2010.10 Kernel vulnerabilities: old or new? https://lwn.net/Articles/410606/
2010.11 Kernel Summit:security https://lwn.net/Articles/413102/
2010.11 Security is more than bug fixing https://outflux.net/blog/archives/2010/11/07/security-is-more-than-bug-fixing/
2012.06 PaX,20 years of PaX https://pax.grsecurity.net/docs/PaXTeam-SSTIC12-keynote-20-years-of-PaX.pdf
2012.10 PaX,12 years of securing Linux https://pax.grsecurity.net/docs/PaXTeam-LATINOWARE12-PaX-linux-security.pdf
2012.10 PaX,kernel self protection https://pax.grsecurity.net/docs/PaXTeam-H2HC12-PaX-kernel-self-protection.pdf
2013.10 PaX,GCC plugin https://pax.grsecurity.net/docs/PaXTeam-H2HC13-PaX-gcc-plugins.pdf
2014.08 SELinux on Android https://lwn.net/Articles/609511/
2015.08 James Morris,Ksummit-discuss,Kernel Hardening https://lists.linuxfoundation.org/pipermail/ksummit-discuss/2015-August/002292.html
2015.10 PaX,RAP: RIP ROP https://pax.grsecurity.net/docs/PaXTeam-H2HC15-RAP-RIP-ROP.pdf
2015.10 Improving Kernel Security https://outflux.net/slides/2015/ks/security.pdf
2015.10 Kernel security: beyond bug fixing https://lwn.net/Articles/662219/
2015.11 Security part 2 https://lwn.net/Articles/662907/
2015.11 net of security: the kernel of the argument
https://www.washingtonpost.com/sf/business/2015/11/05/net-of-insecurity-the-kernel-of-the-argument/
https://cacm.acm.org/news/193869-net-of-insecurity-the-kernel-of-the-argument/fulltext
- A new Mindcraft moment https://lwn.net/Articles/663474/
2015.11 KSPP Start https://lwn.net/Articles/663361/
2016.08 KSPP status https://outflux.net/slides/2017/lss/kspp.pdf
2016.08 Android: Protecting the kernel https://linuxsecuritysummit2016.sched.com/event/7bUB/android-protecting-the-kernel-jeffrey-vander-stoep-google
2017.05 Grsecurity goes private https://lwn.net/Articles/721848/
2017.04 grsecurity,Passing the Baton https://grsecurity.net/passing_the_baton
2017.09 KSPP status https://outflux.net/slides/2017/lss/kspp.pdf
2017.09 Proposal of a method to prevent privilege escalation attacks for Linux kernel
https://lss2017.sched.com/event/BKOo/proposal-of-a-method-to-prevent-privilege-escalation-attacks-for-linux-kernel-yuichi-nakamura-hitachiltd-toshihiro-yamauchi-okayama-university
2018.03 LKRG, A “runtime guard” for the kernel https://lwn.net/Articles/749707/
2018.08 KSPP status https://outflux.net/slides/2018/lss/kspp.pdf
2018.08 Year in Review: Android Kernel Security https://lssna18.sched.com/event/FLYB/year-in-review-android-kernel-security-jeff-vander-stoep-sami-tolvanen-google?iframe=no
2018.08 Making C Less Dangerous https://lssna18.sched.com/event/FLY9/making-c-less-dangerous-kees-cook-google
2019.08 KSPP status https://outflux.net/slides/2019/lss/kspp.pdf
2019.08 Writing Linux Kernel Modules in Safe Rust https://lssna19.sched.com/event/RHaT/writing-linux-kernel-modules-in-safe-rust-geoffrey-thomas-two-sigma-investments-alex-gaynor-alloy
2020.03 Effectiveness of Linux Rootkit Detection Tools http://jultika.oulu.fi/files/nbnfioulu-202004201485.pdf
2020.06 Additional kernel observer: privilege escalation attack prevention mechanism focusing on system call privilege changes
https://www.researchgate.net/publication/342450105_Additional_kernel_observer_privilege_escalation_attack_prevention_mechanism_focusing_on_system_call_privilege_changes
2020.07 10 Years of Linux Security https://lssna2020.sched.com/event/c743/10-years-of-linux-security-a-report-card-bradley-spengler-open-source-security-inc
2021.09 KSPP status https://outflux.net/slides/2021/lss/kspp.pdf
2021.09 Compiler Features for Kernel Security https://lpc.events/event/11/contributions/1026/
Ubuntu Kernel Hardening https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#Upstream%20Hardening
GRSecurity:https://grsecurity.net/
PaX: https://pax.grsecurity.net/
LRKG: https://lkrg.org/
Security things in Linux v4.x/v5.x https://outflux.net/blog/archives/category/security/