首页
论坛
课程
招聘
[原创]结合init源码剖析android root提权漏洞(CVE-2010-EASY)
2011-9-4 21:41 16635

[原创]结合init源码剖析android root提权漏洞(CVE-2010-EASY)

2011-9-4 21:41
16635
转载请注明出处:http://hi.baidu.com/androidhacker/blog/item/59faabfda34b71f57709d707.html

这篇文章是上一篇博客的后续分析,主要介绍向init进程发送热拔插信息后init进程的处理流程

首先我们来了解一个数据结构,uevent,如下

struct uevent {                                                                                

    const char *action;                                                                        

    const char *path;                                                                          

    const char *subsystem;                                                                     

    const char *firmware;                                                                      

    int major;                                                                                 

    int minor;                                                                                 

};  


内核收到的信息如下,ACTION=addDEVPATH=/../data/local/tmpSUBSYSTEM=firmwareFIRMWARE=../../../data/local/tmp/hotplug
通过如下函数parse_event进行解析

static void parse_event(const char *msg, struct uevent *uevent) 

{

 

    while(*msg) {                                                                              

        if(!strncmp(msg, "ACTION=", 7)) {                                                      

            msg += 7;                                                                          

            uevent->action = msg;                                                              

        } else if(!strncmp(msg, "DEVPATH=", 8)) {                                              

            msg += 8;                                                                          

            uevent->path = msg;                                                                

        } else if(!strncmp(msg, "SUBSYSTEM=", 10)) {                                           

            msg += 10;                                                                         

            uevent->subsystem = msg;                                                           

        } else if(!strncmp(msg, "FIRMWARE=", 9)) {                                             

            msg += 9;                                                                          

            uevent->firmware = msg;                                                            

        } else if(!strncmp(msg, "MAJOR=", 6)) {                                                

            msg += 6;                                                                          

            uevent->major = atoi(msg);                                                         

        } else if(!strncmp(msg, "MINOR=", 6)) {                                                

            msg += 6;                                                                          

            uevent->minor = atoi(msg);                                                         

        }

         while(*msg++);

    }           

}


经过解析之后,uevent的结构为:
action="add"
path="/../data/local/tmp"
subsystem="firmware"
firmware="../../../data/local/tmp/hotplug"

之后来到处理firmware的核心函数

static void process_firmware_event(struct uevent *uevent)

{

    l = asprintf(&root, SYSFS_PREFIX"%s/", uevent->path);

    //root为/sys/../data/local/tmp/=/data/local/tmp/

    

    l = asprintf(&loading, "%sloading", root);

    //loading为/data/local/tmp/loading

    

    l = asprintf(&data, "%sdata", root);

    //data为/data/local/tmp/data   其内容为指向/proc/sys/kernel/hotplug的符号链接

    

    l = asprintf(&file, FIRMWARE_DIR"/%s", uevent->firmware);

    //file为/etc/firmware/../../../data/local/tmp/hotplug=/data/local/tmp/hotplug

    

    loading_fd = open(loading, O_WRONLY);

    

    data_fd = open(data, O_WRONLY); 

    

    fw_fd = open(file, O_RDONLY);

    

    load_firmware(fw_fd, loading_fd, data_fd);

}


最后来到load_firmware函数,把hotplug中的数据写到/proc/sys/kernel/hotplug中
其内容变为/data/local/tmp/exploid

static int load_firmware(int fw_fd, int loading_fd, int data_fd)

{

    while (len_to_copy > 0) {

        char buf[PAGE_SIZE];

 

 

        nr = read(fw_fd, buf, sizeof(buf));

                                                                         

        len_to_copy -= nr;                                                                     

        while (nr > 0) {                                                                       

                                                                                               

            nw = write(data_fd, buf + nw, nr);                                                 

 

            nr -= nw;

        }

    }

}


终于/proc/sys/kernel/hotplug中写入了我们的恶意程序了,只要再次受到如wifi打开、usb插入等热拔插信息,内核就会以root权限加载我们的程序再一次执行,从而达到提权的目的

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 947
活跃值: 活跃值 (25)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
loongzyd 活跃值 10 2011-9-4 21:51
2
0
支持楼主
雪    币: 321
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pandaforum 活跃值 2011-9-8 16:57
3
0
楼主很专业。
雪    币: 220
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
广海混沌 活跃值 2011-9-9 23:45
4
0
嗯 不得不赞一个
雪    币: 223
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dywenwen 活跃值 2011-9-14 17:24
5
0
支持,好文章
雪    币: 761
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
赤子Anatta 活跃值 2013-1-22 11:18
6
0
很好的东西,不知道现在漏洞修复了否?
雪    币: 1
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
处处潇洒 活跃值 2014-9-28 12:19
7
0
目前rootAndroid4.3系统的方式比较好理解,然后续版本的系统怎么root?求大神指点(PC端工具或Android侧应用、脚本等)
雪    币: 111
活跃值: 活跃值 (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
netsniffer 活跃值 2014-9-29 21:27
8
0
后续都是利用kernel或驱动的漏洞,各种栈溢出、数组越界、mmap漏洞,网上搜搜很多
游客
登录 | 注册 方可回帖
返回