Archives 2024

Agith:openEuler 运维变更观测工具

openEuler2023-11-18eBPF

针对 openEuler 运维变更过程观测困难的问题,华为 2012 服务实验室 OSMind 团队开发了基于 eBPF 的变更观测工具—— Agith。Agith 可以识别与变更相关的行为,并将变更过程表示为一种拓扑结构——变更影响面。通过变更影响面可以完成变更告警、审计、根因定位、依赖分析等功能。

背景

云计算成为信息时代的算力底座,服务千家万户。作为重要的基础实施,稳定压倒一切。但同时云计算也在追求扩大规模以及适配上层业务。因此带来频繁的变更难免会引发故障。

变更任务大致可以分为两类。第一类白屏变更是通过运维工具执行操作,适用于版本变更、资源扩缩容、灾备倒换等流程固定的任务。但是灵活性差,只能执行标准流程。另一类黑屏变更需要运维人员登录系统,通过执行命令来完成变更过程。黑屏变更简单灵活,适合中小型企业的 IT 运维与复杂的运维任务,例如根因分析或故障修复。黑屏变更是变更不确定性的主要来源,也更容易引发故障,需要加强可观测性。

目前对于变更过程的主要观测方法是记录变更过程中运维人员输入的所有命令。在变更结束后,通过审计监察发现潜在的风险。这种方式需要大量的专家经验。因为命令日志很难表示变更过程。例如 2022-09-12 00:00:00.0 张三 obs\_cmd.sh 1818 华东 10.164.179.21,包含时间、人员、主机IP,主机集群(华东)和最重要的命令(obs\_cmd.sh 1818)。但是如果没有专家经验,这条命令是无法解读的。

Agith与变更影响面

Agith 是 Agent Smith 的缩写。这是致敬《黑客帝国》的 Smith 探员。虽然 Smith 探员是电影中的反派角色,但从运维工程师的视角来看,探员是 Matrix 系统中最优秀的运维工程师。Matrix 系统每时每刻有数十亿的流量接入,但是探员却可以感知轻微的变更异常,并通过最近的节点登入以处理故障(Kill Neo)。这种观测能力正是 Agith 的设计目标。系统每时每刻都在处理大量的请求,包括正常的上层服务与变更任务。Agith 需要从中区分出变更任务,将变更的行为记录下来,整理为变更影响面拓扑图。

Agith 是一款面向变更过程的观测工具。相比只记录命令名,Agith 更关注命令的行为。这种区别体现在最终输出上。传统方法输出的是运维人员的所有输入,组织为日志数据。而 Agith 的输出的是变更影响面,如下图所示:

图1 变更影响面示例

橙色节点表示进程,紫色节点表示文件,蓝色节点表示一个远程节点。每种类型节点的都有对应的属性信息展示在右侧列表中。例如进程节点属性信息有进程工作路径、执行命令名、PID 等。文件节点有 inode、文件路径。远程节点有 IP-Port 地址,交互信息等。节点之间的边存储了系统调用类型,例如进程节点与文件节点可调用类型有 read、write、unlink(删除)。

图1的变更中,运维人员登录主机后执行了一条命令 obs_cmd.sh 1818,随即退出。这个操作反应在图中是进程节点P1(bash)创建了进程节点P2(obs_cmd.sh 1818)。进程节点 P2 在执行中又创建了一个 python 脚本(进程节点P3)与一个 shell 脚本(进程进程 P4)。进程节点 P3 创建了一个文件节点 F1。而进程节点 P4 修改了文件 F1,并且通过 curl 命令(进程节点 P5)访问了一个远程节点 N1 的 1818 端口。点击蓝色节点可以看到这次访问的 URL 链接。

相比命令日志,Agith 更关注命令的行为。这种方法将无限的命令映射到有限的行为上,方便运维人员理解。只要有这张变更影响面拓扑图,任何一个运维人员都可以理解此次变更的操作,不需要复杂的专家经验。

Agith 架构

Agith 在设计中采用数据流与控制流分离的策略。eBPF 模块、Consumer、Repository 和 Monitor 可以组成数据筛选-采集-整理-输出的数据流(图 2 中实线)。控制流(图 2 中虚线)则以 Controller 模块为核心,其他模块受 Controller 模块的统一管理。启动时 Controller 模块检测环境,分析配置文件,检查启动参数。然后依次启动部署各个模块。当程序结束时管理各个模块完成清理任务后依次退出。

图2 Agith架构图

eBPF 模块

