know是什么意思w在线翻译读音例句-蒙古人种


2023年4月5日发(作者:推销的技巧)

___________________________

收稿日期:2008-07-25

作者简介:李晨曦(1980-),男,西南民族大学管理学院教师.

文章编号:1003-2843(2008)05-1073-04

Linux内核级exploit原理及应用

李晨曦1,周绍军2

(西南民族大学管理学院,四川成都610041;2.四川水利职业技术学院,四川都江堰611830)

摘要:本文主要分析内核级exploit和应用层的exploit不同之处,详细阐述了内核缓冲区溢出(kernelBOF)、内核格

式化字符串漏洞(kernelformatstringvul)、内核整型溢出漏洞(kernelintegeroverflow)、内核kfree()参数腐败(kernelkfree

parametercorruption)、内核编程逻辑错误(kernelprogramlogicerror)的原理.

关键词:内核;漏洞;开发

中图分类号:TP311文献标识码:A

1引言

应用层exploit技术是内核级exploit技术的基础.首先需要了解linux内核和x86的保护模式及中断函数的

进入和返回过程,在保护模式下INT指令对不同优先级之间的控制转移,从TSS(任务状态段)中获取高优先

级的核心堆栈信息(SS和ESP),把低优先级堆栈信息(SS和ESP)保留到高优先级堆栈(即核心栈)中[1],把

EFLAGS,外层CS,EIP推入高优先级堆栈(核心栈)中,通过IDT加载CS,EIP(控制转移至中断处理函数),在

iret返回时候假如NT=1的话,IRET指令就反转CALL或者INT的操作,这样引起一次任务切换.这时候执行

IRET的指令代码,更新之后放在任务状态段内[2-4].然后需要掌握核心堆栈指针ESP和进程内核task的关系,每

个进程在内核中有个内核堆栈,共占2页,也就是8192冬夜读书示子聿八首 个字节,在这堆栈底部,是该进程的structtask_struct结

构.所以在内核中使用current就可以访问到该进程的structtask_struct.接下来了解进程内核路径也是必要的,

一条内核控制路径由运行在内核态的指令序列组成,这些指令处理一个中断或者一个异常.当进程发出一个系

统调用的请求时,由应用态切换到内核态.这样的内核控制路径被成为进程内核路径,也叫进程上下文.当

CPU执行一个与中断有关的内核控制路径的时候,被成为中断上下文.最后需要掌握CPU的所处路径,CPU路

径包括处理硬件中断(此时不跟任何进程相关联)、处理软中断(softirqs),tasktets和BH,不跟任何进程相关联、

运行在内核空间(进程内核路径),关联着一个进程、运行着用户空间的一个进程[1-6].

2两种技术异同点

系统脆弱性:内核级exploit和应用层的exploit有相同点,应用层缺陷在内核层也是缺陷.漏洞分类:应用

层漏洞与内核漏洞基本相同.

内核级exploit在Ring0,应用层作用于Ring3.可发挥的空间内核级expoit相对应用层exploit(4G内存空

间)小很多.内核级exploit研究难度相当大,同时可参考资料很少.

3内核级exploit原理

3.1内核缓冲区溢出

首先找retloc的地址,该地址用于程序的流程,就缓冲区溢出来说,就说找到函数的返回地址.写程序

第34卷1074西南民族大学学报自然科学版___________________________________________________________________

ker_bof用于测试,主要函数如下:

asmlinkageinttest(unsignedintlen,char*code){charbuf[256];memcpy(buf,code,len);};asmlinkageint

