Stack use-after-scope in HTTP/3 POST request processing via CURLOPT_POSTFIELDS
摘要
libcurl的HTTP/3请求处理在使用CURLOPT_POSTFIELDS与栈分配缓冲区时存在栈释放后使用漏洞。libcurl保留了用户提供的POST数据指针,但在原始栈帧销毁后仍访问该指针,导致内存损坏和潜在的拒绝服务。
漏洞详情
该漏洞发生在transfer.c:569的Curl_pretransfer()函数中,当libcurl对先前存储的POST数据指针(现在指向无效的栈内存)调用strlen()时触发。
复现步骤
环境
- libcurl版本: 8.16.0-DEV (master分支)
- 编译器: Clang 20.1.8 with AddressSanitizer
- 平台: macOS (ARM64)
- 配置: 启用HTTP/3支持(ngtcp2/nghttp3)
复现代码
|
|
技术分析
根本原因
漏洞源于libcurl的CURLOPT_POSTFIELDS行为:
- libcurl存储指针但不复制数据
- 应用程序的栈缓冲区在作用域结束后失效
- libcurl随后在Curl_pretransfer()中解引用无效指针
受影响代码路径
|
|
修复建议
- 文档说明: 明确CURLOPT_POSTFIELDS数据在传输完成前必须保持有效
- API增强: 考虑添加边界检查或自动复制栈指针
- 替代API: 推广更安全的CURLOPT_COPYPOSTFIELDS使用模式
影响评估
安全影响
- 拒绝服务: 必然导致应用程序崩溃
- 内存损坏: 释放后使用可能导致不可预测行为
- 潜在代码执行: 特定情况下可能被利用进行控制流劫持
受影响场景
- 使用libcurl进行HTTP/3 POST请求的应用程序
- CURLOPT_POSTFIELDS指向栈分配内存的任何代码模式
- 特别影响: HTTP/3客户端应用、使用栈缓冲区的API客户端、内存受限的嵌入式系统
实际暴露风险
- 语言绑定: 许多curl绑定可能无意中创建此模式
- 示例应用: CLI工具、网络爬虫、API客户端
- 严重性: 由于HTTP/3采用率增长和远程可利用性而被评为高危