vnops.c资源泄漏本地拒绝服务漏洞(2)

在这段代码中,vp指针用于存储sys/vnode.h中定义的vnode结构。从最后一个if语句可知如果msleep()中出错,就会递减writer的引用计数器;如果已递减至无,就会使用socantrcvmore()锁定fip->fi_readsock套接字描述符,然后启动互斥锁递增fip->fi_wgen计数器,最终对vp指针调用fifo_cleanup()清除FIFO资源:

/*
* Dispose of fifo resources.
*/
static void
fifo_cleanup(struct vnode *vp)
{
        struct fifoinfo *fip = vp->v_fifoinfo;

ASSERT_VOP_ELOCKED(vp, "fifo_cleanup");
        if (fip->fi_readers == 0 && fip->fi_writers == 0) {
                vp->v_fifoinfo = NULL;
                (void)soclose(fip->fi_readsock);
                (void)soclose(fip->fi_writesock);
                free(fip, M_VNODE);
        }
}

但是在fifo_open()中,如果FIFO为非阻断模式且reader的引用计数器等于0,ap->a_mode & FWRITE的if语句就会解锁FIFO互斥锁并未经释放资源便返回ENXIO,导致资源泄漏。

<*来源:Dorr H. Clark (dclark@engr.scu.edu
 
  链接:
        ?l=freebsd-hackers&m=125747695726241&w=2
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

?l=freebsd-hackers&m=125747695726241&w=2

建议:
--------------------------------------------------------------------------------
厂商补丁:

FreeBSD
-------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpddg.html