Windows 下 curl 特权提升漏洞分析
漏洞概述
在 Windows 特权进程中使用 CURLOPT_COOKIEJAR、CURLOPT_HSTS 或 CURLOPT_ALTSVC 选项时,可能存在特权提升(EoP)漏洞。该漏洞源于 Windows 和 Linux 在 unlink 函数实现上的差异,以及 MoveFileEx 函数对特殊构造链接的处理方式。
由于许多组件(如程序更新器)经常以提升的权限使用 curl,此问题必须被视为严重安全威胁。
受影响版本
libcurl 最新版本(8.11.1)
技术细节
libcurl 提供了 easy options,如 CURLOPT_COOKIEJAR、CURLOPT_HSTS 和 CURLOPT_ALTSVC。例如,当设置 CURLOPT_COOKIEJAR 时,库用户可以指定存储 cookie 信息的文件。
由于 libcurl 广泛用于网络通信,它经常在需要与 Web 服务器通信的特权程序(如程序更新器)中使用。
问题是使用上述选项的特权程序可能会出现特权提升(EoP)漏洞。由于所有三个选项共享非常相似的代码结构,以下解释将重点讨论 CURLOPT_COOKIEJAR。
在 lib/cookie.c 的 cookie_output 函数中,通过 Curl_fopen 获取输出文件的 FILE 指针。Curl_fopen 函数基于库用户通过 CURLOPT_COOKIEJAR 指定的文件路径生成随机临时文件,并返回指向此临时文件的 FILE 指针。
随后,cookie_output 将 cookie 内容写入临时文件,然后使用 Curl_rename 将临时文件移动到用户指定的文件路径。在内部,Curl_rename 调用 MoveFileExA API,如果此尝试失败,则尝试使用 unlink 函数删除临时文件。
如果存储 cookie 的文件路径位于用户可写位置,Windows 中的特殊构造链接可用于将 MoveFileExA 或 unlink 的调用重定向到任意文件。MoveFileExA 函数会直接跟随此特殊链接,而通过 Windows C 运行时执行的 unlink 函数(unlink() -> remove() -> DeleteFile(WINAPI))也会跟随该链接。
通过此机制,攻击者可以利用特权进程实现任意文件删除,最终使用已知的利用技术将权限提升(EoP)至 SYSTEM。
乍看之下,利用此问题似乎需要竞争条件。然而,使用 oplocks 可以以高度可靠的方式实现利用。
复现步骤
为复现上述问题,我创建了一个简单程序(curl_EoP.sln),使用 libcurl 和 CURLOPT_COOKIEJAR 选项发送 Web 请求。
此外,curl_EoP_Exp.sln 演示了如何利用此程序实现高权限任意文件删除。此漏洞利用将删除 “C:/ProgramData/curl_EoP/{临时文件名}.tmp” 的操作改为删除 “C:/Windows/test_file.txt”。
具体复现步骤:
-
打开管理员 CMD,运行以下命令创建 test_file.txt:
1echo "tempfile" > C:/Windows/test_file.txt -
使用 Visual Studio C/C++ 2022 构建 curl_EoP_Exp.sln 和 curl_EoP.sln(x64-Release)。 注意:curl_EoP.sln 需要 libcurl。
-
以普通用户权限运行 curl_EoP_Exp.exe。 忽略任何 stdout 输出。
-
以管理员或 SYSTEM 权限运行 curl_EoP.exe。
利用成功后,C:/Windows/test_file.txt 将被删除。
修复建议
可以使用 GetFinalPathNameByHandle API 检索特定文件句柄的最终目标文件路径。通过将此检索到的路径与预期文件名进行比较,可以确定路径是否通过链接被操纵。
在 MoveFileExA 和 unlink 等函数周围实现一个安全包装器,包含此逻辑以防止利用。
影响总结
中等权限攻击者可以通过针对任何使用 CURLOPT_COOKIEJAR、CURLOPT_HSTS 或 CURLOPT_ALTSVC 选项且路径用户可写的特权程序,实现特权提升(EoP)至 SYSTEM。
后续讨论
curl 开发团队认为,允许其他用户(攻击者)对 curl 保存文件的目录具有写访问权限本身就是一个安全问题。curl 无法完全保护这样做的用户,这在 VULN-DISCLOSURE-POLICY.md 文档的"非安全问题"部分有所提及。
虽然此问题最终未被认定为安全漏洞,但开发团队同意改进所有相关选项的文档,以便 libcurl 用户不会错过重要的安全方面。同时,开发团队对报告者表示了感谢,并将其添加为贡献者。