此漏洞主要利用了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 是我们可控的变量,所以可以通过控制这些变量,让程序执行到我们想要的流程,从而达到越界的目的。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!