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
*,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->avail
{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->avail
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的用法读音典
发布评论