Linux Kernel locks_remove_flock()漏洞

  作者:Amteam.org
2009/1/16 9:37:00
本文关键字: 审计

  受影响系统:

  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();
  }

  <*来源:Eugene Teo (eugeneteo@eugeneteo.net)

  链接:https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=456282 *>

  厂商补丁:

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

  http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/old/patch-2.6.25-git6.log

责编:
vsharing微信扫一扫实时了解行业动态
portalart微信扫一扫分享本文给好友

著作权声明:kaiyun体育官方人口 文章著作权分属kaiyun体育官方人口 、网友和合作伙伴,部分非原创文章作者信息可能有所缺失,如需补充或修改请与我们联系,工作人员会在1个工作日内配合处理。
最新专题
网络安全热点透析

随着移动互联、大数据、云计算、物联网等技术的日益发展,在这些热点技术为个人生活带来便利的同时,也为企业发展..

数据安全医药行业解决方案

采用身份鉴别、访问控制、数据加密以及权限控制等多种安全防护技术手段,保障数据库中医药数据只能被合法用户合规..

    畅享
    首页
    返回
    顶部
    ×
      信息化规划
      IT总包
      供应商选型
      IT监理
      开发维护外包
      评估维权
    客服电话
    400-698-9918
    Baidu
    map