dnf5daemon-server: CVE-2024-1929 (CVE-2024-2746)修复不完整
#CVE #local #D-Bus目录
1) 引言
我们之前报告的 dnf5 D-Bus 组件的 CVE-2024-1929 修复并不完整。本文将讨论我们发现的剩余问题。
2) 白名单中的不安全配置项“reposdir”
CVE-2024-1929 的问题在于 dnf5 D-Bus 守护进程允许未经授权的用户接受任意配置参数,这使得本地 root 漏洞成为可能,因为可以诱使守护进程加载用户控制的“插件”。这一切发生在 Polkit 身份验证启动之前。
该原始 Bug修复包含一个白名单配置项,允许未经授权的用户在通过 dnf5 D-Bus 接口时覆盖这些配置项。在检查每个白名单项时,我们发现“reposdir”设置允许指定任意目录的路径,该目录下的仓库配置文件(*.repo)将由特权的 dnf5 守护进程处理。
dnf5 库代码并未检查非 root 用户是否控制相关目录。该代码确实会检查其中文件的文件类型和文件名扩展名;它会跟随符号链接,但存在竞争条件。
std::filesystem::directory_iterator di(dir_path, ec);
std::vector<std::filesystem::path> paths;
for (auto & dentry : di) {
auto & path = dentry.path();
if (dentry.is_regular_file() && path.extension() == ".repo") {
paths.push_back(path);
}
}
std::sort(paths.begin(), paths.end());
for (auto & path : paths) {
create_repos_from_file(path);
}
当(经过检查的)路径被传递给 create_repos_from_file() 时,控制该目录的用户可以将其替换为任意其他文件或符号链接,从而诱骗库处理任意类型的文件和文件路径。
一方面,这构成了一个拒绝服务攻击向量,因为守护进程可能会处理一个阻塞文件(例如,命名为 FIFO 的特殊文件)或一个非常大的文件,导致内存不足(例如,/dev/zero)。另一方面,这可以用来让守护进程处理特权文件,如 /etc/shadow。相关文件被解析为 INI 文件。解析特权文件产生的错误诊断可能会导致信息泄露,如果这些诊断可供未经授权的用户访问的话。不过,在 libdnf5 的情况下,不应存在此类用户可访问的诊断。
更有趣的是,本地攻击者可以在此目录中放置一个有效的仓库配置文件。此配置文件允许指定大量额外的配置选项。这使得攻击者可以访问 libdnf5 中的各种额外代码路径。这以及配置任意仓库的可能性,很可能允许进一步的权限提升,尽管我们没有更深入地调查其可能性。
此后续问题证实了我们最初报告中的观点,即在使用不应在混合安全范围设置下运行的 libdnf5 库时,必须极其小心处理不受信任的输入。
3) Bug修复和CVE分配
该Bug修复仅包含从配置项白名单中删除“reposdir”条目。上游版本 5.1.17 包含了此 Bug修复。Red Hat 安全团队分配了 CVE-2024-2746 来跟踪 CVE-2024-1929 的此不完整修复。
4) 发现过程
我们在较晚的时候才注意到这个不完整的修复,当时我们的 openSUSE dnf5 包维护者请求将已修复的包包含在 openSUSE Tumbleweed 中。很遗憾,这发生得太晚,未能阻止 CVE-2024-1929 的不完整修复,因此导致了后续的 CVE 分配和协调发布流程的必要性。
由于最初的问题已通过协调披露流程处理,因此在发布之前应该对拟议的补丁进行审查。由于补丁在协调发布流程之外过早发布的情况,因此从未有过一个明确的时间点让我们实际审查它们。我们力求通过更加谨慎地审查补丁来避免将来的此类情况,尤其是当无法与上游建立直接的协调发布流程时。
5) 时间线
| 2024-03-11 | 我们已将此问题报告给 secalert@redhat.com。 |
| 2024-03-13 | 关于此问题的讨论已移至涉及 dnf5 开发人员的新联系人组。 |
| 2024-03-20 | 一位 dnf5 开发人员确认了该问题,并建议从白名单中删除“reposdir”。 |
| 2024-03-20 | Red Hat 安全部门为后续问题分配了 CVE-2024-2746。 |
| 2024-03-26 | 关于协调发布日期的讨论正在进行,提到了 2024-04-02。 |
| 2024-04-02 | Red Hat 安全部门告知我们,他们实际上考虑的是 2024-04-03。 |
| 2024-04-03 | 上游发布了包含 Bug修复的版本 5.1.17。 |