CVE-2017-9765漏洞分析
2017-08-09
2017.7.18日,SENRIO在官方博客公布了gSOAP整型溢出漏洞(CVE-2017-9765)细节,并将该漏洞命名为Devil's Ivy。根据genivia官方说明,当向服务器发送超过2Gb的XML数据时,将导致整型下溢,最终导致缓冲区溢出,可执行任意代码。该漏洞最初在Axis M3004摄像头中发现,但其影响范围远不止Axis摄像头,任何使用了gSOAP的应用均受影响。
漏洞原理
在soap_get_pi()函数中,缓冲区buf大小为64,变量i的值随着数据写入缓冲区递减。while循环中解析输入的xml数据,但是结束条件是遇到字符”?”或输入数据结尾,而不是判断实际写入缓冲区的数据是否已经达到0x40字节,当i<0时,输入数据不再写入缓冲区,但是每次while循环,--i的操作都在执行,从而导致整型下溢,当i的值溢出为正值以后,可以继续向缓冲区写入数据,从而突破缓冲区大小为64的限制。
图1漏洞修复前和修复后对比
漏洞利用时,通过发送0x80000000字节数据,可以导致整型下溢,通过0x40字节数据覆盖缓冲区,另外在覆盖返回地址前还需要0x30字节数据,总共0x80000070字节数据,通过post发送到80端口” /onvif/device_service”。
具体的漏洞触发场景为:
· 前0x40字节数据,i的值由0x40减为0,所读取的0x40字节数据填充到缓冲区buf中。i的值小于0后,读取的数据不再写入缓冲区;· i的值由0Xffff ffff(-1)递减为负数最小值0x8000 0000;
· i的值再减1,将由负数最小值0x8000 0000变成正数最大值0x7fff ffff。因此,总共需要0x8000 0000字节数据,才能使i下溢为正数;· i的值溢出为正数以后,此时可以继续向缓冲区写入数据,直到覆盖返回地址。
Genivia官方在2.8.48版本中修复了该漏洞,由图1可知,在新版本中,依然以读取到的数据是否为“?”作为数据输入结束判断条件,但是将i--操作放在if(i>1)的条件判断中,从而防止整型下溢。
影响版本
该漏洞在gSOAP 2.8.48版本中修复,之前的版本均受到影响。
官方对sourceforge上的所有版本均作了修复,即使旧版本也已经打上补丁,如2.8.47和2.8.48对比中,低版本同样不存在整型下溢的问题,sourceforge上所有旧版本提交日期均为20170716。
参考
http://blog.senr.io/devilsivy.html
http://www.genivia.com/advisory.html
声 明
本安全公告仅用来描述可能存在的安全问题,bbin宝盈集团科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,bbin宝盈集团科技以及安全公告作者不为此承担任何责任。bbin宝盈集团科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经bbin宝盈集团科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。