darkhttpd:时序攻击和 HTTP 基本身份验证凭据的本地泄露
#CVE #remote本报告涉及 darkhttpd 项目中的 HTTP 基本身份验证问题。Darkhttpd 是一个用 C 语言实现的最小化 HTTP Web 服务器,用于提供静态文件。本次审查的版本是 1.14。
已发布包含错误修复和附加警告消息的 1.15 版本错误修复版本。
基本身份验证时序攻击 (CVE-2024-23771)
该问题存在于 darkhttpd.c 的第 2272 行。在此处,客户端提供的 HTTP 基本身份验证字符串与通过 --auth 命令行参数配置的 secret 进行比较。此比较使用常规的 strcmp() 函数调用。
由于 strcmp() 执行的是高效的线性比较,如果提供的身份验证字符串的前几个字节不匹配,它将比匹配时更早终止。这种运行时差异可用于时序攻击,试图找出访问 Web 服务器的正确身份验证凭据。
为解决此问题,需要使用一种恒定时间字符串比较函数,该函数在比较时始终花费相同数量的计算时间,而与提供的字节与实际身份验证 secret 匹配的程度无关。此类函数的一个示例是 openSSL 库提供的 CRYPTO_memcmp() 函数。
Darkhttp 本身不支持 SSL 加密流量。当 darkhttpd 用于 Internet 上的未加密 http:// 时,可以认为身份验证数据无论如何都会在不受信任的通道上以未加密的形式发送。然而,如果 darkhttpd 在使用 SSL 的反向代理之后使用,从而使用安全通道,那么此问题将违反一项重要的安全属性。
错误修复
在与上游作者讨论了可用选项后,他决定实现一个 自定义的恒定时间字符串比较算法来解决该问题。该算法是一种相对简单的、对所有字节范围进行异或运算的操作。
进程列表中的身份验证参数本地泄露 (CVE-2024-23770)
在 darkhttpd 中配置 HTTP 基本身份验证字符串的唯一方法是通过 --auth 命令行参数传递。在 Linux 上,所有本地用户都可以查看系统中其他正在运行的程序的参数。这意味着,如果存在其他用户或运行在不同安全域中的程序,它们就可以获取 Web 服务器的身份验证凭据。
为解决此问题,需要提供一种替代机制来安全地传递身份验证凭据。通常,这可以通过使用环境变量或受保护的配置文件来解决。如果保留现有的 --auth 命令行开关,那么应该记录它在 Linux 系统上泄露身份验证凭据的事实。
错误修复
上游作者决定仅通过在命令行使用输出中添加警告来 记录安全影响。
审查总结
除了这些与 HTTP 基本身份验证相关的问题外,我在 darkhttpd 的代码库中没有发现任何有问题的环节。我专注于日志文件欺骗、通过精心设计的 URL 逃逸 Web 根目录以及内存损坏(例如,通过在 HTTP 头部指定错误的字节范围)的可能性。代码在这些方面是稳健的。
时间线
| 2024-01-12 | 我已将发现报告给上游作者 emikulic@gmail.com,并提出协调披露。 |
| 2024-01-13 | 作者确认了安全问题,但拒绝了正式的禁运期。 |
| 2024-01-15 | 我向 Mitre 申请了两个 CVE 来跟踪在审查期间发现的两个发现。 |
| 2024-01-18 | 在讨论了错误修复之后,作者发布了包含这些更改的新版本 1.15。 |
| 2024-01-25 | Mitre 分配了 CVE。 |