通过EHLO字符串利用Exim漏洞

9月,QAX-A-Team的安全研究人员发现了邮件传输代理Exim的一个漏洞——CVE-2019-16928。据统计,Exim大约占互联网上公开可访问邮件服务器的50%。攻击者利用该漏洞可以发起DoS攻击甚至远程代码执行RCE攻击。

受影响的Exim版本包括:

· 4.92

· 4.92.1

· 4.92.2

早期版本不受该漏洞的影响。

本文介绍CVE-2019-16928漏洞的利用过程,以及如何利用Exim进程的堆缓冲区溢出漏洞错误来获取完全控制权限。

   堆溢出

在计算机内存执行过程中,本地变量保存在内存的一部分区域——栈,栈负责保存函数创建的本地变量。用于在运行时分配和释放内存的动态变量保存在堆中。每个本地变量都指向堆中的对应值,也就是说它指向含有对应值的内存地址。当比目标内存更长的字符串被用作输入时,会覆盖和修改堆中随后内存区块的值。

图1描述了执行流:

 图1. 堆缓冲区溢出的内存表示

在该场景中,Value 2可以在运行时执行的任意字符串或后门命令,这就是RCE远程代码执行。

使用EHLO字符串来利用该漏洞

IETF对Extended HELO (EHLO)的定义是邮件客户端发送的用来识别自己和通知邮件服务器的命令。通过EHLO字符串,攻击者可以利用CVE-2019-16928漏洞来执行恶意攻击,比如破坏Exim进程导致DoS攻击。此外,用作EHLO的输入的后门命令会导致远程代码执行。

该漏洞位于string.c的string_vformat()方法中。由于编码错误,字符串的长度增长地不够,导致缓冲区溢出异常。字符串的增长是通过向offset值中添加size值来确定的。

图2. 分配内存给字符串的gstring_grow(

如图2所示,红色部分就是有漏洞的代码。如果 g->ptr (字符串或offset中的当前指针) 和 (lim – g->ptr) 很低,并且添加的字符串的大小大于分配的内存,然后会导致堆溢出。