免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 独孤九贱

新爆内核高危漏洞sock_sendpage的利用分析的讨论 [复制链接]

论坛徽章:
0
发表于 2010-01-15 12:40 |显示全部楼层
原帖由 Godbach 于 2010-1-15 11:01 发表


请教W.Z.T兄,你认为跳转到0地址出执行的函数代码是属于用户空间的代码,还是内核空间的代码。


我的理解是0地址上的代码是由用户自己通过mmap映射的, 当用户进程去触发这个kernel bug的时候, 是通过系统调用进入内核空间,内核通过进程上下文current代表进程继续执行, 当eip执行到了一个0x0地址时, 它开始执行用户空间映射过来的代码, 由于有进程上下文,又是在内核态, 所以可以修改当前进程的任何信息包括内核其他代码。 不知道这样理解对不对?

》昨晚简单验证了一下,kernel_code中添加printf和memset函数,直接把内核的stack搞坏。我用的是虚拟机,系统直接被关掉了。

我觉得内核是不能调用c库的, 你可以自己实现一个类似printk的函数放在kernel code中, 这样应该不会出错, 或者通过/proc/kallsyms先找到printk的地址, 然后再kernel中引用, 不知道这样可不可行, 我没试过, 兄弟可以验证下啊:)

[ 本帖最后由 W.Z.T 于 2010-1-15 12:46 编辑 ]

论坛徽章:
0
发表于 2010-01-15 12:51 |显示全部楼层
原帖由 Godbach 于 2010-1-12 15:38 发表
哪位介绍一下这个漏洞和selinux有什么关系。因为从其中一个简单的测试里程上,看不出来和selinux有关系啊。


我记得有一些兄弟在开启selinux的情况下, 就能溢出成功, 关闭的情况下就不能溢出成功。 好像早期版本的selinux代码允许映射0的地址, 这样sys_mmap2即使不允许映射0地址, 但selinux确让它允许映射,  具体代码没有仔细看过。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-01-15 12:58 |显示全部楼层
我的理解是0地址上的代码是由用户自己通过mmap映射的, 当用户进程去触发这个kernel bug的时候,是通过系统调用进入内核空间,内核通过进程上下文current代表进程继续执行, 当eip执行到了一个0x0地址时,它开始执行用户空间映射过来的代码, 由于有进程上下文,又是在内核态, 所以可以修改当前进程的任何信息包括内核其他代码。 不知道这样理解对不对?

恩,这个地方我理解的也是kernel_code应该算是内核态的代码,不能调用用户空间的库。

我觉得内核是不能调用c库的, 你可以自己实现一个类似printk的函数放在kernel code中, 这样应该不会出错,或者通过/proc/kallsyms先找到printk的地址, 然后再kernel中引用, 不知道这样可不可行, 我没试过,兄弟可以验证下啊:)

你的这个建议不错,将内核态的符号表导出来,然后将该地址转换成函数指针,进行调用。可以试一下。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-01-15 13:00 |显示全部楼层
我记得有一些兄弟在开启selinux的情况下, 就能溢出成功, 关闭的情况下就不能溢出成功。 好像早期版本的selinux代码允许映射0的地址, 这样sys_mmap2即使不允许映射0地址, 但selinux确让它允许映射,  具体代码没有仔细看过。

这个地方和SElinux有一些关系,也就在于SElinux默认又开启了0地址可以被映射。

我测试了就没有安装SElinux模块的系统,也是可以侵入的。不过用的代码是另外一个例程。九贱兄分析的这个exp代码是个简化版的,有一定的局限性。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-01-15 13:48 |显示全部楼层
试验了一把,通过/proc/kallsyms获取到printk的地址,然后就可以在kernel_code中调用了。打印的信息输出到日志里了

论坛徽章:
0
发表于 2010-01-15 14:42 |显示全部楼层
原帖由 Godbach 于 2010-1-15 13:48 发表
试验了一把,通过/proc/kallsyms获取到printk的地址,然后就可以在kernel_code中调用了。打印的信息输出到日志里了


顶, Godbach兄动作果然快, 赞~

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-01-15 15:12 |显示全部楼层
原帖由 W.Z.T 于 2010-1-15 14:42 发表


顶, Godbach兄动作果然快, 赞~


应该多些W.Z.T兄的指点才对。

我用的是另外一个例程,exploit.c中添加
int (*printk)(const char *fmt, ...);

然后获得printk的地址
  1.         printk = (int (*)(const char *fmt, ...))get_kernel_sym("printk");
复制代码

然后就可以调用printk了。

评分

参与人数 1可用积分 +30 收起 理由
T-Bagwell + 30 给分

查看全部评分

论坛徽章:
0
发表于 2010-01-15 15:52 |显示全部楼层
原帖由 Godbach 于 2010-1-15 15:12 发表


应该多些W.Z.T兄的指点才对。

我用的是另外一个例程,exploit.c中添加

然后获得printk的地址
        printk = (int (*)(const char *fmt, ...))get_kernel_sym("printk");
然后就可以调用printk了。


这样其实可以把exp + rootkit一气呵成的写了, 呵呵

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-01-15 16:19 |显示全部楼层
原帖由 W.Z.T 于 2010-1-15 15:52 发表


这样其实可以把exp + rootkit一气呵成的写了, 呵呵

基本上可以调用内核里面所有导出的接口了。刚试了一下kerne_power_off,直接就把系统关机了。

论坛徽章:
0
发表于 2010-01-17 16:42 |显示全部楼层
这个很强悍,很好很强大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP