SystemVll/CVE-2022-23093
GitHub: SystemVll/CVE-2022-23093
该项目是 FreeBSD ping 程序 ICMP 栈溢出漏洞(CVE-2022-23093)的概念验证代码,用于复现和分析该漏洞的触发原理。
Stars: 10 | Forks: 2
# CVE-2022-23093 FreeBSD 基于栈的溢出
### 信息
默认使用的 shellcode 是 **FreeBSD/x86-64 - execve - 28 bytes from Gitsnik**,请将其修改为你自己的 shellcode 以便开始
### 漏洞详情
ping 实用程序用于向主机或网关请求 ICMP ECHO_RESPONSE,通过 ICMP 协议强制要求的 ECHO_REQUEST 数据报,使用 IPv4 目标(IPv4-host 或 IPv4-mcast-group)进行调用。ECHO_REQUEST 数据报由一个 IP 和 ICMP 头部组成,其后跟随一个 "struct timeval" 以及不定数量的 "pad" 字节以填满数据包。
根据 FreeBSD 项目的安全公告,ping 实用程序从网络获取原始 IP 数据包,以在 pr_pack() 函数内处理响应。在响应处理过程中,ping 会重构 IP 头部、ICMP 头部,以及如果存在的话,还会重构一个代表导致 ICMP 错误的数据包的“引用数据包 (quoted packet)”。该引用数据包也包含一个 IP 头部和一个 ICMP 头部。
pr_pack() 函数将接收到的 IP 和 ICMP 头部复制到栈缓冲区中以进行进一步处理。然而,它未能考虑到在响应或引用数据包中,IP 头部之后可能跟随 IP 选项头的情况。在存在 IP 选项时,pr_pack() 会导致目标缓冲区最多溢出 40 字节。
### 技术分析
ping 实用程序运行在用户空间,当调用 ping 命令时,位于 /sbin/ping 的二进制文件将被执行。该实用程序的源码可在 FreeBSD 源码中公开获取。存在漏洞的函数 pr_pack() 会以字符串格式将 ICMP 数据包响应信息打印到 stdout,例如:"64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."

如上图所示,无论是请求还是响应中的 ICMP 数据包,都包含了带有可选 Options 字段的 IP 头部。在恶意攻击中,这些 IP Options 会被启用并填充非空字节。
如果 ICMP 数据包在发往目标主机的途中被恶意篡改或格式错误,并且在原始 echo 请求中启用了 IP Options,pr_pack() 函数将无法在栈上分配足够的空间来容纳这些 IP Options,从而导致栈溢出。
在这些错误情况下,来自目标主机的响应可能在其数据部分包含一个“引用数据包”,用于标识导致 ICMP 错误的具体数据包。当引用数据包包含 ICMP 头部时,pr_pack() 函数会引发栈溢出。
标签:FreeBSD, POC, Shellcode, 安全, 客户端加密, 技术调研, 缓冲区溢出, 超时处理, 进程监控