SUSE 安全团队聚焦 2024/2025 冬季
#spotlight目录
- 1) 引言
- 2) Synce4l 同步以太网守护进程
- 3) Fwupd 2.0 D-Bus 和 Polkit 更改
- 4) Tuned 再探
- 5) Iio-sensor-proxy 再探
- 6) Systemd-sysupdated D-Bus 服务
- 7) AppArmor aa-notify Polkit 策略
- 8) 结论
- 9) 参考资料
1) 引言
冬季即将来临(至少在 SUSE 安全团队成员大部分所在的北半球),借此机会,我们想回顾一下过去三个月团队所做的工作。我们已经发布了一些关于让我们在冬季忙碌的重大主题的博文
- SSSD 中的权限分离问题
- pam-u2f 中的问题返回值
- dde-api-proxy 中的身份验证绕过
- pam_pkcs11 中的身份验证绕过
- kio-admin 被吸收到 openSUSE
- Below 中有问题日志目录权限
- nvidia-modprobe 中的文件存在性测试
一如既往的聚焦系列报道,在本篇博文中,我们希望深入介绍我们团队的一些工作,这些工作没有导致重大的安全发现,但仍然让我们忙碌,并在某些情况下也推动了上游改进。这些主题大多仍然涉及 Polkit 身份验证和 D-Bus API,但我们也主动审查了一个引起我们兴趣的网络软件。
2) Synce4l 同步以太网守护进程
我们的团队正在监控 openSUSE Tumbleweed 的更改和新增项,特别是软件包中新出现的 systemd 服务。`synce4l` 软件包引起了我们的兴趣,因为它包含一个以完整的 root 权限运行的网络守护进程。该软件包实现了同步以太网,这是一种低级协议,基本上可以在以太网子网中的多个主机之间维护一个共享时钟。
该项目是用 C 编程语言实现的,包含约 7000 行代码。C 程序对内存处理问题的敏感性,`synce4l` 守护进程以 root 身份运行的事实,以及同步以太网的细分主题,共同使其成为一个有趣的 कोड审查目标。
我们在 1 月初审查了源代码,幸运的是没有发现任何问题。网络攻击面相当小。尽管默认情况下协议参与者之间没有建立信任,但节点之间只交换一个整数值。此值的损坏不会对运行 synce4l 的系统产生负面影响(当然,协议本身除外)。该守护进程还在 /tmp 中创建一个 UNIX 域套接字,但其访问权限仅限于 root。该项目采用了良好的编码风格,审查完成后我们没有留下任何顾虑。
3) Fwupd 2.0 D-Bus 和 Polkit 更改
1 月份,openSUSE 的 fwupd 维护者打包了 2.0 主要版本更新,这要求我们的团队进行后续审计。`fwupd` 是大多数 Linux 发行版的组成部分,提供了在系统上自动升级固件的机制。`fwupd` 守护进程以 root 身份运行,并实现了一个带有 Polkit 身份验证的 D-Bus 接口。我们已经多次审查过当这些接口发生更改时。
尽管 fwupd 本次获得了主要版本更新,但该软件的 D-Bus 和 Polkit 部分的更改幅度不大。总的来说,`fwupd` 中的 D-Bus 接口实现相对复杂。Polkit 身份验证已正确实现,但仅应用于守护进程提供的 D-Bus 方法的一个子集。这意味着必须仔细区分需要 Polkit 身份验证的方法和根本不需要任何身份验证的方法。这就是我们在审查中所做的;幸运的是,我们没有发现任何未经身份验证的方法的问题。
在此 fwupd 版本中增加的一项值得注意的功能是,允许它运行自己的专用 D-Bus 实例,这可能是为了精简环境或用于早期引导场景,因为那时没有系统 D-Bus 可用。当使用此功能时,将不会执行 Polkit 身份验证,可能是因为在这种情况下也没有 Polkit 守护进程。此模式仅在将环境变量 FWUPD_DBUS_SOCKET 传递给守护进程时才会激活,但它不应该在 fwupd 的常规安装中被访问到。
有一个新的 Polkit 操作 org.freedesktop.fwupd.emulation-load,允许本地会话中的用户执行,无需身份验证。相应的 D-Bus 方法接受 JSON 数据,可以直接接受,也可以放在压缩存档中传递给守护进程。这用于将“硬件仿真数据”加载到 fwupd 中。这听起来像是一个普通用户拥有的强大权限,因此我们向上游咨询,确认这种宽松的身份验证设置是否确实是必要的。结果是,我们可以将身份验证要求提高到 auth_admin,从而提高了 fwupd 的安全性。
4) Tuned 再探
tuned 最近进行了大量更改,这导致了 11 月份本地 root 漏洞的发现。由于 D-Bus 配置和 Polkit 操作方面的进一步更改,我们在 1 月份又收到了一次审查请求。
从安全性角度来看,这些更改中没有多少值得关注的。一些 Polkit 操作已被重命名,并且 tuned 现在可选地提供了 UPower D-Bus 接口的替代品。我们毫不犹豫地接受了这些更改。
5) Iio-sensor-proxy 再探
iio-sensor-proxy 是另一个我们过去审查过的软件包,但由于其 D-Bus 配置的变化,它在 1 月份再次出现。该软件包为环境光传感器、加速度计或距离传感器等各种硬件传感器提供了一个 D-Bus 接口。在审查过程中,我们发现新添加的 net.hadess.SensorProxy.Compass.ClaimCompass D-Bus 方法未经身份验证,而其他类似的方法则需要 Polkit 身份验证。
我们私下向该项目报告了这个问题。未经身份验证的问题已得到确认,并且上游已修复了该问题。我们没有要求 CVE 或发布专门的报告,因为该问题的潜在影响被认为是低的。这些较小的发现仍然表明了代码审查的有用性,可以在软件交付给 openSUSE 用户之前改进上游代码和配置。
6) Systemd-sysupdated D-Bus 服务
2 月份,我们收到了一项请求,审查一个名为 sysupdated 的实验性 systemd 组件。阅读程序描述时,人们可能会认为 systemd 现在正致力于取代软件包管理器。然而,该守护进程的主要目的是仅保持容器资产和其他映像的最新。
`sysupdated` 带有一个较大的 D-Bus 接口,该接口部分由 Polkit 保护。一些只读属性和方法调用在没有 Polkit 身份验证的情况下可用。Systemd 组件依赖于共享代码来实现 D-Bus 服务和 Polkit 身份验证。与上次我们查看这些共享例程相比,感觉在这方面复杂度大大增加了。您可以查看此 Bugzilla 评论,以了解当今所涉及的复杂性。复杂度增加的一个原因可能是添加了 Varlink IPC 机制,该机制也可以使用 Polkit 进行身份验证。
尽管 D-Bus 和 Polkit 处理方面存在感知上的复杂性,但我们未能发现实现中的任何问题。在 Polkit 操作 org.freedesktop.sysupdate1.update 上有一个决定要做。默认情况下,其身份验证要求设置为 auth_admin:auth_admin:yes,这意味着本地会话中的用户可以在无需身份验证的情况下更新 sysupdated 管理的资产。这在上游 Polkit 策略中也有记录。这只允许更新到最新版本,而不是任何特定版本,也不允许降级版本。它也不允许安装任何新资产。出于这个原因,我们在Polkit 简单配置文件中允许未经身份验证的更新,而其他配置文件则已加强以要求管理员身份验证。
7) AppArmor aa-notify Polkit 策略
2 月份,收到了一项请求,用于将附加到 AppArmor 软件包的 aa-notify 助手使用的 Polkit 操作列入白名单。此实用程序是一个图形程序,类似于 SELinux 的 setroubleshoot,允许识别 AppArmor 违规并修改 AppArmor 配置文件以允许已被拒绝的操作。
需要审查的两个 Polkit 操作允许通过 pkexec 使用特定的命令行参数执行位于
/usr/lib/python3.11/site-packages/apparmor/update_profile.py 的 Python 脚本。该脚本根据提供的输入文件执行修改 AppArmor 配置文件的任务。由于脚本的性质,在没有管理员身份验证的情况下无法安全地执行它。这反映在 Polkit 操作设置中,这些设置始终需要 auth_admin 授权。
脚本的实现方式有些特别,有些部分似乎也不完整。此处最重要的检查方面是,脚本不得以危险的方式操作文件系统,例如使用不安全的文件或写入由非特权用户控制的位置。我们在审查时没有发现此类问题。
由于该脚本只能使用管理员凭证调用,并且没有合法的使用场景可以降低此身份验证要求,因此我们没有在此深入研究,并接受了新的 Polkit 策略。但是,我们想密切关注此脚本,因为它有可能被更改为可能损害本地系统安全的方式。
8) 结论
再次,我们希望通过这篇博文,我们能够让您更深入地了解我们在 openSUSE 和 SUSE 产品日常审查工作。如果您对本文讨论的内容有任何疑问,请随时与我们联系。预计我们将在大约三个月后发布聚焦系列的春季刊。