eBPF 模块包含 eBPF Probes、Traces、Targets 三个部分。这个模块承担数据的筛选工作。筛选方法是一种基于动态目标的变更监控技术。该技术首先建立了两类 map。第一类是 Target map。Target map 保存了监控目标的标识符。例如进程的 pid、文件的 inode、网络的 IP。第二类是Trace map。Trace map 用于存储探针获取的数据。

eBPF Probe 是针对特定的系统调用编写的探针程序。这些程序被触发时,首先根据 Target map 判断系统调用是否与监控目标相关。如果不相关直接返回。如果相关会收集数据写入Trace map。同时 eBPF Probe 会修改 Target map。例如在创建进程的 clone 系统调用处挂载探针程序。当任何程序执行 clone 系统调用,探针会被触发。探针程序检测进程 pid 是否在 Target map 中。如果不存在就返回继续执行 clone。如果存在,会将返回值即子程序的 pid 写入 Trace map,然后将子程序的 pid添加到 Target map 中。这样子程序也被纳入监控范围内了。

Consumer 模块

Consumer 模块承担采集工作,即读取并缓存 Trace map 的数据。这个过程涉及读写速率控制,数据异常处理,数据融合等。

Consumer 读取的数据类似 strace 得到系统调用记录。这些数据采用“主谓宾”的结构体存储。例如 pid:411962, syscall:read, ret: 18, time:974333207983984, ready:1, obj:{fd:3, i\_ino:2505217} 是一条监控 read 系统调用得到的记录。“主语”是 pid:411962,表示一个进程号为 411962 的进程。“谓语”是 syscall:read,表示读取操作。“宾语”是 obj:{fd:3, i\_ino:2505217} 表示是一个文件,文件句柄号是 3,inode 编码是 2505217。除此之外还有这次系统调用的时间和返回值。这条记录的含义是进程 411962 读取了文件 2505217。这条信息非常简陋。进程执行的程序名是什么?读取的文件名是什么?这些信息包含在之前的记录中。例如进程名包含在在 exec 系统调用中,文件名包含在 openat 系统调用中。

Repository & Monitor

Repository 承担整理与输出工作。它存储 Consumer 读取的记录,将信息填充到变更影响面图中。例如打开一个新文件,会创建一个文件节点,并在进程与文件之间连接一条边。除此之外 Repository 负责向 Monitor 模块传递信息。

Monitor 模块负责告警。如果在采集数据的过程中发现高危操作,例如删除重要的配置文件, Monitor 模块会发送告警。Monitor 的数据来源于 Repository。因为只有 Repository 存储的图中才能掌握完整的上下文信息。仅仅依靠 Consumer 的记录不足以判定是否是高危操作。

应用场景

Agith功能是观测变更过程,最终得到的变更影响面可以应用在风险告警、根因定位、变更审计、依赖分析等。

风险告警可以直接使用 Agith。首先在配置文件中声明含有风险的行为,例如修改某个文件,访问某项服务,删除进程等等。Agith 在整理过程中发现这类数据,会向配置文件中的邮箱发送告警信息。例如美联航故障事件中删除文件的行为,Agith 可以发现这种异常操作。目前邮件告警功能在开发中,敬请期待。

根因定位是变更影响面最重要的用途。相比命令日志,变更影响面数据含有更细粒度的行为数据,可以更容易地发现与故障相关的命令行为。

变更审计可以在变更后检查是否有超出预期的行为。对于重要的变更操作,可以在灰度环境中先执行一遍,获取变更影响面。然后在目标环境中执行,得到另一份变更影响面。将两份数据比较,可以发现在变更操作中有没有错误操作。

依赖分析是获取一个服务在运行时依赖的各种本地资源与周边服务。这个功能虽然与变更无关。但是只要在终端中启动这个服务,Agith 就可以获取该服务的所有行为,从而得到所依赖的各种资源,例如动态依赖库,配置文件等。

路线图

当前 Agith 的功能只能覆盖进程、文件、网络的一部分行为。但是黑屏变更过程中命令行为远远超过这部分。

表1 Agith开发计划

表1是未来 Agith 计划覆盖的变更行为。变更行为的整理是一个复杂的过程。我们一开始采用的方案是自底向上。无论什么样的上层服务,从OS的视角来看无非5类行为:进程,内存,文件,网络,外设。只要对这5类行为监控,就可以覆盖所有的命令行为。但是实践并非如此。

首先过度抽象将失去数据的价值。例如执行 mysql、docker、kubernetes 的命令,都是向已有的服务进程发送命令,可以统一为进程交互行为。但是如果只有交互的进程名,根本不能从中判定风险。其次过度抽象意味着所有的底层行为都是需要记录的,会产生巨大的数据冗余。例如一次进程启动,会频繁申请内存,记录这些数据没有意义。

