免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2477 | 回复: 14
打印 上一主题 下一主题

[内核入门] 对一个漏洞的解释 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-20 13:07 |只看该作者 |倒序浏览
本帖最后由 willcream 于 2015-09-20 13:16 编辑

最近在学习kernel的一个bug,但看了很久还是没理解到时如何利用这个bug的,希望有人能帮助解释一下。多谢了......
  1. /*
  2. * pwned.c - linux 2.4 and 2.6 sys_uselib local root exploit. PRIVATE.
  3. * it's not the best one, the ldt approach is definitively better.
  4. * discovered may 2004. no longer private because lorian/cliph/ihaquer
  5. * can lick my balls.
  6. * (c) 2004 sd <sd@fucksheep.org>
  7. * requieres cca 1gb on fs.
  8. */


  9. /*
  10. * first create fake vma structs.
  11. *
  12. *
  13. * let's have 3 threads, t1, t2 and t3.
  14. * t1 and t2 have common vm.
  15. *
  16. * t3:
  17. * - wait4sig (will come back from t2)
  18. * - write(fd3, bigmem, bigfile_size)
  19. * - exit()
  20. * t1:
  21. * - fd3 = empty file
  22. * - fd1 = bigfile, writing it took 16 secs
  23. * - bigmem = mmap(NULL, bigfile_size, fd1, 0);
  24. * - t3 = fork()
  25. * - t2 = clone()
  26. * - fd2 = munmap_file, size of ram.
  27. * - mumem = mmap(NULL, munmap_file_size, fd2)
  28. * - mmap(mumem, 4096, ANONYMOUS) // for extending do_brk check
  29. * - mmap lots of vmas
  30. * - close(fd2);
  31. * - create evil lib
  32. * - free lot of vmas
  33. * - sig @ t2
  34. * - evil_lib->do_munmap(mumem + 4096, munmap_file_size - 4096);
  35. * - sem = 1
  36. * - waitpid
  37. * t2:
  38. * - wait4sig
  39. * - sleep(100msec)
  40. * - mmap(mumem, fd3, 4096) // this is being protected by i_sem !
  41. * - sendsig @ t3
  42. * - sleep(100msec)
  43. * - if (sem) error
  44. * - msync(mumem, 8192) - will wait for write() to finish. munmap finishes by that
  45. * time
  46. * - if (!sem) error
  47. * - if it does return we failed, otherwise shell.
  48. *
  49. */
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-09-21 16:54 |只看该作者
use_lib,估计是这个(CAN-2004-1235)
http://www.opennet.ru/base/linux/1105378708_2990.txt.html

论坛徽章:
0
3 [报告]
发表于 2015-09-21 21:09 |只看该作者
回复 2# nswcfd

Get, thx~~~

   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-09-22 09:53 |只看该作者
回复 3# willcream

其实我也没有搞清楚攻击原理,如果你弄明白了,还请分享一下。

从那个link上看,uselib的实现在do_brk阶段没有mm->mmap_sem的保护,会导致新建的vma被插入到rb-tree错误的位置上。

问题1:基于错误的rb-tree,权限提升是怎么实现的?(ps,进程的权限跟vma有什么关系?)

问题2:shellcode是怎么注入的?这里有缓冲区溢出的bug么?fakevm起到了什么作用?
   

论坛徽章:
0
5 [报告]
发表于 2015-10-24 21:43 |只看该作者
回复 4# nswcfd
Hello, 我大致学习了一下,它把shell code放在了msync_interval函数中的fsync函数指针所指向的地方,这样在msync_interval中解引用fsync函数指针的时候err = file->f_op->fsync(file, file->f_dentry, 1);就注入了shell code了。
但是我还是没看懂msync_interval是如何获得fake vma的,还希望与你共同探讨下。


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
6 [报告]
发表于 2015-10-26 19:21 |只看该作者
回复 5# willcream
时间有点长了,找不到exploit代码了,方便给个链接么?


   

论坛徽章:
0
7 [报告]
发表于 2015-10-28 00:05 |只看该作者
回复 6# nswcfd


    您好,我的权限发不了链接,我试了下,百度或者Google “Linux Kernel 2.4.x / 2.6.x - uselib() Local Privilege Escalation Exploit”  第一个便就是了。
    关于这个exploit的信息非常非常少,几乎没有。我跟好友研究了很久又没能看出来原理....如果方便的话我们可以互留联系方式,闲暇之余一起把它探讨出来。现在只有一点小头绪,但核心部分还是不理解。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 2015-10-30 16:44 |只看该作者
回复 7# willcream
好的,联系方式已经私信,欢迎交流。


   

论坛徽章:
0
9 [报告]
发表于 2015-10-30 16:47 |只看该作者
回复 8# nswcfd

您好,我已经发送请求到你qq号了(nswcfd)
   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
10 [报告]
发表于 2015-11-04 18:41 |只看该作者
回复 9# willcream

https://bitbucket.org/bbarg/kern ... 09/msync/?at=master

pwned.c有些复杂,不太好理解。

相对的,msync-sleep.c作为一个简化,可以用来理解exploit的基本过程。

1. makelib生成lib image,注意elf header指出,Lib要加载到vaddr 0xaabbccdd(忽略对齐问题),占据2个page。

2. buildfake,把用户态的一个page映射到0x00000000,这个page里包含dentry\inode\address_space等结构。
其中fake_inode的i_ino为0xf0000ba22,隶属于fake_mapping,这个mapping有一个fake_dirty_page。

背景:每个inode有自己的addrss_space(mapping),所有用于此inode(文件)的page cache关联同一个addrss_space。
mapping->dirty_pages记录page cache中dirty的页面,必要的时候(pdflush或者msync被调用?)通过write_page接口(这里是evil_writepage)写回到文件。

3. 创建一个page的文件(unmapfile),mmap到0xaabbccdd + PAGE,即lib加载空间的后半部分。

4. 启动msync线程,等等主线程的start信号。

5. 主线程发动信号,uselib(主线程)和msync(子线程)同时运行,产生对mm->mmap_sem的竞争,触发bug条件。

6. 为了便于复现(模拟竞争条件),bbarg(链接的主人)在内核里加入了几个延迟:

a. mm/filemap.c: 在msync里,引用file->fop->fsync之前加入了2秒的延迟,可以看作对inode->sem的竞争的模拟。
https://bitbucket.org/bbarg/kern ... 3bfd6&at=master

b. mm/mmap.c:do_brk里面,unmap后面加入了10秒的延迟。
https://bitbucket.org/bbarg/kern ... e099d&at=master

7. 在这2s的时间里,虽然msync拿着mm->mmap_sem,由于do_brk(错误的)不遵守lock规则,use_lib可以继续执行。

8. uselib需要加载到0xaaabbccdd所在的2个page,由于后半部分(bss)被unmapfile占用(参见3),brk会把这部分unmap掉。

9. 在unmap的过程中,fput被调用,会把file->f_dentry置为NULL。

10. 在2s~10s的时间窗口里,msync(unmapfile)不知道底层的变化,继续引用2s之前取得的file,通过file->f_dentry->d_inode得到inode。

11. 由于9,这里产生了NULL引用,访问file->f_detnry即访问地址0,而2中已经将地址映射到fake_dentry,进而得到的inode是fake_inode。

12. 继续执行filemap_fdatasync,对dirty页面调用write_page回调,导致evil_writepage被调用,exploit完毕。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP