由PolicyKit和DirtyPipe漏洞浅谈安全操作系统的意义
1.前言
从去年爆出来的PolKit(CVE-2021-4034)漏洞和今年年初爆出来的DirtyPipe(CVE-2022-0847),能够对Linux操作系统带来十分严重的安全威胁。其中,PolKit漏洞是由于软件层的错误代码编写导致的,而DirtyPipe则是由于高内核版本中对于Pipe管道的错误初始化而导致漏洞的产生。
恶意用户均可以通过这两个漏洞进行提权,从而实现对操作系统的入侵和破坏。
本文从剖析PolKit和DirtyPipe这两个漏洞入手,从操作系统的安全防御视角,阐述安全操作系统中的安全组件或者安全模块如何缓解和阻止漏洞利用产生的负面效果。
2.漏洞简介
2.1 PolKit漏洞
PolKit名称的全称为PolicyKit,是运行在类Unix操作系统上的软件包,主流的Linux操作系统--Ubuntu、Debian、Fedora、CentOS等,都默认装有此软件包。
PolKit漏洞源于PolicyKit包中的pkexec工具,pkexec程序是一个类sudo可执行程序,具有root级的SUID权限,此程序允许普通用户以其他用户的身份执行命令。
由于pkexec基本在所有的Linux系统上都有安装,而且此漏洞存在已久,并且恰巧pkexec具有SUID权限,导致此漏洞对Linux系统的安全产生了很大的威胁。
PolKit漏洞形成的原因为pkexec程序没有对选项为空的情形进行判断,而直接便对argv[1]选项变量进行赋值,导致越界对环境变量进行了赋值,从而利用构建不安全的环境变量实现对漏洞的提权。如下图1所示:
图1 pkexec漏洞利用流程
在pkexec中构造出不安全的环境变量后,在程序清除掉环境变量前,需要尽快对其进行利用,所以目前很多POC代码都选择构建使用GCONV_PATH环境变量,此变量由iconv_open调用,允许指定使用第三方动态库,而恰巧在环境变量被清除前,pkexec程便调用了iconv_open函数,恶意代码库中的恶意代码便被触发执行。
2.2 DirtyPipe漏洞
DirtyPipe漏洞是于今年3月初公开披露的内核级漏洞,对操作系统会产生极大的安全威胁。其影响范围为高于5.8的内核版本,由于5.16.11、5.15.25、以及5.10.102的内核版本都进行了修复,所以相应内核版本只要高于以上三个内核版本就没有影响。
顾名思义,DirtyPipe漏洞意指这次漏洞是由于pipe管道引起的,这次漏洞是由其发现者无意在使用splice系统调用接口来处理管道数据时发现的。splice系统调用用于在两个文件中移动数据,其中一个文件文件需要指定为管道文件,其优势是直接在内核层中进行内存数据移动,可以实现用户层的“零拷贝”,提高数据传输性能,此机制在web中使用较多。
由于新创建的管道缓冲区结构中的“flags”成员变量在内核中的 copy_page_to_iter_pipe函数和push_pipe函数中缺乏正确的初始化,从而导致漏洞的发生。由于PIPE_BUF_FLAG_CAN_MERGE标志设置不正确,而且此标志控制写入管道缓冲区的合并操作,因此允许写入拼接到管道中的现有页面,使得只读文件的数据会被pipe缓冲区中的数据覆盖。非特权本地用户可以使用此漏洞写入到只读文件的页面缓存中的后备页面,一旦数据刷新,后备页面的内容便写入到磁盘上,由此达到提升恶意用户系统权限的目的。
使用此漏洞可以让普通用户对其只有读权限的文件进行写入,由此产生的负面影响不仅仅是可以越权对系统敏感文件进行篡改--比如passwd文件(shadow文件无法篡改,因为普通用户没有shadow文件的读权限),而且可以对具有SUID权限的程序进行篡改,在程序的代码段写入篡改后的恶意代码。但是由于此漏洞属于后备页面缓冲区的覆盖写,所以无法改变代码段的大小。
由此可知,Dirtypipe漏洞主要在以下方面存在安全威胁:
1. 篡改具有只读权限的文件内容;
2. 篡改系统中具有SUID的可执行程序,从而提权。
而且,由于发生漏洞的地方直接从缓冲区后备页面写入数据到块设备层,VFS层上的权限控制机制起不到任何作用,从而使得权限检测失效,像SELinux安全控制模块也无法缓解此种类型的漏洞,所以普通操作系统现有的安全控制机制无法阻止此种漏洞的利用。
3.安全操作系统的防护手段
3.1 安全操作系统概述
大家也许对“安全操作系统”这个字眼很疑惑,“安全操作系统”特指什么样的操作系统?
从操作系统的通用安全需求角度讲,安全操作系统需要通过安全要素和安全模型解决操作系统中主体对客体的安全访问问题,包括用户登录、用户管理、文件和设备访问、资源控制、进程管理、网络通信等。
从安全功能角度讲,安全操作系统指的是在通用操作系统的基础上,加强了身份鉴别、自主访问控制、安全审计等功能,增加了安全标记、强制访问控制、可信路径等安全功能,能对所管理的数据与资源提供适当的保护级、有效地控制硬件与软件功能的操作系统。
从测评角度讲,一个操作系统能够称得上“安全操作系统”,其自身需要满足指定的限定条件,其对安全技术和功能的部署实施需要满足特定的测试标准和依据,需要通过权威机构的测评。所以,依据测评标准来讲,安全操作系统需要满足国际的CC EAL以及我国的操作系统等级保护等安全标准,并经过相应测评。
从操作系统的整体安全体系结构讲,安全操作系统需要满足操作系统的整体性安全需求,从底向上在操作系统的多层级、多维度上构建安全防护功能,同时建立安全和可信边界。操作系统是一种复杂的软件系统,其融合了各种软件功能,从桌面操作系统、服务器操作系统、移动智能操作系统、嵌入式操作系统等分类上即可知其有多复杂,这么复杂的系统单单从单层级或者单维度来构建安全显然无法有效解决安全问题。操作系统的复杂性使得操作系统暴露给攻击者很多的攻击面--比如软件攻击、硬件设备攻击、固件攻击等,为了有效对操作系统进行安全防护,需要在多层次、多维度上构建安全,形成操作系统的整体安全防护体系。
图2 通用操作系统安全体系样例
接下来,从操作系统防御角度,阐述安全操作系统中的安全组件是如何阻止或者缓解PolKit和DirtyPipe两种类型的漏洞利用。
3.2 三权分立用户管理模型
类UNIX操作系统中通常只有两类用户:超级用户和普通用户,超级用户具有管理系统的全部权利。一旦用户被攻破,将可能对系统造成极大的损害。三权分立机制把超级用户的权限按照进行细分为三个管理员用户:系统管理员、安全管理员和审计管理员。其中:
1. 系统管理员负责用户管理、网络管理等系统的日常管理工作;
2. 安全管理员负责与安全配置、管理相关的工作,包括:角色创建与删除、角色权限设置与修改、用户角色设置与修改、文件安全属性的修改以及智能卡的发放与管理等;
3. 审计管理员负责安全审计工作。
图3 三权分立用户模型
在安全操作系统的三权分立用户模型中,三个管理员用户无法相互进行用户身份切换,同时普通用户向管理员用于的身份切换也是被禁止的,如下图所示:
图4 用户切换模型
在安全操作系统上如果使用此种用户切换模型,那么pkexec程序便无法运行,自然也就能够保证恶意用户无法利用PolKit漏洞。
此外,即使PolKit和DirtyPipe漏洞可以被利用,由于超级管理员的权限被细分以及三权管理用户权限的隔离性,使得提权后的权限被缩小,无法获取整个系统的管理权限。
所以,由此可知,三权分立模型对于像Polkit和DirtyPipe类型的漏洞还是具有一定的缓解能力。
3.3 基于角色的访问控制模型
基于角色的访问控制模型RBAC(Role-Based Access Control Model)基本思想是:将访问权限分配给角色,用户通过赋予不同的角色获得角色所拥有的访问权限。用户与特定的一个或多个角色相关联,角色与一个或多个操作相关联。RBAC从控制主体的角度出发,根据管理中相对稳定的职权和责任划分角色,将访问权限与角色相联系,这点是与传统的自主访问控制和强制访问控制将权限直接授予用户的方式不同;用户分配合适的角色,让用户与访问权限相联系,角色成为访问控制中用户和权限之间的一座桥梁,从而实现了用户访问权限的分离,这种方式更便于授权管理、角色划分、职责分离、目标分级和赋予最小权限,更好的保证了系统的安全。
安全操作系统基于RBAC模型将原Linux超级用户(root)的特权分解成3个特权角色,初始安装时,系统将它们缺省组合成三个特权集合(角色),即系统管理员(sysadm_r)、安全管理员(secadm_r)、审计管理员(auditadm_r),并分别赋于了三个不同用户。当然,原则上可以根据需要任意组合其他角色,但必须使每一个角色,仅拥有完成其管理工作所需的最小特权。
RBAC中用户关联角色,角色关联操作进程,进程关联对客体的操作权限,最终实现对用户权限的控制,如图所示:
图5 用户权限继承关系
由图5可知,每个用户下执行的进程会继承用户对应的角色权限,对于利用PolKit和DirtyPipe漏洞提权的恶意用户,其提权后的进程拥有的权限与恶意用户的角色匹配,所以即使提权成功,也无法获取管理员用户权限,从而降低了漏洞利用产生的安全风险。
3.4 安全内核
在本文中讲的安全内核是一个相对概念,因为真正的“安全内核”不仅需要保证其完整性和隔离性,还需要通过形式化验证方法进行验证。其中完整性和隔离性通过可信度量或者签名验签方式以及CPU的特权域即可实现,但是如果要完全经过形式化方法进行验证则是十分困难的,目前仅有SEL4经过了形式化验证。
所以本文指的安全内核指的是只要满足完整性和隔离性要求的系统内核子模块,或者在前两种条件达到的前提下,内核中的部分核心代码通过半形式化或者形式化证明的系统内核。
安全内核包含以下安全功能:
1. 可信度量:负责对操作系统中的客体进行度量;
2. 固件升级:对处理器、板卡等设备的固件进行升级;
3. 安全执行环境:提供基于硬件隔离的安全运行环境,系统中的隐私服务或者核心应用可以运行其中;
4. 内存加密:提供基于硬件级的内存加密手段,保护系统关键数据的机密性和隐私性。
其中,可信度量提供的功能如下图所示:
图6 可信度量功能
可信度量功能负责对系统中的进程、文件、动态库虚拟机、容器和驱动等进行完整性度量,防止这些客体在存储或者运行时被篡改。
对进程运行时进行度量,可以有效阻止DirtyPipe漏洞利用,一旦通过DirtyPiepe漏洞篡改具有SUID的程序,则其完整性必然收到破坏,被篡改的进程运行时便会被可信度量模块侦测并拦截。
对静态的文件进行度量,可以有效阻止DirtyPipe漏洞利用,一旦通过DirtyPipe修改关键文件,便会被可信度量模块侦测并阻止其修改。
对动态库进行度量,可以有效阻止PolKit漏洞利用,一旦恶意程序为pkexec构造了第三方恶意代码库,在pkexec程序运行时,可信度量模块便会检测到第三代码库的加载,通过配置的策略可以阻止恶意代码的执行。
3.5 安全审计功能
安全操作系统的安全审计就是对操作系统中涉及安全事件的活动进行记录、检查、审核或追溯。它的主要目的就是检测非法用户对计算机系统的入侵,显示合法用户的误操作,并能及时发出安全警告以便让管理员对入侵事件进行快速响应。审计作为一种事后追查的手段来保证系统的安全,它对涉及系统安全的操作做一个完整的记录。审计为系统进行事故原因的查询、定位,事故发生前的预测、报警以及事故发生之后的实时处理提供详细、可靠的依据和支持,以备有违反系统安全规则的事件发生后能够有效地追查事件发生的地点和过程以及责任人。
由此可见,安全审计对于操作系统的安全来说扮演着十分重要的角色,尤其是对于漏洞利用的检测和及时响应十分奏效。对于PolKit和DirtyPipe的漏洞利用检测来说,安全审计功能不仅支持对SUID进程的审计,同时支持对setuid、chroot和pivot_root等系统调用的审计,能够检测及追溯恶意用户是否利用漏洞进行提权。同时,结合三权分立以及基于角色的访问控制机制,使得安全审计只有具有审计管理员权限的角色进行访问,阻止恶意用户试图删除审计信息达到隐藏的目的。
4.结语
随着信息化技术的持续发展,安全技术体系架构也在不断迭代和演进,安全操作系统的“安全”不应只是一个“迷彩绚烂”的口号,而是能够为客户提供基础安全服务以及持续增值的实用性体系架构。尤其是在漏洞利用方面,安全操作系统可以充分发挥内生的安全优势,对漏洞利用起到阻止或缓解的作用。
【参考文献】
https://seclists.org/oss-sec/2022/q1/80
https://access.redhat.com/security/vulnerabilities/RHSB-2022-002
https://www.datadoghq.com/blog/dirty-pipe-vulnerability-overview-and-remediation/
《操作系统安全导论》卿斯汉 刘文清 刘海峰 著
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
长扬安全操作系统
长扬安全操作系统V2.0是威斯尼斯人wns2299cn推出的服务端工控安全操作系统产品,通过公安部GB/T 20272-2019第四级安全评测,具有系统安全功能的结构化、复杂度最小化特色,支持并兼容主流工控传输协议、可信计算、国密算法、Docker等,为威斯尼斯人wns2299cn构建的工控安全纵深防御体系打造系统安全底座,实现内生安全,可为客户提供优质的系统级安全服务。
威斯尼斯人wns2299cn信创研究院
威斯尼斯人wns2299cn信创研究院旨在针对工控安全进行行业研究和构建行业信创整体解决方案,依托公司优势的产品体系与行业安全深度解决方案能力,以“安全与密码”为关键技术,通过开展可信计算技术、访问控制技术、虚拟化安全、网络安全、系统安全及数据安全等相关技术研究与产品实现,加强上下游信创合作伙伴协力共同发展,致力于工控安全行业信创产品打造和生态体系构建,为国家工控安全行业信创供应链安全体系建设提供重要价值。