uC-HTTP漏洞分析( CVE-2023-28379 CVE-2023-25181......)
字数 1960 2025-08-19 12:41:40

uC-HTTP 漏洞分析技术文档

1. 概述

uC-HTTP 是一个专为运行 µC/OS II 或 µC/OS III RTOS 内核的嵌入式系统设计的 HTTP 服务器实现。该服务器支持多种功能,包括持久连接、表单处理、分块传输编码、HTTP 标头字段处理、HTTP 查询字符串处理和动态内容。

在 uC-HTTP v3.01.01 版本中发现了多个严重漏洞,包括:

  • CVE-2023-28379
  • CVE-2023-25181
  • 以及其他多个未分配CVE的漏洞

2. 漏洞分析

2.1 HTTP请求处理流程

uC-HTTP 使用状态机处理HTTP请求,主要处理函数为 HTTPsReq_Handle

void HTTPsReq_Handle(HTTPs_INSTANCE *p_instance, HTTPs_CONN *p_conn)
{
    done = DEF_NO;
    while (done != DEF_YES) {
        switch (p_conn->State) {
            case HTTPs_CONN_STATE_REQ_INIT:
                // 初始化处理
                break;
            case HTTPs_CONN_STATE_REQ_PARSE_METHOD:
                // 解析HTTP方法
                break;
            case HTTPs_CONN_STATE_REQ_PARSE_URI:
                // 解析URI
                break;
            case HTTPs_CONN_STATE_REQ_PARSE_QUERY_STRING:
                // 解析查询字符串
                break;
            case HTTPs_CONN_STATE_REQ_PARSE_PROTOCOL_VERSION:
                // 解析协议版本
                break;
            case HTTPs_CONN_STATE_REQ_PARSE_HDR:
                // 解析HTTP头
                break;
            // 其他状态...
        }
    }
}

2.2 主要漏洞分析

2.2.1 OOB Write 漏洞 (方法解析漏洞)

漏洞位置: HTTPsReq_MethodParse 函数

漏洞原因:

  1. 在计算HTTP方法长度时,没有正确考虑前面的无效字符
  2. 导致 p_conn->RxBufLenRem 被错误地减少了无效字符的长度

关键代码:

p_request_method_start = HTTP_StrGraphSrchFirst(p_conn->RxBufPtr, len); // [1]
len -= p_request_method_start - p_conn->RxBufPtr; // [2] 正确的长度计算
p_request_method_end = Str_Char_N(p_request_method_start, len, ASCII_CHAR_SPACE); // [3]
len = p_request_method_end - p_request_method_start; // [4] 错误的长度计算
p_conn->RxBufLenRem -= len; // [5] 错误的长度减少

影响:

  • 导致后续的 HTTPsReq_BodyFormAppKeyValBlkAdd 函数使用错误的长度
  • 最终在 HTTPsReq_URL_EncodeStrParse 中造成越界写入NULL字节

2.2.2 Off-by-NULL 漏洞 (头解析漏洞)

漏洞位置: HTTPsReq_HdrParse 函数

漏洞原因:

  1. 在解析失败的header时,没有正确处理长度等于最大长度的情况
  2. len == p_cfg->HdrRxCfgPtr->DataLenMax 时,会在缓冲区末尾写入一个NULL字节,导致单字节溢出

关键代码:

if (len > p_cfg->HdrRxCfgPtr->DataLenMax) { // [2] 缺少等于情况的检查
    // 错误处理
}
p_str = (CPU_CHAR *)p_req_hdr_blk->ValPtr + len; // [3]
*p_str = ASCII_CHAR_NULL; // [4] 单字节NULL溢出

2.2.3 Off-by-NULL 漏洞 (Host解析漏洞)

漏洞位置: Host头解析部分

漏洞原因:

  1. 当Host长度正好等于 p_cfg->HostNameLenMax
  2. 在字符串末尾写入NULL字节会导致单字节溢出

关键代码:

