目录

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。

6) 参考资料