TL博士。 在本文中,我们将探讨在五个流行的 Linux 发行版上开箱即用的强化方案。 对于每个,我们采用默认的内核配置,加载所有包,并分析附加二进制文件中的安全方案。 考虑的发行版是 OpenSUSE 12.4、Debian 9、CentOS、RHEL 6.10 和 7,以及 Ubuntu 14.04、12.04 和 18.04 LTS。
结果证实,即使是堆栈金丝雀和位置无关代码等基本方案也尚未被所有人采用。 对于编译器来说,在防止堆栈冲突等漏洞方面,情况更糟,该漏洞在 XNUMX 月份发布后成为人们关注的焦点
审查显示,Ubuntu 18.04 在操作系统和应用程序级别实现的保护方法数量最多,其次是 Debian 9。另一方面,OpenSUSE 12.4、CentOS 7 和 RHEL 7 也实现了基本的保护方案,以及堆栈碰撞保护通过更密集的默认包集使用得更广泛。
介绍
很难保证软件的高质量。 尽管有大量用于静态代码分析和动态运行时分析的先进工具,并且编译器和编程语言的开发取得了重大进展,但现代软件仍然存在不断被攻击者利用的漏洞。 在包含遗留代码的生态系统中,情况甚至更糟。 在这种情况下,我们不仅面临着寻找可能的可利用错误的永恒问题,而且还受到严格的向后兼容性框架的限制,这通常要求我们保留有限的,甚至更糟糕的易受攻击或有错误的代码。
这就是保护或强化程序的方法发挥作用的地方。 我们无法阻止某些类型的错误,但我们可以让攻击者的日子变得更加困难,并通过阻止或预防来部分解决问题 操作 这些错误。 所有现代操作系统都使用这种保护,但这些方法在复杂性、效率和性能方面差异很大:来自堆栈金丝雀和
CVE 和安全性
我们都看过标题为“年度最脆弱的应用程序”或“最脆弱的操作系统”的文章。 通常他们提供有关漏洞的记录总数的统计数据,例如
例如,考虑过去四年来 Linux 内核和五个最流行的服务器发行版(即 Ubuntu、Debian、Red Hat Enterprise Linux 和 OpenSUSE)的 CVE 总数。
图。 1
这张图告诉我们什么? CVE 数量较多是否意味着一种发行版比另一种发行版更容易受到攻击? 没有答案。 例如,在本文中,您将看到 Debian 比 OpenSUSE 或 RedHat Linux 等具有更强的安全机制,而且 Debian 拥有更多的 CVE。 然而,它们并不一定意味着安全性减弱:即使存在 CVE 也并不表明漏洞是否存在 被剥削。 严重性分数表明了如何 大概 漏洞的利用,但最终的可利用性在很大程度上取决于受影响系统中的保护以及攻击者的资源和能力。 此外,缺乏 CVE 报告并不能说明其他问题 未注册或未知 漏洞。 CVE 的差异可能是由于软件质量以外的因素造成的,包括分配给测试的资源或用户群的规模。 在我们的示例中,Debian 的 CVE 数量较多可能只是表明 Debian 发布了更多的软件包。
当然,CVE 系统提供了有用的信息,允许您创建适当的保护。 我们越了解程序失败的原因,就越容易识别可能的利用方法并开发适当的机制 检测和响应。 在图中。 图 2 显示了过去四年中所有发行版的漏洞类别(
图。 2
任务
在本文中,我们打算回答以下问题:
- 不同Linux发行版的安全性如何? 内核和用户空间应用程序存在哪些保护机制?
- 随着时间的推移,各个发行版的安全机制的采用发生了怎样的变化?
- 每个发行版的包和库的平均依赖性是多少?
- 每个二进制文件实施了哪些保护?
分布的选择
事实证明,很难找到有关发行版安装的准确统计数据,因为在大多数情况下,下载数量并不表示实际安装数量。 然而,Unix 变体构成了大多数服务器系统(在 Web 服务器上占 69,2%,按
发行版/版本
核心
建造
OpenSUSE 12.4
4.12.14-95.3-默认
#1 SMP 5 年 06 月 00 日星期三 48:2018:63 UTC 8 (29aXNUMXdXNUMX)
Debian 9(延伸)
4.9.0-8-amd64
#1 SMP Debian 4.9.130-2 (2018-10-27)
CentOS 6.10的
2.6.32-754.10.1.el6.x86_64
#1 SMP 15 年 17 月 07 日星期二 28:2019:XNUMX UTC
CentOS 7的
3.10.0-957.5.1.el7.x86_64
#1 SMP 1 年 14 月 54 日星期五 57:2019:XNUMX UTC XNUMX
红帽企业 Linux 服务器 6.10(圣地亚哥)
2.6.32-754.9.1.el6.x86_64
#1 SMP 21 年 15 月 08 日星期三 21:2018:XNUMX 美国东部时间
红帽企业 Linux 服务器 7.6(麦坡)
3.10.0-957.1.3.el7.x86_64
#1 SMP 15 年 17 月 36 日星期四 42:2018:XNUMX UTC
Ubuntu 14.04(值得信赖的塔尔)
4.4.0–140-通用
#166~14.04.1-Ubuntu SMP 17 月 01 日星期六 52:43:20 UTC XNUMX…
Ubuntu 16.04(Xenial Xerus)
4.15.0–1026-gcp
#27~16.04.1-Ubuntu SMP 7 年 09 月 59 日星期五 47:2018:XNUMX UTC
Ubuntu 18.04(仿生海狸)
4.15.0–1026-gcp
#27-Ubuntu SMP 6 年 18 月 27 日星期四 01:2018:XNUMX UTC
表1
分析
让我们研究默认的内核配置,以及通过每个发行版的包管理器可用的包的属性。 因此,我们只考虑每个发行版默认镜像中的软件包,忽略来自不稳定存储库的软件包(例如 Debian“测试”镜像)和第三方软件包(例如来自标准镜像的 Nvidia 软件包)。 此外,我们不考虑自定义内核编译或安全强化配置。
内核配置分析
我们应用了基于的分析脚本
一般来说,新内核具有更严格的开箱即用设置。 例如,6.10 内核上的 CentOS 6.10 和 RHEL 2.6.32 缺乏较新内核中实现的大部分关键功能,例如
解释结果时要考虑的另一点是:一些增加攻击面的内核配置也可用于安全性。 此类示例包括 uprobes 和 kprobes、内核模块以及 BPF/eBPF。 我们的建议是使用上述机制来提供真正的保护,因为它们使用起来并不简单,并且它们的利用假设恶意行为者已经在系统中建立了立足点。 但如果启用这些选项,系统管理员必须主动监控滥用情况。
进一步查看表 2 中的条目,我们发现现代内核提供了多种选项来防止利用漏洞,例如信息泄漏和堆栈/堆溢出。 然而,我们注意到,即使是最近流行的发行版也尚未实现更复杂的保护(例如,使用补丁
应用分析
毫不奇怪,不同的发行版具有不同的包特征、编译选项、库依赖关系等。甚至对于
发行版
我们总共为所有发行版下载了 361 个软件包,仅从默认镜像中提取软件包。 我们忽略了没有 ELF 可执行文件的包,例如源代码、字体等。过滤后,剩下 556 个包,总共包含 129 个二进制文件。 各个发行版中包和文件的分布如图 569 所示。 584.
图。 3
您可能会注意到,发行版越现代,它包含的包和二进制文件就越多,这是合乎逻辑的。 然而,Ubuntu 和 Debian 软件包比 CentOS、SUSE 和 RHEL 包含更多的二进制文件(包括可执行文件和动态模块和库),这可能会影响 Ubuntu 和 Debian 的攻击面(应该注意的是,这些数字反映了所有版本的所有二进制文件)包,即某些文件被分析多次)。 当您考虑包之间的依赖关系时,这一点尤其重要。 因此,单个包二进制文件中的漏洞可能会影响生态系统的许多部分,就像易受攻击的库可能会影响导入它的所有二进制文件一样。 首先,让我们看看不同操作系统中包之间的依赖关系数量分布:
在几乎所有发行版中,60% 的包至少有 10 个依赖项。 此外,某些包的依赖项数量明显较多(超过 100 个)。 这同样适用于反向包依赖性:正如预期的那样,发行版中的许多其他包使用了一些包,因此这些选定的少数包中的漏洞风险很高。 例如,下表列出了 SLES、Centos 20、Debian 7 和 Ubuntu 9 中反向依赖数量最多的 18.04 个软件包(每个单元格表示软件包和反向依赖数量)。
表3
有趣的事实。 尽管分析的所有操作系统都是针对 x86_64 架构构建的,并且大多数软件包都将架构定义为 x86_64 和 x86,但软件包通常包含其他架构的二进制文件,如图 5 所示。 XNUMX.
图。 5
在下一节中,我们将深入研究所分析的二进制文件的特征。
二进制文件保护统计
至少,您需要为现有的二进制文件探索一组基本的安全选项。 一些 Linux 发行版附带了执行此类检查的脚本。 例如Debian/Ubuntu就有这样的脚本。 这是他的工作示例:
$ hardening-check $(which docker)
/usr/bin/docker:
Position Independent Executable: yes
Stack protected: yes
Fortify Source functions: no, only unprotected functions found!
Read-only relocations: yes
Immediate binding: yes
该脚本检查五个
- 位置无关可执行文件 (PIE):指示如果在内核中启用 ASLR,是否可以在内存中移动程序的文本部分以实现随机化。
- 堆栈保护:是否启用堆栈金丝雀以防止堆栈冲突攻击。
- Fortify Source:不安全函数(例如,strcpy)是否替换为更安全的对应函数,运行时检查的调用是否替换为其未检查的对应函数(例如,memcpy 而不是 __memcpy_chk)。
- 只读重定位 (RELRO):如果在执行开始之前触发重定位表条目,是否将其标记为只读。
- 立即绑定:运行时链接器是否允许在程序执行开始之前进行所有移动(这相当于完整的 RELRO)。
上述机制是否足够? 很不幸的是,不行。 有一些已知的方法可以绕过上述所有防御,但防御越严格,攻击者的门槛就越高。 例如,
我们想要研究相关发行版中有多少二进制文件受到这些方法和其他三种方法的保护:
- 不可执行位(
NX ) 阻止在任何不应执行的区域执行,例如堆栈堆等。 R路径/运行路径 表示动态加载器用来查找匹配库的执行路径。 第一个是 义务 对于任何现代系统:它的缺失允许攻击者任意将有效负载写入内存并按原样执行。 对于第二个,不正确的执行路径配置有助于引入不可靠的代码,从而导致许多问题(例如特权升级 和其他问题 ).- 堆栈冲突保护可防止导致堆栈与其他内存区域(例如堆)重叠的攻击。 鉴于最近的滥用行为
systemd 堆冲突漏洞 ,我们认为将该机制包含在我们的数据集中是合适的。
因此,事不宜迟,让我们开始讨论数字。 表 4 和表 5 分别包含对各种发行版的可执行文件和库的分析摘要。
- 如您所见,除了极少数例外,NX 保护随处可见。 特别是,与 CentOS、RHEL 和 OpenSUSE 相比,它在 Ubuntu 和 Debian 发行版中的使用率略低。
- 堆栈金丝雀在许多地方都缺失,特别是在具有较旧内核的发行版中。 Centos、RHEL、Debian 和 Ubuntu 的最新发行版中已经看到了一些进展。
- 除了 Debian 和 Ubuntu 18.04 之外,大多数发行版对 PIE 的支持都很差。
- OpenSUSE、Centos 7 和 RHEL 7 中的堆栈冲突保护很弱,而在其他操作系统中几乎不存在。
- 所有具有现代内核的发行版都对 RELRO 提供一定的支持,其中 Ubuntu 18.04 领先,Debian 紧随其后。
如前所述,此表中的指标是二进制文件所有版本的平均值。 如果您只查看文件的最新版本,数字将会不同(例如,请参阅
表 4. 图 3 所示可执行文件的安全特性XNUMX(相关功能的实现占可执行文件总数的百分比)
表 5. 图 3 所示库的安全特性XNUMX(相关功能实现量占库总数的百分比)
那么有进展吗? 肯定有:这可以从各个分布的统计数据中看出(例如,
不幸的是,不同发行版中的许多可执行文件仍然没有任何上述保护。 例如,查看 Ubuntu 18.04,您会注意到 ngetty 二进制文件(getty 的替代品)、mksh 和 lksh shell、picolisp 解释器、nvidia-cuda-toolkit 软件包(GPU 加速应用程序的流行软件包)例如机器学习框架)和 klibc -utils。 同样,mandos-client 二进制文件(一种管理工具,允许您自动重新启动具有加密文件系统的计算机)以及 rsh-redone-client(rsh 和 rlogin 的重新实现)在发布时没有 NX 保护,尽管它们具有 SUID 权限: (此外,一些 suid 二进制文件缺乏基本的保护,例如堆栈金丝雀(例如,Xorg 包中的 Xorg.wrap 二进制文件)。
总结和结束语
在本文中,我们重点介绍了现代 Linux 发行版的几个安全功能。 分析表明,平均而言,最新的 Ubuntu LTS 发行版 (18.04) 在具有相对较新内核的发行版(例如 Ubuntu 14.04、12.04 和 Debian 9)中实现了最强的操作系统和应用程序级别保护。然而,所检查的发行版 CentOS、RHEL 和默认情况下,我们的集合中的 OpenSUSE 会生成一组更密集的软件包,并且在最新版本(CentOS 和 RHEL)中,与基于 Debian 的竞争对手(Debian 和 Ubuntu)相比,它们具有更高百分比的堆栈冲突保护。 比较 CentOS 和 RedHat 版本,我们注意到从版本 6 到版本 7,堆栈金丝雀和 RELRO 的实现有了很大改进,但平均而言,CentOS 比 RHEL 实现了更多功能。 一般来说,所有发行版都应特别注意 PIE 保护,除了 Debian 9 和 Ubuntu 18.04 之外,我们数据集中不到 10% 的二进制文件实现了 PIE 保护。
最后,应该指出的是,虽然我们手动进行研究,但有许多可用的安全工具(例如
来源: habr.com