Linux Kernel 程序file.c 本地竞争条件漏洞 CVE-2008-4307 CNNVD-200901-123

4.0 AV AC AU C I A
发布: 2009-01-13
修订: 2023-02-13

Linux kernel是美国Linux基金会发布的开源操作系统Linux所使用的内核。NFSv4 implementation是其中的一个分布式文件系统协议。 RHEL4/5内核处理POSIX锁定时fcntl调用可能与关闭相同文件描述符出现竞争,本地攻击者可以利用这个漏洞导致拒绝服务或获得权限提升。 fcntl以如下方式获得POSIX锁定: sys_fcntl() fget() do_fcntl() fcntl_setlk() fput() if(!count) __fput() locks_remove_flock() fcntl_setlk()调用可能阻塞很长时间,允许同一进程中的其他线程关闭文件描述符: sys_close() filp_close() locks_remove_posix() fput() if(!count) __fput() locks_remove_flock() 如果其中一个线程仍在fcntl_setlk中阻断期间但在许可锁定之前(在将file_lock结构放置到inode的i_lock列表之前)从另一个线程关闭了文件描述符,关闭路径中的locks_remove_posix调用就会错过POSIX锁定。此时还无法调用locks_remove_flock,因为fcntl_setlk中线程仍持有对文件的引用。 当__fput调用locks_remove_flock时,sys_fcntl返回路径的最终fput可以触发漏洞: /* * This function is called on the last close of an open file. */ void locks_remove_flock(struct file *filp) { [...] while ((fl = *before) != NULL) { if (fl->fl_file == filp) { if (IS_FLOCK(fl)) { locks_delete_lock(before); continue; } if (IS_LEASE(fl)) { lease_modify(before, F_UNLCK); continue; } if (IS_POSIX(fl)) continue; /* What? */ BUG(); <---- } before...

0%
当前有4条漏洞利用/PoC
当前有102条受影响产品信息