作者: Moshe Kol, Shlomi Oberman
用于 FreeBSD dhclient 在解析 DHCP 选项 119 (CVE-2020-7461) 时堆缓冲区溢出漏洞的重现 PoC。
问题出在文件 sbin/dhclient/options.c 中的函数 find_search_domain_name_len 中。
当服务器提供 DHCP 选项 119(域搜索,RFC 3397)时,expand_domain_search 调用此函数。
当使用压缩方案时,函数 find_search_domain_name_len 从指向位置开始递归调用,但未能检查递归调用的返回值。
如果递归调用失败,则使用返回值 -1,并将其简单地添加到累积长度变量中。
以下是错误代码(options.c 第 299-301 行,最新提交 70066b9):
299: pointed_len = find_search_domain_name_len(option,
300: &pointer);
301: domain_name_len += pointed_len;
随后,在函数 expand_domain_search 中,使用 find_search_domain_name_len 计算出的长度分配一个缓冲区,然后使用函数 expand_search_domain_name 将展开的名称写入该缓冲区。
由于后一个函数对压缩方案中的指针值没有任何检查,因此有可能越界写入分配的缓冲区。
您可以在 此处 找到 FreeBSD 安全公告。