首页
社区
课程
招聘
[原创]linux内存越界漏洞分析(CVE-2017-7184)
发表于: 2019-4-12 21:03 6558

[原创]linux内存越界漏洞分析(CVE-2017-7184)

2019-4-12 21:03
6558

此漏洞主要利用了Linux内核IPSEC框架中的一个内存越界漏洞,CVE编号是CVE-2017-7184。

ISSEC协议简介:

IPSEC是一个协议组合,它包含AH,SEC,IKE协议,提供对数据包的认证加密工作。

为了更好的理解漏洞成因,下面的几个概念需要简单介绍:

1.SA:SA由spi、ip、安全协议标识(AH或ESP)这三个参数唯一确定。SA定义了ipsec双方的ip地址、ipsec协议、加密算法、密钥、模式、抗重放窗口等

2.AH:AH为ip包提供数据完整性校验和身份认证功能,提供抗重放能力,验证算法由SA指定

3.ESP:ESP为ip数据包提供完整性检查、认证和加密

漏洞主机:Ubuntu 14.04 x86

分析工具:

GDB调试器

qemu虚拟机


从补丁中可以看出,代码增加了对replay_window和bmp_len的长度检测,当replay_window > bmp_len就会退出。

这两个成员都来自同一个结构体:



bmp_len决定了整个结构体的具体大小, replay_window决定了bmp数组的索引范围

通过上述信息可以得知:如果没有对replay_window和bmp做范围检测,就可能出现索引到结构体之外的情况。


问题出现在结构体xfrm_replay_state_esn的eplay_window和bmp上,当我们发送一个XFRM_MSG_NEWAE的消息时,就可以调用xfrm_new_ae函数来更新一个已经存在的SA。

检测函数如下:



可以看到这个函数没有对replay_window做任何检查,所以这个时候就可以控制replay_window超过bmp,这样在后面流程的读写操作中,很可能就会触发越界。

触发越界的函数有两个,和,其中有越界写操作。



这里可以看到,有多处都会触发越界写操作

其中net_seq,replay_esn->seq,replay_esn->replay_window,replay_esn->seq_hi 是我们可控的变量,所以可以通过控制这些变量,让程序执行到我们想要的流程,从而达到越界的目的。

这个函数在xfrm_input中被调用,如果采用IPPROTO_AH协议的话,调用链如下:



通过如下伪代码测试能否成功触发越界写操作:


通过Xshell连接ubuntu虚拟机,在虚拟机窗口输入如下命令开启qemu虚拟机


之后在qemu虚拟机窗口中,进入目录下,执行命令


回到宿主机窗口,进入/home/ichunqiu/linux-4.12目录下,输入命令:gdb vmlinux

然后启动远程调试,输入命令:target remote:1234

首先我们确定的创建,因为我们传入了,所以最终会进入函数,创建结构体

因此,我们需要在以下四个函数处下断点,执行命令如下:


可以看到,这个时候replay_window和bmp_len的大小是一样的,因为这个时候刚创建结构体,并没有绕过验证传入一个大于 bmp_len的replay_window。

另外根据我们前面的分析,在add_sa的过程中会有两次检测,这两次检测都无法绕过,所以在add_sa的整个过程中,xfrm_replay_state_esn结构体并不会出错。

继续输入命令c,第三次中断来到调用xfrm_replay_verify_len函数的位置

通过对这个函数的调试分析可以知道,没有对replay_window和bmp_len的大小进行检测,导致我们可以传入一个比bmp_len大的replay_window


通过上面的分析我们可以知道,内核的流程为:xfrm_add_sa -> xfrm_new_ae -> xfrm_replay_advance_esn,所以我们这里直接定位到xfrm_replay_advance_esn,因为如果成功更改了replay_window,在这个函数中一定是已经更新过后的xfrm_replay_state_esn。


我们继续输入命令c,中断到如下位置

这里可以看到,replay_window的值0xc01已经远远大于bmp_len的值0x24了。


继续执行命令n,来到第536行的位置

接下来在net/xfrm/xfrm_replay.c:541位置处下断点,执行命令b net/xfrm/xfrm_replay.c:541,然后输入命令c使程序运行到该位置。


这个时候已经清零完成,通过之前查看内存的命令,来看下内存现在是什么情况




可以看到,已经把xfrm_replay_state_esn结构体之后的固定位给清零了。

至此,cred结构体已经通过喷射来到了xfrm_replay_state_esn结构体之后的位置,通过清零操作可以将其中的关键设置成0,从而拥有该cred结构体的线程拥有root权限,再通过该线程去修改主进程的权限,从而达到提权的目的。

1.造成漏洞的点在哪里?

是在xfrm_replay_state_esn 中的两个成员上


2.如何进行漏洞利用的?

控制replay_window超过bmp,这样在后面流程的读写操作中,很可能就会触发越界

触发越界的函数有两个,xfrm_replay_check和xfrm_replay_advance,其中xfrm_replay_advance有越界写操作

其中net_seq,replay_esn->seq,replay_esn->replay_window,replay_esn->seq_hi 是我们可控的变量,所以可以通过控制这些变量,让程序执行到我们想要的流程,从而达到越界的目的。


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

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
i春秋上面的?
2019-4-12 21:53
0
雪    币: 3051
活跃值: (1392)
能力值: ( LV13,RANK:480 )
在线值:
发帖
回帖
粉丝
3
是的,复现学习一下
2019-4-12 23:55
0
游客
登录 | 注册 方可回帖
返回
//