libcurl HTTP/3 POST请求处理中的栈释放后使用漏洞分析

本文详细分析了libcurl在处理HTTP/3 POST请求时存在的栈释放后使用漏洞,该漏洞源于CURLOPT_POSTFIELDS选项未正确复制用户提供的栈内存数据,导致后续访问已释放的栈内存。

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)

复现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// http3_crash_poc.c
#include <curl/curl.h>
#include <string.h>

int main() {
    CURL *curl = curl_easy_init();
    
    // 栈分配缓冲区,将在作用域结束后失效
    {
        char body_data[257];
        memset(body_data, 'A', 256);
        body_data[256] = '\0';
        
        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
        curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3);
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body_data); // 漏洞调用
        curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 50L);
    } // body_data在此处超出作用域
    
    // libcurl在传输过程中访问无效内存
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    return 0;
}

技术分析

根本原因

漏洞源于libcurl的CURLOPT_POSTFIELDS行为:

  1. libcurl存储指针但不复制数据
  2. 应用程序的栈缓冲区在作用域结束后失效
  3. libcurl随后在Curl_pretransfer()中解引用无效指针

受影响代码路径

1
2
3
4
5
curl_easy_setopt(CURLOPT_POSTFIELDS) →
curl_easy_perform() →
Curl_pretransfer() →
strlen(invalid_pointer) →
崩溃

修复建议

  1. 文档说明: 明确CURLOPT_POSTFIELDS数据在传输完成前必须保持有效
  2. API增强: 考虑添加边界检查或自动复制栈指针
  3. 替代API: 推广更安全的CURLOPT_COPYPOSTFIELDS使用模式

影响评估

安全影响

  • 拒绝服务: 必然导致应用程序崩溃
  • 内存损坏: 释放后使用可能导致不可预测行为
  • 潜在代码执行: 特定情况下可能被利用进行控制流劫持

受影响场景

  • 使用libcurl进行HTTP/3 POST请求的应用程序
  • CURLOPT_POSTFIELDS指向栈分配内存的任何代码模式
  • 特别影响: HTTP/3客户端应用、使用栈缓冲区的API客户端、内存受限的嵌入式系统

实际暴露风险

  • 语言绑定: 许多curl绑定可能无意中创建此模式
  • 示例应用: CLI工具、网络爬虫、API客户端
  • 严重性: 由于HTTP/3采用率增长和远程可利用性而被评为高危
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计