CVE-2026-39457FreeBSD的libnv库在处理socket通信时存在严重的安全漏洞。由于libnv使用select(2)等待数据时,未验证传入的socket描述符是否超过FD_SETSIZE(1024)的限制,导致发生栈破坏。攻击者可通过迫使应用程序打开大量文件描述符,分配高值描述符来触发该漏洞。如果目标应用程序是setuid-root程序,攻击者可利用此缺陷进行本地权限提升,完全控制系统。
该漏洞的根本原因在于libnv库未对文件描述符(FD)进行边界检查。select()系统调用使用固定大小的fd_set结构体(通常为1024位),每位对应一个文件描述符。当传入的FD值大于等于1024时,FD_SET宏会计算偏移量并写入栈上fd_set缓冲区的边界之外,导致栈内存破坏。攻击者首先需要在本地环境消耗文件描述符资源,使得新打开的socket获得大于1024的FD值。随后,诱导使用libnv的setuid-root程序(如系统工具)对该高值FD进行操作。当程序调用select()时,越界写入将破坏栈上的返回地址或关键变量,从而允许攻击者劫持控制流并以root权限执行任意代码。