Windows下curl的easy_options选项权限提升漏洞分析

本文详细分析了Windows系统中curl库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等easy选项。例如,当设置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函数删除临时文件。

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

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

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

为了更好地理解此问题,将在下一节提供演示漏洞的概念验证(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等函数周围实现安全包装器,包含此逻辑以防止利用。

影响

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

时间线

  • 2025年1月16日12:00 UTC:justlikebono_official提交报告
  • 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日16:56 UTC:curl工作人员dfandrich发表评论
  • 2025年1月16日17:27 UTC:justlikebono_official发表评论
  • 2025年1月16日19:59 UTC:curl工作人员bagder发表评论
  • 2025年1月17日02:46 UTC:justlikebono_official更新评论
  • 2025年1月19日11:32 UTC:curl工作人员bagder发表评论
  • 2025年1月19日11:39 UTC:bagder提交PR #16051
  • 2025年1月19日13:37 UTC:justlikebono_official发表评论
  • 2025年1月20日08:09 UTC:curl工作人员bagder发表评论
  • 2025年1月20日08:15 UTC:justlikebono_official发表评论
  • 2025年1月21日09:30 UTC:bagder将报告关闭并标记为信息性
  • 2025年7月1日14:11 UTC:bagder请求披露此报告
  • 2025年7月3日06:43 UTC:bagder披露此报告

报告详情

  • 报告ID: #2941920
  • 严重性: 高(7 ~ 8.9)
  • 状态: 信息性
  • 披露时间: 2025年7月3日06:43 UTC
  • 弱点: 权限提升
  • CVE ID:
  • 赏金: 隐藏
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计