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 函数
漏洞原因:
- 在计算HTTP方法长度时,没有正确考虑前面的无效字符
- 导致
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 函数
漏洞原因:
- 在解析失败的header时,没有正确处理长度等于最大长度的情况
- 当
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头解析部分
漏洞原因:
- 当Host长度正好等于
p_cfg->HostNameLenMax时 - 在字符串末尾写入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解析部分
漏洞原因:
- 解析boundary时没有进行长度限制
- 直接拷贝到固定大小的缓冲区中,导致堆溢出
关键代码:
Str_Copy_N(p_conn->FormBoundaryPtr, p_val, len); // [0] 无长度限制的拷贝
2.2.5 Buffer Overflow 漏洞 (协议解析漏洞)
漏洞位置: HTTPsReq_ProtocolVerParse 函数
漏洞原因:
- 在跳过无效字符后没有更新剩余长度
- 导致在缓冲区外搜索CRLF
- 计算新长度时可能产生整数下溢
关键代码:
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] 可能整数下溢
后续影响:
- 下溢的长度值被用于
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 中存在多个严重的内存安全漏洞,主要源于不正确的长度计算和缺乏边界检查。这些漏洞可导致远程代码执行、服务崩溃等严重后果。嵌入式设备开发者应特别注意这些安全问题,及时更新到修复版本或应用补丁。