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

攻击者通过get_fpxregs可以读取多媒体寄存器至用户空间这样用户就可以取得MXCSR寄存器_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索引和分片重组操作中在今年 5月Rice University计算机科学系Scott A. Crosby和Dan S. Wallach提出了种新低带宽DoS攻击思路方法即针对应用所使用hash算法脆弱性进行攻击这种思路方法提出:如果应用使用hash算法存在弱点也就是说hash算法不能有效地把数据进行散列攻击者就可以通过构造特殊值使hash算法产生冲突引起DoS攻击 202

203 __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 (hash ^ (hash >> 8)) & rt_hash_mask;

210 }





以上代码就是Linux对ip包进行路由或者重组时使用算法此算法由于过于简单而不能把route缓存Cache进行有效散列从而产生了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进行和操作

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

Linux内核中整数溢出漏洞

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

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

漏洞代码: inline u32 *

decode_fh(u32 *p, struct svc_fh *fhp)

{

size;

fh_init(fhp, NFS3_FHSIZE);

size = ntohl(*p);

(size > NFS3_FHSIZE)

NULL;

memcpy(&fhp->fh_handle.fh_base, p, size); fhp->fh_handle.fh_size = size;

p + XDR_QUADLEN(size);

}





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

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

IP地址欺骗类漏洞

由于tcp/ip本身缺陷导致很多操作系统都存在tcp/ip堆栈漏洞使攻击者进行ip地址欺骗非常容易实现Linux也不例外虽然IP地址欺骗不会对Linux服务器本身造成很严重影响但是对很多利用Linux为操作系统防火墙和IDS产品来说这个漏洞却是致命

IP地址欺骗是很多攻击基础的所以使用这个思路方法IP自身缺点IP协议依据IP头中地址项来发送IP数据包如果目地址是本地网络内地址该IP包就被直接发送到目如果目地址不在本地网络内该IP包就会被发送到网关再由网关决定将其发送到何处这是IP路由IP包思路方法IP路由IP包时对IP头中提供IP源地址不做任何检查认为IP头中IP源地址即为发送该包机器IP地址当接收到该包主机要和源主机进行通信时它以接收到IP包IP头中IP源地址作为其发送IP包地址来和源主机进行数据通信IP这种数据通信方式虽然非常简单和高效但它同时也是IP个安全隐患很多网络安全事故都是由IP这个缺点而引发

黑客或入侵者利用伪造IP发送地址产生虚假数据分组乔装成来自内部站分组过滤器这种类型攻击是非常危险有关涉及到分组真正是内部还是外部分组被包装得看起来像内部分组种种迹象都已丧失殆尽只要系统发现发送地址在自己范围的内就把该分组按内部通信对待并让其通过

通常主机A和主机BTCP连接是通过主机A向主机B提出请求建立起来而其间A和B确认仅仅根据由主机A产生并经主机B验证序列号ISN.具体分 3个步骤

主机A产生它ISN传送给主机B请求建立连接;B接收到来自A带有SYN标志ISN后将自己本身ISN连同应答信息ACK同返回给A;A再将B传送来ISN及应答信息ACK返回给B.至此正常情况下主机A和BTCP连接就建立起来了

B —— SYN ——> A

B <—— SYN+ACK —— A

B —— ACK ——> A

假设C企图攻击AA和B是相互信任如果C已经知道了被A信任B那么就要想办法使得B网络功能瘫痪防止别东西干扰自己攻击在这里普遍使用是SYN flood.攻击者向被攻击主机发送许多TCP- SYN包这些TCP-SYN包源地址并不是攻击者所在主机IP地址而是攻击者自己填入IP地址

当被攻击主机接收到攻击者发送来TCP-SYN包后会为个TCP连接分配资源并且会以接收到数据包中源地址(即攻击者自己伪造IP地址)为目地址向目主机发送TCP-(SYN+ACK)应答包由于攻击者自己伪造IP地址定是精心选择不存在地址所以被攻击主机永远也不可能收到它发送出去TCP-(SYN+ACK)包应答包因而被攻击主机TCP状态机处于等待状态

如果被攻击主机TCP状态机有超时控制直到超时为该连接分配资源才会被回收因此如果攻击者向被攻击主机发送足够多TCP-SYN包并且足够快被攻击主机TCP模块肯定会无法为新TCP连接分配到系统资源而处于服务拒绝状态即使被攻击主机所在网络管理员监听到了攻击者数据包也无法依据IP头源地址信息判定攻击者是谁

当B网络功能暂时瘫痪时 C必须想方设法确定A当前ISN.首先连向25端口SMTP是没有安全校验机制和前面类似不过这次需要记录AISN以及C到A大致RTT(round trip time)这个步骤要重复多次以便求出RTT平均值旦C知道了AISN基值和增加规律就可以计算出从C到A需要RTT/2 时间然后立即进入攻击否则在这的间有其他主机和A连接ISN将比预料

C向A发送带有SYN标志数据段请求连接只是信源IP改成了B.A向B回送SYN+ACK数据段B已经无法响应BTCP层只是简单地丢弃A回送数据段这个时候C需要暂停小会儿让A有足够时间发送SYN+ACKC看不到这个包然后C再次伪装成B向A发送ACK此时发送数据段带有C预测AISN+1.如果预测准确连接建立数据传送开始

问题在于即使连接建立A仍然会向B发送数据而不是CC仍然无法看到A发往B数据段C必须蒙着头按照协议标准假冒B向A发送命令于是攻击完成如果预测不准确A将发送个带有RST标志数据段异常终止连接C只有从头再来随着不断地纠正预测ISN攻击者最终会和目标主机建立个会晤通过这种方式攻击者以合法用户身份登录到目标主机而不需进确认如果反复试验使得目标主机能够接收对网络ROOT登录那么就可以完全控制整个网络

C(B) —— SYN ——> A

B <—— SYN+ACK —— A

C(B) —— ACK ——> A

C(B) —— PSH ——> A

IP欺骗攻击利用了RPC服务器仅仅依赖于信源IP地址进行安全校验特性攻击最困难地方在于预测AISN.攻击难度比较大但成功可能性也很大C必须精确地预见可能从A发往B信息以及A期待来自B什么应答信息这要求攻击者对协议本身相当熟悉同时需要明白这种攻击根本不可能在交互状态下完成必须写完成当然在准备阶段可以用netxray的类工具进行协议分析

总 结

通过分析上面几个漏洞大家也可以看到Linux并不是完美还有很多地方需要完善有些漏洞极大地影响了Linux推广和使用例如上面那个Linux hash表冲突漏洞些IDS厂商和防火墙厂商就是基于Linux内核来开发自己产品如果还是使用Linux本身hash算法就会受到这种漏洞影响极易被攻击者进行DoS攻击防火墙、IDS本身就是安全产品如果它们被攻击就会使用户产生极大损失所以我们需要对这些漏洞进行跟踪分析并通过了解它们特性以避免在系统中再次产生这些类型漏洞通过对这些类型漏洞进行预测挖掘使我们能积极地防御黑客攻击破坏

Tags:  linux内核编译 深入理解linux内核 linux内核 linux内核漏洞

延伸阅读

最新评论

发表评论