首页
社区
课程
招聘
[原创]CVE-2017-10661 原理,触发分析
发表于: 2017-8-18 16:17 10158

[原创]CVE-2017-10661 原理,触发分析

2017-8-18 16:17
10158

前言:

    最近分析了 CVE-2017-10661 这个漏洞,不过没有找到什么可以利用的点。把分析过程拿出来分享下。



首先看看官方的修补代码:

上面是官方的修补代码, 可以很直观的看到,修补代码主要做了几件事

首先在结构体里面添加了一个锁的成员变量,

然后在代码中上了锁

从这两个结论,首先就可以基本推论出来,这个漏洞应该是多线程并行,导致出来的问题。


接着继续分析修补代码,我们发现上锁的代码主要在 一下代码

     

这样看不太方便,感觉有点混乱,我把这个函数从源码中找出来了

static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags)

{

+ spin_lock(&ctx->cancel_lock);

if (ctx->clockid == CLOCK_REALTIME && (flags & TFD_TIMER_ABSTIME) &&

   (flags & TFD_TIMER_CANCEL_ON_SET)) {

if (!ctx->might_cancel) {

ctx->might_cancel = true;

spin_lock(&cancel_lock);

list_add_rcu(&ctx->clist, &cancel_list);

spin_unlock(&cancel_lock);

}

} else if (ctx->might_cancel) {

timerfd_remove_cancel(ctx);

}

+ spin_unlock(&ctx->cancel_lock);

}

static void timerfd_remove_cancel(struct timerfd_ctx *ctx)

{

if (ctx->might_cancel) {

ctx->might_cancel = false;

spin_lock(&cancel_lock);

list_del_rcu(&ctx->clist);

spin_unlock(&cancel_lock);

}

}

结合两段代码,我们可以看到 主要是给中间的这一段代码上了锁。

那么主要问题就是出现在这一段代码当中了。

这两条分支

上面是链表添加结点

下面是移除

两条路线分支主要是 ctx->might_cancel 这个成员变量判断的

然后这个变量,我们发现,他是会在分支的运行过程里面修改的 蓝色的标记代码就是修改的地点


那么我们根据上面得到的信息,可以得到一个假设 如果两条线程同时运行这一段代码

线程1 删除了结点  并且 ctx->might_cancel = false;

      那么他下次再运行的到这里的时候

} else if (ctx->might_cancel) { //ctx->might_cancel == false

timerfd_remove_cancel(ctx);

}

           这个条件就不会成立,那么就不会运行 timerfd_remove_cancel 函数

           以上是正常情况,现在我们假设一中特殊情况

           线程1 第二次执行到 else if (ctx->might_cancel) 这里的时候,CPU进行切换,切换到线程2执行

线程2  走上面分支

if (ctx->clockid == CLOCK_REALTIME && (flags & TFD_TIMER_ABSTIME) &&

    (flags & TFD_TIMER_CANCEL_ON_SET)) {

if (!ctx->might_cancel) {

ctx->might_cancel = true;

         设置了 ctx->might_cancel = true; 然后CPU继续执行线程1


现在   ctx->might_cancel 被线程2修改成了 true 又会执行 timerfd_remove_cancel

} else if (ctx->might_cancel) { 

timerfd_remove_cancel(ctx);

}

那么现在 timerfd_remove_cancel(ctx); 删除了两次结点 这就是漏洞的产生原理。


利用:

   如果猜测是对的,那么我们创建两条线程, 一条循环执行删除操作,一个执行添加操作,就会触发到漏洞。

   测试过后,成功触发了漏洞。



注:看了下代码本身流程,这里删除结点,只是想 节点的  上下两个点的指向修改了下。

    崩溃的主要原因是因为,entry->prev = LIST_POISON2;  这里执行到第二次的时候 尝试在LIST_POISON2 写入内容,导致了崩溃。


测试机器:

nexus5  5.0  hammerhead-lrx21o-factory-56a09d43 版本


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持,论坛里关于漏洞的分析还比较少。
2017-8-21 09:33
0
雪    币: 0
活跃值: (878)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
Mark    等能看的懂漏洞分析了  再回来      感谢分享   
2017-8-21 11:30
0
雪    币: 3
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持,论坛里都是脱壳类的文章,这种文章越多越好
2017-8-24 00:20
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
Zkeleven 支持,论坛里关于漏洞的分析还比较少。
感觉支持~
2017-8-24 11:32
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
tangsilian Mark 等能看的懂漏洞分析了 再回来 感谢分享
感觉支持~
2017-8-24 11:32
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
fengwuhui 支持,论坛里都是脱壳类的文章,这种文章越多越好
感觉支持~
2017-8-24 11:33
0
雪    币: 27
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看到LIST_POISON2我想到了CVE-2015-3636
最近刚刚学习完CVE-2017-7308,打算接下来找这个新漏洞学习一下,支持楼主~
2017-10-16 15:30
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持~  最近也在学习挖洞
2017-10-17 22:02
0
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
zfzfso 看到LIST_POISON2我想到了CVE-2015-3636 最近刚刚学习完CVE-2017-7308,打算接下来找这个新漏洞学习一下,支持楼主~
楼主有没有写出来3636的exp哇。
2017-10-31 14:44
0
雪    币: 1395
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
支持一下,
2017-10-31 18:12
0
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
66666
2017-12-15 14:34
0
游客
登录 | 注册 方可回帖
返回
//