1、前言
从今年爆下来的PolKit(CVE-2021-4034)漏洞和明年年初爆下来的DirtyPipe(CVE-2022-0847),才能对Linux操作系统带来非常严重的安全恐吓。其中,PolKit漏洞是因为软件层的错误代码编撰造成的,而DirtyPipe则是因为高内核版本中对于Pipe管线的错误初始化而造成漏洞的形成。
恶意用亩均可以通过这两个漏洞进行加壳,进而实现对操作系统的入侵和破坏。
本文从分析PolKit和DirtyPipe这两个漏洞入手,从操作系统的安全防御视角,探讨安全操作系统中的安全组件或则安全模块怎么减缓和制止漏洞借助形成的负面疗效。
2、漏洞简介
2.1PolKit漏洞
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所示:
图1pkexec漏洞借助流程
在pkexec中构造出不安全的环境变量后,在程序消除掉环境变量前,须要早日对其进行借助,所以目前好多POC代码都选择建立使用GCONV_PATH环境变量,此变量由iconv_open调用,容许指定使用第三方动态库,而刚好在环境变量被消除前,pkexec程便调用了iconv_open函数,恶意代码库中的恶意代码便被触发执行。
2.2DirtyPipe漏洞
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缓冲区中的数据覆盖。非特权本地用户可以使用此漏洞写入到只读文件的页面缓存中的后备页面,一旦数据刷新,后备页面的内容便写入到c盘上,由此达到提高恶意用户系统权限的目的。
使用此漏洞可以让普通用户对其只有读权限的文件进行写入,由此形成的负面影响不仅仅是可以越权对系统敏感文件进行篡改--诸如passwd文件(shadow文件难以篡改,由于普通用户没有shadow文件的读权限),并且可以对具有SUID权限的程序进行篡改,在程序的代码段写入篡改后的恶意代码。并且因为此漏洞属于后备页面缓冲区的覆盖写,所以未能改变代码段的大小。
由此可知,Dirtypipe漏洞主要在以下方面存在安全恐吓:
1.篡改具有只读权限的文件内容;2.篡改系统中具有SUID的可执行程序,因而加壳。
但是,因为发生漏洞的地方直接从缓冲区后备页面写入数据到块设备层,VFS层上的权限控制机制起不到任何作用,进而促使权限检查失效,像SELinux安全控制模块也未能减缓此种类型的漏洞,所以普通操作系统现有的安全控制机制未能制止此种漏洞的借助。
3、安全操作系统的防护手段
3.1安全操作系统概述
你们似乎对“安全操作系统”这个字眼很困惑,“安全操作系统”特指哪些样的操作系统?
从操作系统的通用安全需求角度讲,安全操作系统须要通过安全要素和安全模型解决操作系统中主体对客体的安全访问问题,包括用户登入、用户管理、文件和设备访问、资源控制、进程管理、网络通讯等。
从安全功能角度讲,安全操作系统指的是在通用操作系统的基础上,强化了身分鉴定、自主访问控制、安全审计等功能,降低了安全标记、强制访问控制、可信路径等安全功能,能对所管理的数据与资源提供适当的保护级、有效地控制硬件与软件功能的操作系统。
从测评角度讲,一个操作系统才能称得上“安全操作系统”,其自身须要满足指定的限定条件,其对安全技术和功能的布署施行须要满足特定的测试标准和根据,须要通过权威机构的测评。所以,根据测评标准来讲,安全操作系统须要满足国际的CCEAL以及我国的操作系统等级保护等安全标准,并经过相应测评。
从操作系统的整体安全体系结构讲,安全操作系统须要满足操作系统的整体性安全需求,从底向下在操作系统的多层级、多维度上建立安全防护功能,同时完善安全和可信边界。操作系统是一种复杂的软件系统,其融合了各类软件功能,从桌面操作系统、服务器操作系统、移动智能操作系统、嵌入式操作系统等分类上即可知其有多复杂linux查看进程,如此复杂的系统单单从单层级或则单维度来建立安全似乎难以有效解决安全问题。操作系统的复杂性促使操作系统曝露给功击者好多的功击面--诸如软件功击、硬件设备功击、固件功击等,为了有效对操作系统进行安全防护,须要在多层次、多维度上建立安全,产生操作系统的整体安全防护体系。
图2通用操作系统安全体系样例
接出来,从操作系统防御角度,探讨安全操作系统中的安全组件是怎样制止或则减轻PolKit和DirtyPipe两种类型的漏洞借助。
3.2四权分立用户管理模型
类UNIX操作系统中一般只有两类用户:超级用户和普通用户,超级用户具有管理系统的全部权力。一旦用户被攻克,将可能对系统引起极大的损害。四权分立机制把超级用户的权限根据进行细分为三个管理员用户:系统管理员、安全管理员和审计管理员。其中:
1.系统管理员负责用户管理、网络管理等系统的日常管理工作;2.安全管理员负责与安全配置、管理相关的工作,包括:角色创建与删掉、角色权限设置与更改、用户角色设置与更改、文件安全属性的更改以及智能卡的领取与管理等;3.审计管理员负责安全审计工作。
图3四权分立用户模型
在安全操作系统的四权分立用户模型中,三个管理员用户难以互相进行用户身分切换,同时普通用户向管理员用于的身分切换也是被严禁的,如右图所示:
图4用户切换模型
在安全操作系统上假如使用此种用户切换模型,这么pkexec程序便难以运行,自然也就才能保证恶意用户难以借助PolKit漏洞。
据悉,虽然PolKit和DirtyPipe漏洞可以被借助,因为超级管理员的权限被细分以及四权管理用户权限的隔离性,致使加壳后的权限被缩小,难以获取整个系统的管理权限。
所以,由此可知,四权分立模型对于像Polkit和DirtyPipe类型的漏洞还是具有一定的减轻能力。
3.3基于角色的访问控制模型
基于角色的访问控制模型RBAC(Role-BasedAccessControlModel)基本思想是:将访问权限分配给角色,用户通过赋于不同的角色获得角色所拥有的访问权限。用户与特定的一个或多个角色相关联,角色与一个或多个操作相关联。RBAC从控制主体的角度出发,按照管理中相对稳定的职权和责任界定角色,将访问权限与角色相联系,这点是与传统的自主访问控制和强制访问控制将权限直接授予用户的方法不同;用户分配合适的角色,让用户与访问权限相联系,角色成为访问控制中用户和权限之间的一座桥梁,进而实现了用户访问权限的分离,这些方法更易于授权管理、角色界定、职责分离、目标分级和赋于最小权限,更好的保证了系统的安全。
安全操作系统基于RBAC模型将原Linux超级用户(root)的特权分解成3个特权角色,初始安装时,系统将它们缺省组合成三个特权集合(角色),即系统管理员(sysadm_r)、安全管理员(secadm_r)、审计管理员(auditadm_r),并分别赋予了三个不同用户。其实,原则上可以按照须要任意组合其他角色,但必须使每一个角色,仅拥有完成其管理工作所需的最小特权。RBAC中用户关联角色,角色关联操作进程,进程关联对客体的操作权限,最终实现对用户权限的控制,如图所示:
图5用户权限承继关系
由图5可知,每位用户下执行的进程会承继用户对应的角色权限,对于借助PolKit和DirtyPipe漏洞加壳的恶意用户,其加壳后的进程拥有的权限与恶意用户的角色匹配,所以虽然加壳成功,也难以获取管理员用户权限linux服务器安全,因而增加了漏洞借助形成的安全风险。
3.4安全内核
在本文中讲的安全内核是一个相对概念linux删除文件夹,由于真正的“安全内核”不仅须要保证其完整性和隔离性,还须要通过方式验血证方式进行验证。其中完整性和隔离性通过可信测度或则签名验签方法以及CPU的特权域即可实现,而且假如要完全经过方式化方式进行验证则是非常困难的linux服务器安全,目前仅有SEL4经过了方式验血证。
所以本文指的安全内核指的是只要满足完整性和隔离性要求的系统内核子模块,或则在前两种条件达到的前提下,内核中的部份核心代码通过半方式化或则方式化证明的系统内核。
安全内核包含以下安全功能:
1.可信测度:负责对操作系统中的客体进行测度;2.固件升级:对处理器、板卡等设备的固件进行升级;3.安全执行环境:提供基于硬件隔离的安全运行环境,系统中的隐私服务或则核心应用可以运行其中;4.显存加密:提供基于硬件级的显存加密手段,保护系统关键数据的绝密性和隐私性。其中,可信测度提供的功能如右图所示:
图6可信测度功能
可信测度功能负责对系统中的进程、文件、动态库虚拟机、容器和驱动等进行完整性测度,避免这种客体在储存或则运行时被篡改。
对进程运行时进行测度,可以有效制止DirtyPipe漏洞借助,一旦通过DirtyPiepe漏洞篡改具有SUID的程序,则其完整性必然收到破坏,被篡改的进程运行时便会被可信测度模块探测并拦截。
对静态的文件进行测度,可以有效制止DirtyPipe漏洞借助,一旦通过DirtyPipe更改关键文件,便会被可信测度模块探测并制止其更改。
对动态库进行测度,可以有效制止PolKit漏洞借助,一旦恶意程序为pkexec构造了第三方恶意代码库,在pkexec程序运行时,可信测度模块便会测量到第三代码库的加载,通过配置的策略可以制止恶意代码的执行。
3.5安全审计功能
安全操作系统的安全审计就是对操作系统中涉及安全风波的活动进行记录、检查、审核或溯源。它的主要目的就是测量非法用户对计算机系统的入侵,显示合法用户的误操作,并能及时发出安全警告便于让管理员对入侵风波进行快速响应。审计作为一种事后追缉的手段来保证系统的安全,它对涉及系统安全的操作做一个完整的记录。审计为系统进行车祸缘由的查询、定位,车祸发生前的预测、报警以及车祸发生过后的实时处理提供详尽、可靠的根据和支持,以备有违背系统安全规则的风波发生后才能有效地追缉风波发生的地点和过程以及责任人。
由此可见,安全审计对于操作系统的安全来说饰演着非常重要的角色,尤其是对于漏洞借助的测量和及时响应非常奏效。对于PolKit和DirtyPipe的漏洞借助检查来说,安全审计功能除了支持对SUID进程的审计,同时支持对setuid、chroot和pivot_root等系统调用的审计,就能测量及溯源恶意用户是否借助漏洞进行加壳。同时,结合四权分立以及基于角色的访问控制机制,致使安全审计只有具有审计管理员权限的角色进行访问,制止恶意用户企图删掉审计信息达到隐藏的目的。
4、结语
随着信息化技术的持续发展,安全技术体系构架也在不断迭代和演变,安全操作系统的“安全”不应只是一个“迷彩璀璨”的标语,而是才能为顾客提供基础安全服务以及持续增值的实用性体系构架。尤其是在漏洞借助方面,安全操作系统可以充分发挥内生的安全优势,对漏洞借助起到阻止或减轻的作用。
参考文献:
1.
2.
3.
4.《操作系统安全概论》卿斯汉刘文清刘海峰著