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
https://www.genivia.com/advisory.html
声 明
本清静通告仅用来形貌可能存在的清静问题,K8凯发国际科技不为此清静通告提供任何保证或允许。由于撒播、使用此清静通告所提供的信息而造成的任何直接或者间接的效果及损失,均由使用者本人认真,K8凯发国际科技以及清静通告作者不为此肩负任何责任。K8凯发国际科技拥有对此清静通告的修改息争释权。如欲转载或撒播此清静通告,必须保证此清静通告的完整性,包罗版权声明等所有内容。未经K8凯发国际科技允许,不得恣意修改或者增减此清静通告内容,不得以任何方式将其用于商业目的。