new_function(unsignedintlen,char*buf){char*code=kmalloc(len,GFP_KERNEL);if(code==NULL)goto

out;if(copy_from_user(code,buf,len))gotoout;test(len,code);out:return0;};intinit_module(void){old_function=

sys_call_table[__NR_function];sys_call_table[__NR_function]伯牙绝弦教案设计 =new_function;printk(\"<\");

return0;}voidcleanup_module(void){sys_call_table[__NR_function]=old_function;printk(\"<1>kboftest

<\");}.用溢出程序确定RETLOC的地址:staticinline_syscall2(int,new_function,unsignedint,len,char

*,code);intmain(intargc,char**argv){charcode[1024];unsignedintlen;memset(code,\'A\',1024);len=1024;

new_function(len,code);system(\"/bin/sh\");}运行ker_bof,发生了段错误,虽然非法指令出现在内核中,但引起该非

法操作的路径是进程内核路径,未发生系统崩溃.溢出点分析使用objdump查看ker_bof汇编代码57push%edi;

56push%esi从上面可以看到:可以覆盖到EIP,EBP.却不能修改ESP.调用函数new_function栈帧,被调用函数

栈帧ESI=-ebp+s+4,找到retloc:code[256+8+4],修改测试代码查看得到retloc地址正确.

其次,确定retaddr的地址,知道保护模式下是开启了页表机制的,一个地址要想能被访问到而不产生页错

误的话,那么需要由页表来映射该地址.当由一个软中断陷入到内核中去的话,原来应用层的页表映射是不会

被清除的(其实内核自己也要使用那些页表来访问用户空间的数据,还记得copy_from_user这些函数吧),并且

又加上了内核地址空间的映射.所以,可以用应用层的地址就可以了,内核也可以正确寻址.这样shellcode也就

很容易得到了,shellcode的地址可以从应用层得到.

Shellcode功能:因为漏洞发生是在内核进程路径上,所以能够利用ESP

和当前TASK的关系,来使自己的

进程的UID变为0.使得变成ROOT权限周朝 ,从而权限得到提升.

内核态返回到应用态得到了控制权后,运行SHELLCODE代码,必须让中断调用返回,这样系统才不至于

崩溃掉.

3.2内核格式化字符串漏洞

首先看kernel的printf()系列函数是否支持%n.不支持的情况下,即使系统内核中存在这样的漏洞的话,最

多能使内核的信息泄露,或者也许可以把内核弄崩溃掉.不过也许在特定的条件下还是值得去研究的.确定

RETLOC的地址,写ker_format测试程序,其中snprintf(buffer,len,code)为字符串函数.覆盖函数返回地址是一般

应用层方法.但是在kernel要想利用这种方法的有一定难度.因为调试内核就比较困难,无法预知内核中ESP

的值,也就没法覆盖函数的返回地址,所以需要寻找另外的RETLOC地址.在head中找sys_call_table符号又是

在/porc/ksyms的,而且又是普通用户可读的,所以就可以得到这个调用表的地址了[LCX@redhat73alert7]$cat

/proc/ksyms|grepsys_call_tablec02c209csys_call_table_Rdfdb18bd找一个在系统调用表里不使用的系统调用,选

择241这个系统调用.然后把sys_call_table+241*4的地址上填上

SHELLCODE的地址.最后内核态返回到应用

态.在这里考虑SHELLCODE地址过大的问题,从mmap()系统调用void*mmap(void*start,size_tlength,

intprot,intflags,intfd,off_toffset);看,再修改ld的连接脚本,默认的连接脚本是把地址分配到0x08048000.

3.3内核整型溢出漏洞

现在上面两种漏洞在内核中是很少见的.整数溢出就是有符号数和无符号数的烂用,导致可绕过一些检查.

Kernel2.2和几个2.4.x版本的linux/kernel/sysctl.c:sysctl_string()函数中就存在这样的错误.同样构造ker_integer

测试程序.唯一需要注意的技术细节在于当传个负数len进来的话,就可以绕过if(len>256)len=256;的检查,

从而在strncpy_from_user的时候把它当成无符号处理的话,len的值就会变的很大.其他基本同以上的技术处理

相同.

2012-05-16

2012-05-16

2012-05-16

2012-05-16

2012-05-16

2012-05-16

1075

第5期___________________________________________________________________李晨曦等:Linux内核级exploit原理及应用

3.4内核kfree()参数腐败

内核中kfree()参数腐败应用,首先看kfree()函数中是如何用一个值得到另一个值,变量之间的关系.static

inlinevoid__kmem_cache_free(kmem_cache_t*cachep,void*objp){#ifdefCONFIG_SMP;cpucache_t*cc=

cc_data(cachep);CHECK_PAGE(virt_to_page(objp));if(cc){intbatchcount;if(cc->availlimit)

{STATS_INC_FREEHIT(cachep);cc_entry(cc)[cc->avail++]=objp;return;}分析加粗程序代码,假如现在kfree的

地址为addr,那么:temp1=mem_map+(((unsignedlong)addr-PAGE_OFFSET)>>PAGE_SHIFT)c=((kmem_cache_t

*)(temp1)->);cc=春风吹又生上一句 c->cpudata[0];

要确保(cc->availlimit)(((cpucache_t*)(cc))+1)[cc->avail++]=addr;来看看具体变量跟变量的数值关系c=

mem_map+(((unsignedlong)addr-PAGE_OFFSET)>>PAGE_SHIFT)

cc=(c+116)要确保(cc)<(cc+4);(cc+8)=addr;从上面一些关系来看,C的地址只能是mem_map---mem_map+0x3ffffc,

也就是0xc032e2f0到0xC072E2EC之间.很显然,这些地址都不是所能控制的.既然C是所控制不了的,那么

下面的几个变量(依靠C)更是控制不了的.得出kfree()参数腐败在该原理分析下是不可用作攻击漏洞的.

3.5内核编程逻辑错误

内核代码相当的多,出现问题是难免的.将逻辑错误划分到内核编程逻辑错误也是勉强可以的.ker纪念屈原的诗句 nel2.4.9

之前的ptrace系统调用的漏洞属于这个类型.BUGTRAQID为6115的漏洞报告,kernel2.身无彩凤双飞翼的全诗意思 4.x都存在的问题.

“Linux内核不正确处理系统调用的TF标记,本地攻击者利用这个漏洞可以进行拒绝服务攻击.如果系统调用

TF标记设置的情况下,可导致内核停止响应,攻击者利用这个漏洞通过执行调用了TF标记系统调用的恶意应

用程序,可使Linux内核挂起,需要重新启动获得正常功能.”『1』其实这是调用门处理代码处理不当导致的,linux

为了兼容惜春郎 幽幽茉莉香 ,保留了两个系统调用门.一个lcall7,一个lcall27,在两个处理函数里处理EFLAGS的NT和TF标志不

当,导致系统崩溃.报告同时也给出了一个exploit

#defineMSUX\"mov$0x100,%eaxnpushl%eaxnmov$0x1,%eaxnpopflnlcall$7,$0\"

在redhat7.3默认安装的系统上没有使系统挂起.修改为如下代码,测试程序,系统立刻崩溃掉了.//int

NT_MASK=0x00004000;intmain(void){__asm__(\"mov$0x00004000,%eax#设置NT标志pushl%eax

popfllcall$7,$0\");return1;}

查看KERNEL的SRC,内核代码的处断门部分和处理调用门部分对EFLAGS的处理基本相同,但为什么单

是利用调用门的时候才会使系统崩溃呢?这就需要对x86的保护模式有所了解.“一但特权级别及栈已被切换,

如果需要,中断或异常处理的其余部分可继续进行.EFLAGS寄存器压栈,然后将EFLAGS寄存器的NT及TF

位置=0表示处理程序不允许单步执行.NT=0表示处理程序返回时,IRET返回到同一任务而不是一个嵌套

任务.如果转移是通过一个中断门进行的,则EFLAGS中的IF位也被置为0,使得进入处理程序后,INTR中被

屏蔽,如果转移是通过一个陷阱门进行的,则IF位保持不变”[1]而通过调用门进来的,EFLAGS的NT,TF都不会

改变.明白了这些,只要在应用层为EFLAGS设置NT位为1,那么又lcall调用门进入的内核后NT位还是为1,

所以当由内核返回到应用态执行IRET指令时,处理器会认为该任务是个嵌套任务,所以将进行任务切换,从当

前TSS中取出要返回到的任务.而实际上根本就不是嵌套的任务,所以将会系统崩溃.上面报告上说的设置TF

为1,从原理上也应该会使系统挂起.

4总结与推论

通过以上阐述了解内核级exploit和应用层的exploit不同之处,内核缓冲区溢出(kernelBOF)、内核格式

化字符串漏洞(kernelformatstringvul)、内核整型溢出漏洞(kernelintegeroverflow)、内核kfree()参数腐败(kernel

kfreeparametercorruption)、内核编程逻辑错误(kernelprogramlogicerror)的原理.同时发现有部分漏洞应用的

2012-05-16

2012-05-16

2012-05-16

2012-05-16

2012-05-16

2012-05-16

第34卷1076西南民族大学学报自然科学版___________________________________________________________________

难度很大,还有待继续研究.特别是内核kfree()参数腐败的应用.

参考文献:

[1]周明德.保护方式下的80386及其编程[M],北京:电子工业出版社,2005.

[2]李革梅.嵌入式linux操作系统裁剪和定制研究[D].太原:中北大学,2005.

[3]薛筱宇.基于linux内核的操作系统实验系统[D].成都:西南交通大学,2003.

[4]曹云鹏.关于linux操作系统安全问题的研究[D].济南:山东科技大学,2005.

[5]牛玲.基于linux内核的嵌入式USB接口的加密研究[D].成都:成都理工大学,2005.

[6]何昀峰.一种通用的操作系统安全增强技术的设计与实现[D].北京:中国科学院研究生院(软件研究所).2005.

ThethoeryandapplicationofLinuxkernelanditsexploitation

LIChen-xi1,ZHOUShao-jun2

(estUniversityforNationalities,Chengdu610041,P.R.C.;

nWaterVocational钱塘江大潮什么时候 andTechnicalCollege,Dujiangyan611830,P.R.C.)

Abstract:Thedisquisitionanalysesthedifferencebetweenthekernelexploitationandapplicationexpoitation,expatiatesthe

theoryaboutkernelBOF,kernelformatstringvul,k小学生硬笔书法比赛作品 ernelintegeroverflow,kernelkfreeparametercorruption,andkernel

programlogicerrordetailedly.

Keywords:kernel;hole;exploitation

2012-05-16

2012-05-16

2012-0国庆节手抄报内容文字简单 5-16

2012-05-16

2012-05-16

2012-05-16

专业推荐

精品文档

更多推荐

exploit是什么意思loit的用法读音典