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

本文详细分析了curl库在Windows系统中因CURLOPT_COOKIEJAR等选项实现缺陷导致的权限提升漏洞,包括漏洞原理、复现步骤及修复建议,涉及临时文件处理和符号链接安全机制。

报告 #2941920 - Windows下easy_options相关权限提升(EoP)漏洞

摘要

在Windows特权进程中使用CURLOPT_COOKIEJAR、CURLOPT_HSTS或CURLOPT_ALTSVC选项时,可能出现权限提升(EoP)漏洞。

该漏洞源于Windows和Linux中unlink函数实现的差异,以及MoveFileEx函数会遵循特殊构造的链接的行为。考虑到许多组件(如程序更新器)经常以提升的权限使用curl,此问题必须被视为严重关切。

受影响版本

libcurl最新版本(8.11.1)

详细描述

libcurl提供了CURLOPT_COOKIEJAR、CURLOPT_HSTS和CURLOPT_ALTSVC等简易选项。例如,当设置CURLOPT_COOKIEJAR时,库用户可以指定一个文件来存储cookie信息。

由于libcurl广泛用于Web通信,它经常被需要与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函数删除临时文件。

(https://github.com/curl/curl/blob/c5bb4e77e414c1505d800a0091a6d57c7f75d416/lib/cookie.c#L1660)

如果存储cookie的文件路径位于用户可写位置,Windows中的特殊构造链接可用于重定向对MoveFileExA或unlink的调用,以操作任意文件。MoveFileExA函数会按原样遵循此特殊链接,而通过Windows C运行时执行的unlink函数(unlink() -> remove() -> DeleteFile(WINAPI))也会遵循该链接。

通过此机制,攻击者可以利用特权进程实现任意文件删除,最终可通过众所周知的利用技术将权限提升(EoP)至SYSTEM。

乍一看,利用此问题似乎需要竞争条件。但是,可以使用oplocks以高度可靠的方式利用它。

有关如何滥用任意文件删除来提升权限的更多详细信息,请参阅下面链接的ZDI博客文章: (https://www.thezdi.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks)

为了更好地理解此问题,将在下一节中提供演示漏洞的概念验证(PoC)以及如何复现的分步说明。

复现步骤

为了复现上述问题,我创建了一个简单程序(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
  1. 使用Visual Studio C/C++ 2022构建curl_EoP_Exp.sln和curl_EoP.sln (x64-Release)。

注意:curl_EoP.sln需要libcurl。

  1. 以普通用户权限运行curl_EoP_Exp.exe。

忽略任何stdout输出。

  1. 以管理员或SYSTEM权限运行curl_EoP.exe。

作为漏洞利用的结果,C:/Windows/test_file.txt将被删除。

修复建议

可以使用GetFinalPathNameByHandle API检索特定文件句柄的最终目标文件路径。

通过将此检索到的路径与预期文件名进行比较,可以确定路径是否已通过链接被操纵。

在MoveFileExA和unlink等函数周围实现一个安全包装器,包含此逻辑以防止利用。

支持材料/参考

  • curl_EoP.zip: curl_EoP.sln的源代码
  • curl_EoP_Exp.zip: curl_EoP_Exp.sln的源代码
  • PoC.mp4: 复现步骤视频

影响

摘要:中等权限攻击者可以通过针对任何使用CURLOPT_COOKIEJAR、CURLOPT_HSTS或CURLOPT_ALTSVC选项且具有用户可写路径的特权程序,实现权限提升(EoP)至SYSTEM。

时间线

  • 2025年1月16日中午12点UTC:justlikebono_official向curl提交报告
  • 2025年1月16日中午12:01 UTC:justlikebono_official更新漏洞信息
  • 2025年1月16日中午12:03 UTC:curl工作人员dgustafsson发表评论
  • 2025年1月16日中午12:06 UTC:justlikebono_official更新漏洞信息
  • 2025年1月16日下午4:56 UTC:curl工作人员dfandrich发表评论
  • 2025年1月16日下午5:27 UTC:justlikebono_official发表评论
  • 2025年1月16日晚上7:59 UTC:curl工作人员bagder发表评论
  • 2025年1月17日凌晨2:46 UTC:justlikebono_official更新评论
  • 2025年1月19日上午11:32 UTC:curl工作人员bagder发表评论
  • 2025年1月19日上午11:39 UTC:bagder提交PR #16051
  • 2025年1月19日下午1:37 UTC:justlikebono_official发表评论
  • 2025年1月20日上午8:09 UTC:curl工作人员bagder发表评论
  • 2025年1月20日上午8:15 UTC:justlikebono_official发表评论
  • 2025年1月21日上午9:30 UTC:bagder关闭报告并将状态更改为Informative
  • 2025年7月1日下午2:11 UTC:bagder请求披露此报告
  • 2025年7月3日上午6:43 UTC:bagder披露此报告

报告详情

  • 报告时间:2025年1月16日中午12点UTC
  • 报告者:justlikebono_official
  • 报告对象:curl
  • 报告ID:#2941920
  • 状态:Informative
  • 严重性:高(7 ~ 8.9)
  • 披露时间:2025年7月3日上午6:43 UTC
  • 弱点:权限提升
  • CVE ID:无
  • 赏金:隐藏
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计