Windows 下 curl 特权提升漏洞分析与利用

本文详细分析了 Windows 平台上 curl 库中 CURLOPT_COOKIEJAR、CURLOPT_HSTS 和 CURLOPT_ALTSVC 选项存在的特权提升漏洞,包括漏洞原理、复现步骤及修复建议。

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”。

具体复现步骤:

  1. 打开管理员 CMD,运行以下命令创建 test_file.txt:

    1
    
    echo "tempfile" > C:/Windows/test_file.txt
    
  2. 使用 Visual Studio C/C++ 2022 构建 curl_EoP_Exp.sln 和 curl_EoP.sln(x64-Release)。 注意:curl_EoP.sln 需要 libcurl。

  3. 以普通用户权限运行 curl_EoP_Exp.exe。 忽略任何 stdout 输出。

  4. 以管理员或 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 用户不会错过重要的安全方面。同时,开发团队对报告者表示了感谢,并将其添加为贡献者。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计