linux竞争漏洞,Linux Kernel 本地竞争条件漏洞

Linux Kernel是开放源码操作系统Linux所使用的内核,存在locks_remove_flock()本地竞争条件漏洞。

受影响系统:

Linux kernel 2.6.x

不受影响系统:

Linux kernel 2.6.25.6

描述:

--------------------------------------------------------------------------------

BUGTRAQ ID: 33237

CVE(CAN) ID: CVE-2008-4307

Linux Kernel是开放源码操作系统Linux所使用的内核。

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 = &fl->fl_next;

}

unlock_kernel();

}

建议:

--------------------------------------------------------------------------------

厂商补丁:

Linux

-----

目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值