报告 #3444904 - TFTP中的堆缓冲区溢出 | HackerOne
摘要
libcurl的TFTP实现中存在一个堆缓冲区溢出漏洞。当恶意TFTP服务器发送一个包含blksize选项的OACK(选项确认)数据包,且该选项值大于默认块大小(512字节)时,会触发此漏洞。libcurl更新了其内部的块大小变量,但未能重新分配接收和发送缓冲区(rpacket和spacket)。当应用程序随后使用更大的块大小接收数据(在tftp_rx中)或发送数据(在tftp_tx中)时,会写入超出已分配缓冲区的末尾,导致堆缓冲区溢出。
受影响版本
curl 8.18.0-DEV(基于include/curl/curlver.h中的LIBCURL_VERSION)
平台:Windows(已复现)
复现步骤
- 将提供的复现脚本保存为
tftp_repro.py。 - 运行脚本:
python tftp_repro.py。这将在端口6969上启动一个恶意TFTP服务器。 - 在另一个终端中,运行curl命令从该服务器获取文件:
curl tftp://localhost:6969/test(注意:确保使用的curl构建版本包含此易受攻击的代码。如果使用系统curl测试,它可能不易受攻击或版本不同)。 - 服务器将发送一个
blksize=2048的OACK,然后是一个2048字节的DATA数据包。 - 由于堆溢出,curl客户端将崩溃或表现出未定义行为。
支持材料/参考资料
- 易受攻击的代码位置:
lib/tftp.c,函数:tftp_parse_option_ack更新state->blksize但没有重新分配state->spacket.data和state->rpacket.data。 - 复现脚本:
tftp_repro.py
影响
摘要:此漏洞允许恶意TFTP服务器在客户端引发堆缓冲区溢出。
- 远程代码执行(RCE):通过在DATA数据包中精心构造载荷,攻击者可以覆盖关键的堆元数据或函数指针,可能以curl进程的权限在受害者机器上执行任意代码。
- 拒绝服务(DoS):溢出可能破坏内存结构,导致curl应用程序崩溃或行为不可预测,从而引发拒绝服务。
时间线
- helspy 向curl提交了一份报告。 - 2天前
- bagder curl staff 发表了评论。 - 2天前
感谢您的报告! 我们将花些时间调查您的报告,并尽快给您回复详细信息和可能的后续问题!很可能在接下来的24小时内。 我们始终致力于尽快修复报告的问题。严重性为低或中的问题,我们将其合并到常规发布周期中的下一个版本。只有对于更严重的问题,我们可能会提前发布修复。
- bagder curl staff 发表了评论。 - 1天前
@helspy 没有附带
tftp_repro.py脚本吗? - helspy 发表了评论。 - 1天前
抱歉!这是程序…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25import socket import struct PORT = 6969 blksz= 2048 def start_server(): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('0.0.0.0', PORT)) print(f" server started on port {PORT}") while True: data, addr = sock.recvfrom(1024) print(addr) opcode = struct.unpack('!H', data[:2])[0] if opcode == 1 or opcode == 2: print("Sending oack") oack = struct.pack('!H', 6) + b'blksize\0' + str(blksz).encode() + b'\0' sock.sendto(oack, addr) if opcode == 1: print("sending data packet") payload = b'A' * blksz data_pkt = struct.pack('!HH', 3, 1) + payload sock.sendto(data_pkt, addr) if __name__ == "__main__": start_server() - helspy 发表了评论。 - 1天前
看起来在
tftp_parse_option_ack中,当服务器发送新的块大小时,代码会检查:1 2 3 4if(blksize > state->requested_blksize) { failf(data, "server requested blksize larger than allocated"); return CURLE_TFTP_ILLEGAL; }这个检查强制客户端使用比最初分配的更大的块大小,因此可能防止堆溢出。我是在写报告(提交得太早了)时并行尝试复现的,这是个错误。抱歉,您可以关闭这个问题了。
- bagder curl staff 关闭了报告并将状态更改为“不适用”。 - 1天前
被认为不是一个安全问题。
- bagder curl staff 请求披露此报告。 - 1天前
根据项目的透明度政策,我们希望所有报告都被披露并公开。
- bagder curl staff 披露了此报告。 - 2小时前
报告详情
- 报告于:2025年11月29日,UTC时间下午5:06
- 报告人:helspy
- 报告给:curl
- 报告ID:#3444904
- 严重性:严重 (9 ~ 10)
- 披露于:2025年12月1日,UTC时间上午7:41
- 弱点:堆溢出
- CVE ID:无
- 赏金:无
- 账户详情:无