首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>网络安全>文章内容
Linux kernel几个漏洞得简单介绍
来源:vfocus.net 作者:kkqq 发布时间:2004-04-04  

Linux kernel几个漏洞得简单介绍

通过对几个linux kernel漏洞的分析,试图归纳总结linux kernel中的漏洞原理,希望可以对漏洞发掘有些帮助。嗯,写得很简单,也可能有很多错误,请谅解并指出错误:)
ps:其实分析了很多漏洞,但实在是懒得写了。要不是有人逼我,哈哈

前言

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

Linux内核漏洞分析

首先来说明一下这次我们讨论Linux系统安全的范围,其实通常我们所说的Linux是指GNU/Linux系统,Linux是系统中使用的操作系统内核。这一次我们重点从Linux系统内核中存在的几个非常有特点的漏洞来讨论Linux系统的安全性。下面就让我们来看看几个典型的漏洞的介绍分析,然后讨论它们会对使用Linux系统的用户产生什么样的影响。因为这几个漏洞都是非常新颖的概念型漏洞,所以研究它们可以帮助我们更好地分析和预测未来Linux内核中漏洞出现的趋势,并使我们对Linux系统内核中的安全问题做出积极的防御。

1 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; //这里应为unsigned int
fh_init(fhp, NFS3_FHSIZE);
size = ntohl(*p++);
if (size > NFS3_FHSIZE) //这里因为size为负值从而欺骗了这个判断语句
return NULL;

memcpy(&fhp->fh_handle.fh_base, p, size);//这里以size得值进行了内存拷贝
fhp->fh_handle.fh_size = size;
return p + XDR_QUADLEN(size);
}

因为此内存拷贝时在内核内存区域中进行会破坏内核中的数据导致内核崩溃,所以此漏洞并没有证实可以用来远程获取权限,而且利用此漏洞时攻击者必须可以mount此系统上的目录更为利用此漏洞增加了困难。难道说分析此漏洞就毫无意义了吗?其实我们的目的在于通过这个漏洞的特点来寻找此种类类型的漏洞并更好的修补它。大家可以看到该漏洞是一个非常典型的整数溢出漏洞,如果在内核中存在这样的漏洞是非常危险的。所以Linux的内核开发人员对Linux内核中关于数据大小的变量都作了处理(使用了unsigned int)这样就避免了再次出现这种典型的整数溢出。大家可以看到通过对这种特别典型的漏洞原理进行分析,开发人员可以在以后的开发中避免出现这种漏洞。接下来让我们看一种Linux内核算法上出现的漏洞

2 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算法对这些值进行散列,但是如果这些经过特殊构值恰好使hash算法得出的值相同,就可能产生hash冲突。而所谓hash冲突就是许多数值经过某种hash算法运算以后得出的值相同,并且这些值都被储存在同一个hash槽内,这就使hash表变成了链表。而对此hash标的插入操作会从原来的复杂度O(n)变为O(n*n)。这样会巨大的消耗cpu的使用从而产生了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 >> 8)) & 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内核都会被此种攻击影响。


1.3 do_brk()边界检查不充分导致本地权限提升

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 hash表冲突的漏洞,因为一些IDS厂商和防火墙厂商就是基于Linux内核来开发自己的产品,如果还是使用的Linux本身的hash算法就会受到这种漏洞的影响,极易被攻击者DOS,而且因为防火墙,IDS本身就是安全产品,如果它们被攻击就会对用户产生极大的损失。所以我们需要对这些漏洞进行跟踪分析,并通过了解它们的特性以避免在系统中再次产生这些类型的漏洞,还可以对这些类型的漏洞进行预测挖掘是我们能积极的防御黑客的攻击破坏。


 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·一句话木马
·samcrypt.lib简介
·教你轻松查看QQ空间加密后的好友
·web sniffer 在线嗅探/online ht
·SPIKE与Peach Fuzzer相关知识
·asp,php,aspx一句话集合
·Cisco PIX525 配置备忘
·用Iptables+Fedora做ADSL 路由器
·检查 Web 应用安全的几款开源免
·Md5(base64)加密与解密实战
·NT下动态切换进程分析笔记
·风险评估中的渗透测试
  相关文章
·防范DDOS攻击 不一定要求服务器
·Linux内核漏洞浅析
·分布式拒绝服务攻击(tfn2k)攻击
·LAMP 架构服务器性能优化建议
·用PERL实现一个简单的NIDS
·JSP安全编程实例浅析
·用Iptables+Fedora做ADSL 路由器
·用命令行写IPSec(win)
·用IIS建立高安全性Web服务器
·用访问控制列表实现网络单向访问
·国内网络安全风险评估市场与技术
·分布式拒绝攻击(DDOS)软件tfn2k
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved