CVE-2026-39461FreeBSD的libcasper库存在一个严重的安全漏洞。该库通过UNIX域套接字与辅助进程通信,并使用select(2)系统调用等待数据。然而,libcasper未验证套接字描述符是否在select(2)的FD_SETSIZE限制(1024)之内。攻击者可以通过诱使使用libcasper的应用程序分配大量文件描述符(例如,打开大量文件且不关闭),从而触发栈破坏。如果目标应用程序具有setuid root权限,攻击者可利用此漏洞进行本地权限提升,完全控制受影响系统。
该漏洞的核心在于libcasper库对select(2)系统调用的不安全使用。在UNIX系统中,select()使用fd_set结构体来跟踪文件描述符,该结构体是一个固定大小的位图,通常由FD_SETSIZE定义为1024位。这意味着它只能正确处理0到1023的文件描述符。libcasper在将套接字描述符加入fd_set之前,未对该描述符的值进行检查。攻击者可以通过在目标程序运行前或运行期间打开大量文件(或建立网络连接),耗尽低编号的文件描述符。当libcasper尝试创建新的UNIX域套接字时,操作系统将分配一个大于或等于1024的文件描述符。此时,FD_SET宏会尝试写入fd_set缓冲区的边界之外,导致栈内存破坏。由于该缓冲区通常分配在栈上,这种越界写入可以覆盖函数的返回地址或局部变量。结合setuid root程序的上下文,攻击者可利用此内存破坏漏洞劫持控制流,从而获得root级别的系统访问权限。