CVE:CVE-2004-0114
CNNVD:CNNVD-200403-037
BSD系统中的shmat(2)函数映射一个或多个进程/线程共享内存段中，之前可通过shmget(2)函数建立。
shmat(2)系统调用存在编程错误，可导致共享内存段参考计数器错误的增长，可能造成权限提升。
这个函数在sysv_shm.c文件中实现：
        -- sysv_shm.c lines 317-322 --
                vm_object_reference(shm_handle->shm_object);
                rv = vm_map_find(&p->p_vmspace->vm_map，
                                 shm_handle->shm_object，
                                 0， &attach_va， size，
                                 (flags & MAP_FIXED) ? 0 : 1，
                                 prot， prot， 0);
                if (rv != KERN_SUCCESS) return ENOMEM;
        -- end of code snippet --
shmat(2)函数开始增加下面的vm_object的参考计数，然后尝试插入vm_object到进程地址空间。问题是由于shmat(2)函数在当vm_map_find函数返回失败时忘记递减参考计数值。
此漏洞可以被本地用户利用：
可以使用shmget(2)函数建立共享内存段，和使用shmat(2)函数在进程地址空间中建立两个不同地点的映射。
在经过大约2^32-2(非法)调用shmat(2)函数，vm_object的参考计数值会变为1。
在使用shmdt(2)函数删除一个映射后，vm_object会释放，不过我们会拥有一个额外的映射。然后利用欺骗执行一个会重用释放了的vm_object堆栈段的SUID进程，这时候就可以直接写SUID程序的堆栈段，并方便的提升权限。
solution:Upgrade freebsd freebsd to a higher version than 5.2,and avoid the version (,5.2]; Upgrade netbsd netbsd to a higher version than 1.3,and avoid the version (,1.3]; Upgrade openbsd openbsd to a higher version than 2.6,and avoid the version (,2.6]