由此我们认识到观测这张网既不能太粗,也不能太细,应当结合运维需求灵活调整。所以我们采用了一种自顶向下的方法。首先收集 239万条变更命令,逐条去分析变更命令,得出这条命令所产生的数据。然后根据数据的相似性合并。例如文件都会有文件名,容器类操作有容器 id 或者镜像 id。合并过程中会舍弃两者差别的数据项。如果这个数据项对于运维价值不大,就是可以舍弃的。如果这个数据对运维很重要,说明这个合并是错误的。在整理的过程中有太多收益与成本的博弈,相信未来还会不断演进。我们最终梳理出需要监控的行为如下图。

图3 运维变更行为

欢迎加入

如果您对 Agith 有任何建议,欢迎在 https://gitee.com/openeuler/Agith/issues 提出,也可以添加小助手微信,加入 eBPF 技术交流微信群。如果有合作意向,可以与笔者联系(shangguandongdong1@huawei.com)。


【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。

xz漏洞从5.6.0版本开始CVE-2024-3094漏洞分析存在于XZ Utils的5.6.0和5.6.1版本中

周鹏程2024-04-07Security

漏洞描述

xz是用于压缩/解压缩文件的一款压缩库,微软的安全研究员Andres Freund调查程序性能下降时发现了该漏洞,xz漏洞从5.6.0版本开始存在恶意后门,该后门存在于XZ Utils的5.6.0和5.6.1版本中,攻击者可能利用这一漏洞在受影响的系统上绕过SSH的认证获得未授权访问权限,执行任意代码。

openEuler的漏洞响应

  • 2024年3月28日,openEuler初步感知到xz 5.6.0/5.6.1版本存在安全风险。立即发起了对openEuler 2203-LTS,2003-LTS各个发行分支,以及测试中的分支2403-LTS进行全量的软件版本排查,最后确认有缺陷的xz 5.6.0/5.6.1版本没有引入openEuler仓库。
  • 2024年3月29日, openwall 披露了xz CVE-2024-3094的攻击代码和攻击手段。openEuler安全团队实时跟进,组织相关技术人员分析openEuler xz的源码是否存在恶意攻击代码,从源码代码层面确认了CVE-2024-3094漏洞不涉及openEuler xz软件。

漏洞背景

Jia Tan 是本次xz后门漏洞的攻击者,为了实现本次的xz软件的后门注入,JiaT75在xz代码和社会工程学上的设计可谓是处心积虑,印证了有句古话:”不怕贼偷,就怕贼惦记”。本文xz事件的关键节点信息梳理引用自:https://research.swtch.com/xz-timeline

Jia Tan成为xz社区maintainer

2021年10月26日 JiaTan第一次向xz开源社区贡献了代码,并开始活跃于xz的社区,在2021年Jia Tan共提交了546次代码,JiaTan提交表现为一名勤奋、高效的开源社区贡献者,并在此之后不断地对xz压缩库做出代码贡献。 2022年4月到6月 xz初始的维护人 Lasse Collin由于长期的心理健康问题以及其他原因,会定期退网一段时间进行调理。在2022年4月到6月之间,Lasse Collin陆续收到了Jigar Kumar,Dennis Ens等用户的施压邮件,邮件的内容大致是:质疑Lasse Collin是不是是去了对xz的维护兴趣?为什么没有及时合入JiaTan的贡献代码?以及让 Lasse Collin给予Jia Tan具有maintainer提交权限的心理暗示。其中部分内容展示如下:

  • Jugar Kumar:“按照你现在的速度,我非常怀疑今年能看到5.4.0版本的发布。自从四月以来唯一的进展就是对测试代码的一些小改动。你忽视了邮件列表中腐败中的许多补丁。现在你在扼杀你的存储库。为什么要等到5.4.0版本才换维护人?为什么要延迟你的存储库所需要的改变?”
  • Dennis Ens:“我对你的心理健康问题感到遗憾,但是认识到自己的限制是非常重要的。我知道对于所有的参与者来说,这只是一个业余项目,但是社区需要更多。为什么不将C语言的XZ的维护权转交给其他人,这样你就可以更多地关注Java的XZ了呢?或者把Java的XZ的维护权转交给其他人,以便你可以专注于C语言的XZ?试图同时维护两者意味着两者都不能被很好地维护。”