len = DEF_MIN(len, p_cfg->HostNameLenMax); // [2]
Str_Copy_N(p_conn->HostPtr, p_val, len);
p_conn->HostPtr[len] = ASCII_CHAR_NULL; // [3] 单字节NULL溢出

2.2.4 Heap Overflow 漏洞 (Boundary解析漏洞)

漏洞位置: 表单boundary解析部分

漏洞原因:

  1. 解析boundary时没有进行长度限制
  2. 直接拷贝到固定大小的缓冲区中,导致堆溢出

关键代码:

Str_Copy_N(p_conn->FormBoundaryPtr, p_val, len); // [0] 无长度限制的拷贝

2.2.5 Buffer Overflow 漏洞 (协议解析漏洞)

漏洞位置: HTTPsReq_ProtocolVerParse 函数

漏洞原因:

  1. 在跳过无效字符后没有更新剩余长度
  2. 导致在缓冲区外搜索CRLF
  3. 计算新长度时可能产生整数下溢

关键代码:

p_protocol_ver_start = HTTP_StrGraphSrchFirst(p_conn->RxBufPtr, len); // [1]
// len未更新
p_protocol_ver_end = Str_Str_N(p_protocol_ver_start, STR_CR_LF, len); // [2] 可能越界搜索
p_conn->RxBufLenRem -= (p_protocol_ver_end - p_conn->RxBufPtr) + 2; // [3] 可能整数下溢

后续影响:

  1. 下溢的长度值被用于 Mem_Copy,可能导致缓冲区溢出
  2. 错误的指针计算导致后续接收操作写入缓冲区外

3. 漏洞验证与利用

虽然原文未提供完整的PoC,但根据漏洞分析,可以构建以下利用思路:

  1. OOB Write利用:

    • 构造包含多个前导空白字符的HTTP请求
    • 精心设计方法名称长度,触发长度计算错误
    • 控制后续写入位置
  2. Off-by-NULL利用:

    • 对于Host头漏洞,发送长度正好等于限制的Host头
    • 对于头解析漏洞,构造特定长度的header字段
  3. Heap Overflow利用:

    • 发送超长的boundary字符串
    • 覆盖堆上的关键数据结构
  4. Buffer Overflow利用:

    • 构造包含大量前导无效字符的请求
    • 触发整数下溢
    • 控制后续内存操作

4. 修复建议

针对每个漏洞,应采取以下修复措施:

  1. OOB Write修复:

    • 在方法解析中正确计算长度,考虑前导无效字符
  2. Off-by-NULL修复:

    • 对所有字符串拷贝操作添加严格长度检查
    • 确保缓冲区有额外空间存放NULL终止符
  3. Heap Overflow修复:

    • 为boundary解析添加最大长度限制
    • 使用安全字符串拷贝函数
  4. Buffer Overflow修复:

    • 在跳过无效字符后正确更新剩余长度
    • 添加边界检查防止整数下溢

5. 参考资源

  • 官方代码仓库: https://github.com/weston-embedded/uC-HTTP
  • 漏洞报告: https://talosintelligence.com/vulnerability_reports/TALOS-2023-1725
  • uC-LIB库: https://github.com/weston-embedded/uC-LIB

6. 总结

uC-HTTP v3.01.01 中存在多个严重的内存安全漏洞,主要源于不正确的长度计算和缺乏边界检查。这些漏洞可导致远程代码执行、服务崩溃等严重后果。嵌入式设备开发者应特别注意这些安全问题,及时更新到修复版本或应用补丁。

