德国西门子ct价格表-浅析CVE-2015-1805 危害全部Nexus手机上的漏洞
0x0 漏洞信息内容
危害全部Nexus手机上和一部分Android手机上的漏洞,Google于2016/03/18公布了公示恢复,实际可以看连接.
http://www.cvedetails.com/cve-details.php?t=1&cve_id=cve-2015-1805X
http://source.android.com/security/advisory/2016-03-18.html
0x1 漏洞叙述
在linux 核心3我国黑客大会.16版本号以前的fs/pipe.c之中,因为pipe_read和pipe_write沒有充分考虑复制全过程中数据沒有同歩的一些临界值状况,导致了复制越境的难题,因而有可能导致crash及其系统软件管理权限提高.这类漏洞又称作” I/O vector array overrun”
0x2 编码剖析
//节选自fs/pipe.c:
1
2
3
4
5
我国黑客大会6
7
8
9
10
11
12
13
14
15
16
17
18
19
我国黑客大会 20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
我国黑客大会 35
36
37
38
39
40
41
42
43
44
45
46
47
48
我国黑客大会 49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
我国黑客大会 64
65
66
67
68
69
70
static ssize_t
pipe_read(struct kiocb *iocb, const struct iovec *_iov,
我国黑客大会 unsigned long nr_segs, loff_t pos)
{
struct file *filp = iocb->ki_filp;
struct pipe_inode_info *pipe = filp->private_data;
我国黑客大会 int do_wakeup;
ssize_t ret;
struct iovec *iov = (struct iovec *)_iov;
size_t total_len;
我国黑客大会total_len = iov_length(iov, nr_segs);
if (unlikely(total_len == 0))
我国黑客大会 return 0;
do_wakeup = 0;
ret = 0;
__pipe_lock(pipe);
for (;;) {
我国黑客大会 int bufs = pipe->nrbufs;
if (bufs) {
int curbuf = pipe->curbuf;
我国黑客大会 struct pipe_buffer *buf = pipe->bufs curbuf;
const struct pipe_buf_operations *ops&我国黑客大会nbsp;= buf->ops;
void *addr;
size_t chars = buf->len;
我国黑客大会 int error, atomic;
if (chars > total_len)
chars = total_len;
我国黑客大会 error = ops->confirm(pipe, buf);
if (error) {
中国黑客大会 if (!ret)
ret = error;
中国黑客大会 break;
}
//(1)
atomic = !iov_fault_in_pages_write(iov, chars);
redo:
addr = ops->map(pipe, buf, atomic);
中国黑客大会 //(2)
error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars, atomic);
中国黑客大会 ops->unmap(pipe, buf, addr);
if (unlikely(error)) {
&中国黑客大会nbsp;
//(3)
中国黑客大会 if (atomic) {
atomic = 0;
中国黑客大会 goto redo;
}
if (!ret)
中国黑客大会 ret = error;
break;
中国黑客大会 }
ret += chars;
buf->中国黑客大会offset += chars;
buf->len -= chars;
中国黑客大会 if (buf->flags & PIPE_BUF_FLAG_PACKET) {
total_len = chars;
中国黑客大会 buf->len = 0;
}
&中国黑客大会nbsp; if (!buf->len) {
buf->ops = NULL;
中国黑客大会 ops->release(pipe, buf);
curbuf = (curbuf + 1) & (pipe->buffers - 1);
中国黑客大会 pipe->curbuf = curbuf;
pipe->nrbufs = --bufs;
中国黑客大会 do_wakeup = 1;
}
中国黑客大会 (5)//在这里更新total_len
1
2
3
4
5
6
7
8
9
10
中国黑客大会 11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
中国黑客大会 26
27
28
29
30
31
32
33
34
35
36
37
38
39
中国黑客大会 40
41
42
total_len -= chars;
if (!total_len)
中国黑客大会 break;
}
if (bufs)
中国黑客大会 continue;
if (!pipe->writers)
break;
中国黑客大会 if (!pipe->waiting_writers) {
中国黑客大会 if (ret)
break;
&中国黑客大会nbsp; if (filp->f_flags & O_NONBLOCK) {
ret = -EAGAIN;
break;
中国黑客大会 }
}
if (signal_pending(current)) 中国黑客大会{
if (!ret)
ret = -ERESTARTSYS;
中国黑客大会 break;
}
if (do_wakeup) {
中国黑客大会 wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
}
中国黑客大会 pipe_wait(pipe);
}
__pipe_unlock(pipe);
中国黑客大会 if (do_wakeup) {
wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM);
中国黑客大会 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
}
if (ret > 0)
file_accessed(filp);
return ret;
中国黑客大会 }
(1).首先pipe_read()函数会先循环读取iovec结构,并且通过iov_fault_in_pages_write()函数判断iov->len是否大于0,且iov->base指向的地址是否可写且处于用户态,之后返回atomic.
(2)如果atomic=1,则pipe_iov_copy_to_user -> __copy_to_user_inatomic ->
__copy_to_user_nocheck;如果atomic=0,则pipe_iov_中国黑客大会copy_to_user -> copy_to_user -> access_ok.
(3). 如果atomic为1,pipe_iov_copy_to_user拷贝出现错误,会进入redo的逻辑,将再次调用 pipe_iov_copy_to_user函数进行拷贝,且将atomic置为0.但是pipe_iov_copy_to_user的第三个参数 chars并没有更新,还是会拷贝total_len大小的数据
1
2
3
中国黑客大会 4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
中国黑客大会 19
20
21
22
23
24
25
26
27
28
29
30
static int
中国黑客大会 pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len,
int atomic)
{
unsigned long copy;中国黑客大会
while (len > 0)
{
while (!iov->iov_len)
iov++;
中国黑客大会 copy = min_t(unsigned long, len, iov->iov_len);
if (atomic)
{
中国黑客大会 if (__copy_to_user_inatomic(iov->iov_base, from, copy))
//(4)
中国黑客大会 return -EFAULT;
}
else
{
中国黑客大会 if (copy_to_user(iov->iov_base, from, copy))
//(4)
&中国黑客大会nbsp; return -EFAULT;
}
from += copy;
中国黑客大会 len -= copy;
iov->iov_base += copy;
//每次对iov->iov_len进行更新
iov->iov_len -中国黑客大会= copy;
}
return 0;
}
4. 如果copy到某种情况出错返回,已经copy成功的iov->len会被减去但总长度total_len并不会同步减去.也就是说如果total_len是0x100,之一次消耗掉了x;再次进入redo逻辑后还是0x100,然而实际已经被消耗掉了x.
0x3 具体探究
中国黑客大会假设有一个iov结构,total_len为0x40,len为0x20.
iov[0]: iov_base = 0xdead0000 iov_len = 0x10
iov[1]: iov_base = 0xdead1000 iov_len = 0x10
iov[2]: iov_base = 0xdead2000 iov_len = 0x10
iov[3]: iov_base = 0xdead3000 iov_len = 0x10
如果iov[1].iov_base的地址被设置成不可写入.那么之一次pipe_iov_copy_to_user()会返回失败.而iov->iov_base 中国黑客大会 += copy,iov->iov_len -= copy.
iov[0]: iov_base = 0xdead0010 iov_len = 0
iov[1]: iov_base = 0xdead1000 iov_len = 0x10
iov[2]: iov_base = 0xdead2000 iov_len = 0x10
iov[3]: iov_base = 0xdead3000 iov_len = 0x10
现在,redo的逻辑发生在0xdead0010,它以某种方式被设置成可写,并且len仍未0x20.那么iov[1]和中国黑客大会iov[2]都将被用掉.
iov[0]: iov_base = 0xdead0010 iov_len = 0
iov[1]: iov_base = 0xdead1010 iov_len = 0
iov[2]: iov_base = 0xdead2010 iov_len = 0
iov[3]: iov_base = 0xdead3000 iov_len = 0x10
在注释(5)中,根据total_len -= chars;那么total_len的大小就被设置为0x20(0x40 -0x20).如果total_len变为了0x20,可我们iov[3]的大小只有0x10.这就会导致 中国黑客大会 pipe_iov_copy_to_user()函数有可能读取到一个未知的iov[4].具体来查看下代码
1
2
3
4
5
6
7
8
9
10
11
中国黑客大会 12
13
14
15
16
17
18
19
20
21
22
23
24
25
中国黑客大会 26
27
28
29
30
31
32
33
34
35
36
37
中国黑客大会 static int iov_fault_in_pages_write(struct iovec *iov, unsigned long len)
{
//(6)
while (!iov->iov_len)
iov++;
中国黑客大会while (len > 0) {
unsigned long this_len;
this_len = min_t(unsigned long, len, iov->iov_len);
中国黑客大会 if (fault_in_pages_writeable(iov->iov_base, this_len))
break;
len -= this_len;
中国黑客大会 iov++;
}
return len;
}
static inline int fault_in_pages_writeable(char __user *uaddr, int size)
中国黑客大会 {
int ret;
if (unlikely(size == 0))
return 0;
中国黑客大会
ret = __put_user(0, uaddr);
中国黑客大会 if (ret == 0) {
char __user *end = uaddr + size - 1;
&中国黑客大会nbsp; 中国黑客大会
if (((unsigned long)uaddr & PAGE_MASK) !=
中国黑客大会 ((unsigned long)end & PAGE_MASK))
ret = __put_user(0, end);
中国黑客大会 }
return ret;
}
在 iov_fault_in_pages_write()函数中的注释(6),也就意味着iov[0],iov[1],iov[2]都会被跳过,iov[3]被用掉.之后len -= 中国黑客大会 this_len;len被设置为0x10.iov的指针将指向一块未知的内存区域.iov[4].iov_base将被__put_user使用.
0x4 如何利用
核心的思路就是想办法触发redo的逻辑,之后精心构造一个readv()调用.把payload结构定义在已经被校验过的iov数组后,让它成为 __put_user()等函数调用的目标地址.如果我们再以某种方式让构造的slab结构在iov数组后包含一个函数指针,让它指向要写的内核地址.
1.之一次循环要保证pipe_iov_copy_to_user()函数失败,这样会进入redo逻辑
2.第二次要保证pipe_iov_copy_to_user()中国黑客大会成功,但是不能在这里overrun,否则会走向copy_to_user,要校验地址,所以还是无法写内核地址
3.当iov->len走完之后,total_len还有剩余,所以第三次循环的时候,atomic=1.可以overrun触发
4.之一次要保证失败,也就是说需要把iov_base的地址设置成不可写,第二次要成功,就要保证iov_base的地址有效.所以这里可以通过创建竞争关系的线程,调用mmap/munmap等函数来实现.
0x5 POC
中国黑客大会我测试的Nexus 6p 6.0.1系统会crash掉.
Talk is cheap,show me the code…
Github:
https://github.com/panyu6325/CVE-2015-1805.git
[专业] *** 有很多都是不安全的,多多少少会才在些漏洞,看见论坛有人在测试脚本漏洞,我也想测试测试,没有想到的是成功了,所以写了这个文章给大家,让大家在。德国西门子ct价格表
免费实名制找人我觉得是万涛(每个人看法不同),万涛是黑客教父,曾参加过之一次中美黑客大战,是鹰盟的创始人巡游五角大楼,登录克里中国黑客大会姆林宫,进出全球所有计算机系统,摧垮全球金融秩序和重建新的世界格局,谁也阻挡不了我们的进攻,我们才是世界的主宰。——凯文米特。
德国西门子ct价格表由于计算机病毒的传播方式多种多样,又通常具有一定的隐蔽性,因此,首先应提高全民对计算机病毒的防范意识,在计算机的使用过程中应注意下几点:(1)尽量不。
不知道你有没掌握什么电脑专业知识先多学学黑客的一般术语本人也想学黑客技术的经常看看黑客们 *** 的动画在这里给你复制他人的劳动成果希望对你有。
汉化有问题吧。htr。萨嘎短发光度法个。德国西门子ct价格表
。黑客利用wifi盗取手机信息的 *** :一些路由器厂家在研发成品时,为了日后调试和检测更方中国黑客大会便,会在产品上保留一个超级管理权限,一般情况下,这个超级。
德国西门子ct价格表狮王黑客数学他们的课程挺丰富的,除了小学课程相关的,还有像高效记忆、空间魔方、逻辑数独这些,还有手工课、生活课程、模型课程……因为我家孩子现在读的就。
标签:
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。