`
zlei
  • 浏览: 31955 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

从Linux内核的漏洞角度考虑系统安全

阅读更多
从Linux内核的漏洞角度考虑系统安全
与Windows相比,Linux被认为具有更好的安全性和其他扩展性能。这些特性使得Linux在操作系统领域异军突起,得到越来越多的重视。随着Linux应用量的增加,其安全性也逐渐受到了公众甚或黑客的关注。那么,Linux是否真的如其支持厂商们所宣称的那样安全呢?

  Linux内核精短、稳定性高、可扩展性好、硬件需求低、免费、网络功能丰富、适用于多种cpu等特性,使之在操作系统领域异军突起。其独特的魅力使它不仅在pc机上占据一定的份额,而且越来越多地被使用在各种嵌入式设备中,并被当作专业的路由器,防火墙,或者高端的服务器OS来使用。各种类型的Linux发行版本也如雨后春笋般冒了出来,国内更是掀起了Linux的使用热潮,很多政府部门因安全需要也被要求使用Linux.正是因为Linux被越来越多地使用,其安全性也渐渐受到了公众的关注,当然,也更多地受到了黑客的关注。通常,我们讨论Linux系统安全都是从Linux安全配置的角度或者Linux的安全特性等方面来讨论的,而这一次我们转换一下视角,从 Linux系统中存在的漏洞与这些漏洞产生的影响来讨论Linux的安全性。

  首先来说明一下这次我们讨论Linux系统安全的范围,其实通常我们所说的Linux是指GNU/Linux系统,Linux是系统中使用的操作系统内核。这一次我们重点从Linux系统内核中存在的几类非常有特点的漏洞来讨论Linux系统的安全性。

  权限提升类漏洞

  一般来说,利用系统上一些程序的逻辑缺陷或缓冲区溢出的手段,攻击者很容易在本地获得Linux服务器上管理员权限root;在一些远程的情况下,攻击者会利用一些以root身份执行的有缺陷的系统守护进程来取得root权限,或利用有缺陷的服务进程漏洞来取得普通用户权限用以远程登录服务器。目前很多Linux服务器都用关闭各种不需要的服务和进程的方式来提升自身的安全性,但是只要这个服务器上运行着某些服务,攻击者就可以找到权限提升的途径。下面是一个比较新的导致权限提升的漏洞。

  do_brk()边界检查不充分漏洞在2003年9月份被Linux内核开发人员发现,并在9月底发布的Linux kernel 2.6.0-test6中对其进行了修补。但是Linux内核开发人员并没有意识到此漏洞的威胁,所以没有做任何通报,一些安全专家与黑客却看到了此漏洞蕴涵的巨大威力。在2003年11月黑客利用rsync中一个未公开的堆溢出与此漏洞配合,成功地攻击了多台Debian与Gentoo Linux的服务器。

  下面让我们简单描述一下该漏洞。该漏洞被发现于brk系统调用中。brk系统调用可以对用户进程的堆的大小进行操作,使堆扩展或者缩小。而brk内部就是直接使用do_brk()函数来做具体的操作, do_brk()函数在调整进程堆的大小时既没有对参数len进行任何检查(不检查大小也不检查正负),也没有对addr+len是否超过 TASK_SIZE做检查。这样我们就可以向它提交任意大小的参数len,使用户进程的大小任意改变以至可以超过TASK_SIZE的限制,使系统认为内核范围的内存空间也是可以被用户访问的,这样的话普通用户就可以访问到内核的内存区域。通过一定的操作,攻击者就可以获得管理员权限。这个漏洞极其危险,利用这个漏洞可以使攻击者直接对内核区域操作,可以绕过很多Linux系统下的安全保护模块。

  此漏洞的发现提出了一种新的漏洞概念,即通过扩展用户的内存空间到系统内核的内存空间来提升权限。当发现这种漏洞时,通过研究我们就认为内核中一定还会存在类似的漏洞,果然几个月后黑客们又在Linux内核中发现与brk相似的漏洞。通过这次成功的预测,更证实了对这种新型的概念型漏洞进行研究很有助于安全人员在系统中发现新的漏洞。

  拒绝服务类漏洞

  拒绝服务攻击是目前比较流行的攻击方式,它并不取得服务器权限,而是使服务器崩溃或失去响应。对Linux的拒绝服务大多数都无须登录即可对系统发起拒绝服务攻击,使系统或相关的应用程序崩溃或失去响应能力,这种方式属于利用系统本身漏洞或其守护进程缺陷及不正确设置进行攻击。

  另外一种情况,攻击者登录到Linux系统后,利用这类漏洞,也可以使系统本身或应用程序崩溃。这种漏洞主要由程序对意外情况的处理失误引起,如写临时文件之前不检查文件是否存在,盲目跟随链接等。

  下面,我们简单描述一下Linux在处理intel IA386 CPU中的寄存器时发生错误而产生的拒绝服务漏洞。该漏洞是因为IA386多媒体指令使用的寄存器MXcsR的特性导致的。由于IA386 CPU规定MXCSR寄存器的高16位不能有任何位被置位,否则CPU就会报错导致系统崩溃。为了保证系统正常运转,在linux系统中有一段代码专门对MXCSR的这个特性作处理,而这一段代码在特定的情况下会出现错误,导致MXCSR中的高16位没有被清零,使系统崩溃。如果攻击者制造了这种“极限”的内存情况就会对系统产生DoS效果。

  攻击者通过调用get_fpxregs函数可以读取多媒体寄存器至用户空间,这样用户就可以取得MXCSR寄存器的值。调用set_fpxregs函数可以使用用户空间提供的数据对MXCSR寄存器进行赋值。通过对MXCSR的高16位进行清0,就保证了IA386 CPU的这个特性。如果产生一种极限效果使程序跳过这一行,使MXCSR寄存器的高16位没有被清0,一旦MXCSR寄存器的高16位有任何位被置位,系统就会立即崩溃!

  因为利用这个漏洞攻击者还需要登录到系统,这个漏洞也不能使攻击者提升权限,只能达到DoS的效果,所以这个漏洞的危害还是比较小的。但是分析这个漏洞就没有意义了吗?其实由分析这个漏洞可以看出:Linux内核开发成员对这种内存拷贝时出现错误的情况没有进行考虑,以至造成了这个漏洞,分析了解了这个漏洞后,在漏洞挖掘方面也出现了一种新的类型,使我们在以后的开发中可以尽量避免这种情况。

  接下来让我们看一种Linux内核算法上出现的漏洞。先来简单介绍一下这个漏洞,当Linux系统接收到攻击者经过特殊构造的包后,会引起hash表产生冲突导致服务器资源被耗尽。这里所说的hash冲突就是指:许多数值经过某种hash算法运算以后得出的值相同,并且这些值都被储存在同一个hash槽内,这就使hash表变成了一个单向链表。而对此hash表的插入操作会从原来的复杂度O(n)变为O(n*n)。这样就会导致系统消耗巨大的cpu资源,从而产生了DoS攻击效果。

  我们先看一下在linux中使用的hash算法,这个算法用在对Linux route catch的索引与分片重组的操作中。在今年五月Rice University计算机科学系的Scott A. Crosby与Dan S. Wallach提出了一种新的低带宽的DoS攻击方法,即针对应用程序所使用的hash算法的脆弱性进行攻击。这种方法提出:如果应用程序使用的hash 算法存在弱点,也就是说hash算法不能有效地把数据进行散列,攻击者就可以通过构造特殊的值使hash算法产生冲突引起DoS攻击。

202
  
  203 static __inline__ unsigned rt_hash_code(u32 daddr, u32 saddr, u8 tos)
  
  204 {
  
  205 unsigned hash = ((daddr & 0xF0F0F0F0) >> 4) │
  
  206 ((daddr & 0x0F0F0F0F) << 4);
  
  207 hash ^= saddr ^ tos;
  
  208 hash ^= (hash >> 16);
  
  209 return (hash ^ (hash >>) & rt_hash_mask;
  
  210 }
  


  以上的代码就是Linux对ip包进行路由或者重组时使用的算法。此算法由于过于简单而不能把route缓存进行有效的散列,从而产生了DoS漏洞。下面我们来分析一下此函数。

  203行为此函数的函数名与入口参数,u32 daddr为32位的目的地址,而u32 saddr为32位的原地址,tos为协议。

  205行-206行是把目标地址前后字节进行转换。

  207行把原地址与tos进行异或后再与hash异或然后再赋值给hash.

  208行把hash的值向右偏移16位然后与hash异或再赋值给hash.

  209行是此函数返回hash与它本身向右偏移8位的值异或,然后再跟rt_hash_mask进行与操作的值。

  这种攻击是一种较为少见的拒绝服务方式,因为它利用了系统本身的算法中的漏洞。该漏洞也代表了一种新的漏洞发掘的方向,就是针对应用软件或者系统使用的hash算法进行漏洞挖掘。因此,这种针对hash表攻击的方法对不仅对Linux,而且会对很多应用软件产生影响,比如说Perl5在这个perl的版本中使用的hash算法就容易使攻击者利用精心筛选的数据,使用perl5进行编程的应用程序使用的hash表产生hash冲突,包括一些代理服务器软件,甚至一些IDS软件,防火墙等,因使用的是Linux内核都会被此种攻击影响。

  Linux内核中的整数溢出漏洞

  Linux Kernel 2.4 NFSv3 XDR处理器例程远程拒绝服务漏洞在2003年7月29日公布,影响Linux Kernel 2.4.21以下的所有Linux内核版本。

  该漏洞存在于XDR处理器例程中,相关内核源代码文件为nfs3xdr.c. 此漏洞是由于一个整形漏洞引起的(正数/负数不匹配)。攻击者可以构造一个特殊的XDR头(通过设置变量int size为负数)发送给Linux系统即可触发此漏洞。当Linux系统的NFSv3 XDR处理程序收到这个被特殊构造的包时,程序中的检测语句会错误地判断包的大小,从而在内核中拷贝巨大的内存,导致内核数据被破坏,致使Linux系统崩溃。

  漏洞代码:

static inline u32 *
  
  decode_fh(u32 *p, struct svc_fh *fhp)
  
  {
  
  int size;
  
  fh_init(fhp, NFS3_FHSIZE);
  
  size = ntohl(*p++);
  
  if (size > NFS3_FHSIZE)
  
  return NULL;
  
  memcpy(&fhp->fh_handle.fh_base, p, size); fhp->fh_handle.fh_size = size;
  
  return p + XDR_QUADLEN(size);
  
  }


  因为此内存拷贝时在内核内存区域中进行,会破坏内核中的数据导致内核崩溃,所以此漏洞并没有证实可以用来远程获取权限,而且利用此漏洞时攻击者必须可以mount此系统上的目录,更为利用此漏洞增加了困难。

  我们的目的在于通过这个漏洞的特点来寻找此种类型的漏洞并更好地修补它。大家可以看到,该漏洞是一个非常典型的整数溢出漏洞,如果在内核中存在这样的漏洞是非常危险的。所以Linux的内核开发人员对Linux内核中关于数据大小的变量都作了处理(使用了unsigned int),这样就避免了再次出现这种典型的整数溢出。通过对这种特别典型的漏洞原理进行分析,开发人员可以在以后的开发中避免出现这种漏洞。
3
0
分享到:
评论

相关推荐

    Linux内核漏洞检测与防御2022看雪安全开发者峰会(公

    【标题】"Linux内核漏洞检测与防御2022看雪安全开发者峰会"揭示了在信息安全领域,针对Linux内核的漏洞发现和防护技术是当前的重要议题。看雪安全开发者峰会是一个知名的行业活动,汇聚了众多安全专家和技术爱好者,...

    Linux内核漏洞异步触发模型的安全分析.pdf

    【Linux内核漏洞异步触发模型的安全分析】 随着Linux操作系统在各领域的广泛应用,其安全性问题愈发引起关注。近年来,Linux内核漏洞成为攻击者的主要目标,因为越来越多的防御机制如NX(No eXecute)、ASLR...

    LInux内核精髓-精通Linux内核必会的75个绝技.pdf

    10. **内核安全**:了解Linux内核的安全机制,如SELinux、AppArmor、capabilities等,以及内核漏洞防护策略。 11. **内核调试**:学会使用kgdb、kdb、SystemTap等工具对内核进行调试,以及理解内核打印日志的机制。...

    SLUBStick: 通过 Linux 内核中的跨缓存攻击实现任意内存写入

    SLUBStick 是一种新颖的内核利用技术,旨在通过跨缓存攻击提升 Linux 内核漏洞的利用能力。近年来,Linux 内核中的漏洞数量显著增加,但大多数仅能导致有限的内存破坏,使得实际利用变得困难。SLUBStick 通过多阶段...

    [Linux内核精髓:精通Linux内核必会的75个绝技]---高清版.pdf

    在这本书中所提到的“75个绝技”应该是指一系列实用的技巧和知识点,它们涵盖了从初级到高级的多个层面,帮助读者深入理解Linux内核并能够应用于实际工作中。具体来说,这些绝技可能包括但不限于以下几个方面: 1. ...

    深入理解Linux内核(第三版 中文版).pdf 高清下载

    综上所述,《深入理解Linux内核》这本书提供了对Linux内核全面而深入的解析,涵盖了从内存管理到网络栈,从设备驱动到系统调用等多个方面。对于希望在Linux平台下进行深入开发和研究的读者来说,这是一本不可或缺的...

    Linux内核提权攻击研究.pdf

    Linux内核提权攻击研究 Linux操作系统中,提权攻击是一种重要的攻击手段,针对Linux系统的安全性构成了严重的威胁...Linux内核提权攻击研究是一项非常重要的研究方向,对于保障系统安全性和稳定性具有非常重要的意义。

    Linux内核的漏洞态势感知与预测1

    【Linux内核漏洞态势感知与预测】是针对软件安全领域中的一个重要议题,特别是对于像Linux内核这样广泛应用的基础软件。Linux内核是许多操作系统的核心,它的安全性直接影响到系统的整体稳定性。文章的研究背景在于...

    适用于 x64 计算机的 WSL2 Linux 内核更新包

    Linux内核是Linux操作系统的核心部分,负责管理系统的硬件资源,如处理器、内存和磁盘,以及提供系统调用来供应用程序使用。它是开源的,这意味着任何人都可以查看、修改和分发它的源代码。内核更新通常包含性能优化...

    linux提权工具利用2.6内核漏洞

    标题提及的"linux提权工具利用2.6内核漏洞",指的是利用特定版本的Linux内核——2.6系列中的安全漏洞,来实现权限提升的工具。这个工具名为"wunderbar_emporium-3.tgz",它可能包含了一系列针对2.6内核的提权方法和...

    补丁 重视Linux内核的安全漏洞.pdf

    【Linux内核安全漏洞的重要性】 Linux内核是操作系统的核心,负责管理系统的硬件资源,调度进程,以及提供系统服务。由于其开源性质,Linux受到了全球开发者的广泛贡献和使用,尤其在互联网和企业服务器领域,Linux...

    Linux 内核代码修改

    8. **提交更改**:如果你的修改对社区有贡献价值,可以考虑将它们提交给Linux内核社区。这涉及编写补丁,使用`git format-patch`生成补丁文件,然后通过邮件列表或GitHub Pull Request进行提交。 9. **维护与更新**...

    Linux内核漏洞利用技术:覆写modprobe_path .pdf

    Linux内核漏洞利用技术:覆写modprobe_path 安全架构 安全架构 业务风控 系统安全 APT

    Linux系统内核的沙箱模块实现.pdf

    * Linux内核模块的开发和实现 * 沙箱机制的设计和实现 * 应用程序的隔离和限制 * 系统安全性的增强 * 测试和 debug环境的提供 Linux系统内核的沙箱模块实现是一种强有力的安全机制,能够防止潜在的攻击和入侵,提高...

    浅谈Linux内核的重编译

    Linux内核,作为操作系统的核心,不仅提供了用户程序与硬件之间的桥梁,还支持多任务、虚拟存储、共享库函数等功能,使得Linux成为了一个成熟且稳定的选择。值得注意的是,Linux内核的开放源代码特性,允许全球的...

    LInux内核模块开发

    * 内核模块的安全性问题:内核模块可能存在安全漏洞,影响系统安全。 * 内核模块的维护问题:内核模块需要不断维护和更新,以确保系统的稳定性和安全性。 Linux内核模块开发是一项复杂的技术,它需要深入了解Linux...

    用于x64机器的WSL2 Linux内核更新程序包

    这个“用于x64机器的WSL2 Linux内核更新程序包”正是针对x64架构的Windows系统设计的,旨在为WSL2提供最新的Linux内核更新,以提升性能和兼容性。 WSL2与之前的WSL1相比,最大的改变在于其引入了完整的Linux内核,...

    linux内核技术手册中文版

    Linux内核技术手册中文版是一本专注于Linux操作系统核心部分的手册,为用户提供从获取内核源码、配置内核选项、构建内核以及安装和升级内核的详细步骤。此手册最初是英文版,由G. Kroah-Hartman著,之后授权给中国...

Global site tag (gtag.js) - Google Analytics