uC-HTTP 漏洞分析技术文档 1. 概述 uC-HTTP 是一个专为运行 µC/OS II 或 µC/OS III RTOS 内核的嵌入式系统设计的 HTTP 服务器实现。该服务器支持多种功能,包括持久连接、表单处理、分块传输编码、HTTP 标头字段处理、HTTP 查询字符串处理和动态内容。 在 uC-HTTP v3.01.01 版本中发现了多个严重漏洞,包括: CVE-2023-28379 CVE-2023-25181 以及其他多个未分配CVE的漏洞 2. 漏洞分析 2.1 HTTP请求处理流程 uC-HTTP 使用状态机处理HTTP请求,主要处理函数为 HTTPsReq_Handle : 2.2 主要漏洞分析 2.2.1 OOB Write 漏洞 (方法解析漏洞) 漏洞位置 : HTTPsReq_MethodParse 函数 漏洞原因 : 在计算HTTP方法长度时,没有正确考虑前面的无效字符 导致 p_conn->RxBufLenRem 被错误地减少了无效字符的长度 关键代码 : 影响 : 导致后续的 HTTPsReq_BodyFormAppKeyValBlkAdd 函数使用错误的长度 最终在 HTTPsReq_URL_EncodeStrParse 中造成越界写入NULL字节 2.2.2 Off-by-NULL 漏洞 (头解析漏洞) 漏洞位置 : HTTPsReq_HdrParse 函数 漏洞原因 : 在解析失败的header时,没有正确处理长度等于最大长度的情况 当 len == p_cfg->HdrRxCfgPtr->DataLenMax 时,会在缓冲区末尾写入一个NULL字节,导致单字节溢出 关键代码 : 2.2.3 Off-by-NULL 漏洞 (Host解析漏洞) 漏洞位置 : Host头解析部分 漏洞原因 : 当Host长度正好等于 p_cfg->HostNameLenMax 时 在字符串末尾写入NULL字节会导致单字节溢出 关键代码 : 2.2.4 Heap Overflow 漏洞 (Boundary解析漏洞) 漏洞位置 : 表单boundary解析部分 漏洞原因 : 解析boundary时没有进行长度限制 直接拷贝到固定大小的缓冲区中,导致堆溢出 关键代码 : 2.2.5 Buffer Overflow 漏洞 (协议解析漏洞) 漏洞位置 : HTTPsReq_ProtocolVerParse 函数 漏洞原因 : 在跳过无效字符后没有更新剩余长度 导致在缓冲区外搜索CRLF 计算新长度时可能产生整数下溢 关键代码 : 后续影响 : 下溢的长度值被用于 Mem_Copy ,可能导致缓冲区溢出 错误的指针计算导致后续接收操作写入缓冲区外 3. 漏洞验证与利用 虽然原文未提供完整的PoC,但根据漏洞分析,可以构建以下利用思路: OOB Write利用 : 构造包含多个前导空白字符的HTTP请求 精心设计方法名称长度,触发长度计算错误 控制后续写入位置 Off-by-NULL利用 : 对于Host头漏洞,发送长度正好等于限制的Host头 对于头解析漏洞,构造特定长度的header字段 Heap Overflow利用 : 发送超长的boundary字符串 覆盖堆上的关键数据结构 Buffer Overflow利用 : 构造包含大量前导无效字符的请求 触发整数下溢 控制后续内存操作 4. 修复建议 针对每个漏洞,应采取以下修复措施: OOB Write修复 : 在方法解析中正确计算长度,考虑前导无效字符 Off-by-NULL修复 : 对所有字符串拷贝操作添加严格长度检查 确保缓冲区有额外空间存放NULL终止符 Heap Overflow修复 : 为boundary解析添加最大长度限制 使用安全字符串拷贝函数 Buffer Overflow修复 : 在跳过无效字符后正确更新剩余长度 添加边界检查防止整数下溢 5. 参考资源 官方代码仓库: https://github.com/weston-embedded/uC-HTTP 漏洞报告: https://talosintelligence.com/vulnerability_ reports/TALOS-2023-1725 uC-LIB库: https://github.com/weston-embedded/uC-LIB 6. 总结 uC-HTTP v3.01.01 中存在多个严重的内存安全漏洞,主要源于不正确的长度计算和缺乏边界检查。这些漏洞可导致远程代码执行、服务崩溃等严重后果。嵌入式设备开发者应特别注意这些安全问题,及时更新到修复版本或应用补丁。