2022-06-29 Lasse Collin回复到:“正如我在之前的邮件中暗示的,Jia Tan 可能会在未来在项目中扮演更大的角色。他已经在邮件列表之外大力帮助过我,现在实际上已经是一名共同维护者了。我知道在git存储库中还没有发生太大的事情,但是事情是在慢慢发生的。无论如何,维护权的一些变动已经在进行中,至少对于XZ Utils是这样。“

基于Jia Tan在xz社区的贡献表现,社区用户Jigar Kumar和Dennis Ens等用户的邮件施压,还有Lasse Collin自身的身体健康原因,最终Lasse Collin给予了 Jia Tan在xz社区的 maintainer席位。事后Evan Boehs观察到,Jigar Kumar和Dennis Ens都未在互联网上的其他地方出现过,在Jia Tan成为社区maintainer后,Jigar Kumar和Dennis Ens也未在xz社区中使用邮件来沟通过任何其它问题,看起来它们很可能是为了促使Lasse赋予 Jia Tan 获得更多控制权而创建的伪造身份。这种策略起作用了。

Jia Tan攻击开始

2024-02-23: Jia Tan 将隐藏的后门二进制代码巧妙地隐藏在一些二进制测试输入文件中。README文件(从 Jia Tan 出现之前很久就已经存在)中已经提到,“这个目录包含了许多文件,用于测试解码器实现中对.xz、.lzma ,以及.lz 文件的处理。许多文件是手工使用十六进制编辑器创建的,因此没有比文件本身更好的‘源代码’。” 对于这种压缩软件的库来说,拥有这类被压缩的二进制测试文件是非常常见的。Jia Tan 利用这一点添加了一些不会被仔细审查的文件。 2024-02-24: Jia Tan 标记并构建了v5.6.0版本,并发布了包含额外恶意build-to-host.m4的xz-5.6.0.tar.gz发行版,该m4文件在构建deb/rpm包时添加了后门。这个m4文件在源代码仓库中不存在,但是在打包过程中还添加了许多其他合法的文件,所以它本身并不引起怀疑。但是这个脚本已经从通常的副本中被修改以添加后门。 2024-03-09: Jia Tan 标记并构建了v5.6.1版本,并发布了包含新后门的xz 5.6.1发行版。 2024-03-25: 很多用户在Debian社区中提出建议,要求xz-utils更新到5.6.1。就像在2022年Jia Tan成为xz社区maintainer之前的邮件压力活动中一样,出现了更多在之前互联网上不存在的邮件地址来倡导更新xz 5.6.1版本。 2024-03-28: Jia Tan 在Ubuntu中提出了一个bug,要求从Debian更新xz-utils到5.6.1。

攻击被检测到

2024-03-28: 微软的安全研究员Andres Freund调查程序性能下降时发现了该漏洞,私下通知了Debian和distros@openwall。 随后RedHat 分配了CVE-2024-3094。 2024-03-29 :CVE-2024-3094公开披露,CSSV漏洞评分10分,是一个满分漏洞,是第一起严重的、针对广泛使用的开源软件的供应链攻击。它标志着开源供应链安全的一个分水岭时刻。在此以后开源社区贡献者的真实身份验证以及二进制测试文件的审核可能会变得更为严苛,各大开源社区和操作系统发行商也会受到该事件的推动,进一步完善关于软件安全的运作规则。

漏洞代码触发分析

上游社区5.6.0/5.6.1 release的xz源码tar包包含build-to-host.m4恶意构建文件,该构建文件调用脚本解压恶意测试数据tests/files/bad-3-corrupt_lzma2.xz 、tests/files/good-large_compressed.lzma来修改构建过程以构建出留有后门的动态库liblzma.so。由于SSH底层依赖了liblzma库,攻击者可能利用这一漏洞在受影响的系统上绕过SSH的认证获得未授权访问权限,执行任意代码。更多代码技术细节信息,请参见:xz攻击脚本演练帖子

影响性分析

如果机器上装有涉及CVE-2024-3094缺陷的xz软件,远程攻击者能够通过SSH发送任意代码,造成远端任意代码执行,进而有效控制受害者的整台机器。

规避措施

解决方案

卸载/弃用xz 5.6.0/5.6.1缺陷版本,使用openEuler社区发行的xz稳定版本xz 5.2.5,或者其他社区的稳定版本。

本文参考链接

https://www.openwall.com/lists/oss-security/2024/03/29/4

https://gist.github.com/thesamesam/223949d5a074ebc3dce9ee78baad9e27

https://boehs.org/node/everything-i-know-about-the-xz-backdoor

https://tukaani.org/xz-backdoor/

https://research.swtch.com/xz-timeline

https://research.swtch.com/xz-script


【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。