思科CVE-2019-1663补丁失效安全通告

发布时间 2019-03-06

漏洞编号和级别


CVE编号: CVE-2019-1663,危险级别:严重, CVSS分值:厂商自评:9.8,官方未评定


影响范围


受影响版本: 

RV110W Wireless-N VPN Firewall

RV130W Wireless-N Multifunction VPN Router

RV215W Wireless-N VPN Router


漏洞概述


思科发布安全公告,表示其企业无线VPN和防火墙路由器存在严重安全漏洞。漏洞产生是由于在基于web的管理界面中对用户提供的数据进行了错误的验证。允许攻击者通过向目标设备发送恶意HTTP请求,然后以高权限用户的身份在受影响设备的底层操作系统上执行任意代码。


思科表示该漏洞已经存在六个月,目前已发布补丁,但是发现补丁失效,漏洞利用仍然在继续。


漏洞细节


首先看一下CVE-2019-1663漏洞的起因:

研究人员最早是在RV130路由器上发现该漏洞的,RV130路由器运行的并不是Cisco IOS系统而是嵌入式Linux系统。路由器的主要功能是由一些二进制函数处理的,包括处理用户输入和使路由器正常工作。


大多数的用户输入来自于web接口,受影响的二进制文件是httpd webserver二进制文件。实际上该文件只是处理经过80或443端口的所有数据,它获取通过HTTP传输的用户输入,并转换为系统级的配置。


下面看一下CVE-2019-1663漏洞背后的问题机制:




RV130固件


如果太长的数据传递到login.cgi终端的pwd参数,就会出现缓冲区溢出。这一步是认证之前发生的,下面看一下正常登陆的过程:


到web接口的登陆请求会发送给login.cgi终端,格式如下:



Pwd值实际上是以32字节长的编码密码的形式发送的,该值是在请求发送前通过浏览器中的JS代码计算的。


登陆是由httpd的0x0002C614处的函数处理的。请求参数会从POST请求中进行分析,然后token化之后放在可执行文件的静态数据库(.bss)。



从POST请求中取出后内存中的参数


然后,合法编码的密码就会从NVRAM设备中取出,放入内存中。然后,pwd参数的值就会从.bss中取出来,这里使用了标准C调用strcpy将它放入动态分配的内存中。



*record scratch*.


在正常登陆情况下,每个值都会进行相同的检查。在strcpy将值复制到内存中后,strlen就会计算每个项目的长度,然后strcmp比较两个值。如果所有检查都通过的话,就可以成功登陆。



检查长度


问题就在于strcpy。



strcpy使用很常见


使用C语言编程的开发人员和安全人员请注意:strcpy其实是有个非常危险的函数。网上有上千篇文章解释为什么该函数很危险。下面简单看一下:


首先看一下,在标准的C语言中,strcpy定义如下:



Strcpy函数会复制s2指向的字符串到s1指向的数组中。如果复制在交叉的对象间发生,这种情况是没有预先定义的。也就是说可能会发生一些意料之外的事情。为什么说strcpy有威胁呢?是因为它会复制s2字符串到s1指向的内存。但是该函数不传递长度,也就是说strcpy函数不关心字符串的长度。对strcpy来说,字符串的长度一点也不重要。复制的过程中可能会产生覆写的情况,而攻击者也正是利用这一潜在漏洞发起攻击,可以覆写栈内保存的返回指针,然后重定向进程的执行流。


下图是在使用strcpy时可能会发生的情况:



A segfault


在发送下面的请求给RV130时发生的情况就和上面一样:



栈中保存的返回指针被“ZZZZ”覆写了,因此执行流会被重定向到0x5A5A5A5A。


研究人员建议使用strlcpy函数,strlcpy是C语言标准库函数,是更加安全版本的strcpy函数,在已知目的地址空间大小的情况下,把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,并不会造成缓冲区溢出。


修复建议


思科之前已发布补丁,但是发现补丁失效, 请密切关注官网更新。


参考链接


https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20190227-rmi-cmd-ex#fr

https://www.pentestpartners.com/security-blog/cisco-rv130-its-2019-but-yet-strcpy/