[AD_LAB-05001] OpenOffice DOC document Heap Overflow通告:[AD_LAB-05001] OpenOffice DOC文档处理堆溢出漏洞
Class: 设计错误
DATE:30/3/2005
CVE编号:CAN-2005-0941
受威胁的系统:
<=OpenOffice OpenOffice 1.1.4
-OpenOffice OpenOffice 2.0dev
未受威胁的系统:
目前未知
厂商:
www.openoffice.org
1.漏洞描述:
OpenOffice是一款办公处理软件,支持多种操作系统。在解析.DOC文件的文件头时存在着一个堆溢出。
2.技术描述
问题出在StgCompObjStream::Load()函数,在读取DOC文档格式信息的时候,内存是根据用户提供的长度来分配的。
用户提供的是一个32位整数,分配内存的时候,使用的是16位的短整数,但是在读取信息的时候,是根据32位整数长度来读的,
如果用户提供一个很大的32位整数,就可能导致堆溢出,从而在释放内存的时候发生写指针操作。具体问题看下面的代码注解。
BOOL StgCompObjStream::Load()
{
memset( &aClsId, 0, sizeof( ClsId ) );
nCbFormat = 0;
aUserName.Erase();
if( GetError() != SVSTREAM_OK )
return FALSE;
Seek( 8L ); // skip the first part
INT32 nMarker = 0;
*this >> nMarker;
if( nMarker == -1L )
{
*this >> aClsId;
INT32 nLen1 = 0;
*this >> nLen1; //我们可以控制的32位整数
sal_Char* p = new sal_Char[ (USHORT) nLen1 ]; //取16位短整数分配内存
if( Read( p, nLen1 ) == (ULONG) nLen1 ) //按32整数来读取,如果读取失败,会释放内存,这时可能发生堆溢出
{
aUserName = String( p, gsl_getSystemTextEncoding() );
....
nCbFormat = ReadClipboardFormat( *this );
}
else
SetError( SVSTREAM_GENERALERROR );
delete [] p; //释放内存,堆溢出发生造成写指针操作
}
return BOOL( GetError() == SVSTREAM_OK );
}
如果我们提供一个0x10000018的整数给nLen1,那么只分配0x18大小的内存, Read( p, nLen1 )读取的时候,还是按0x10000018来读取,
这个时候,读操作会失败,但是读取的内容已经大于分配的内存,从而覆盖到了下一个内存块。因为读失败了,会直接跳到delete [] p;,
由于下一个内存块被覆盖到了,free当前内存块的时候,可能导致写地址操作。
我们已经成功触发此漏洞.
这个漏洞可能还影响StartOffice。
3.相关测试程序可从如下地址获得:
https://www.0x557.cn/~air/vul3.doc
4.感谢
AD-LAB实验室发现并公布了此漏洞,具体的技术分析由Airsupply完成
感谢启明星辰技术信息有限公司积极防御实验室的伙伴和丰收项目小组。
5.声明
- -----------
The information in this bulletin is provided "AS IS" without warranty of any
kind. In no event shall we be liable for any damages whatsoever
including direct,
indirect, incidental, consequential, loss of business profits or special
damages.
Copyright 1996-2005 VENUSTECH. All Rights Reserved. Terms of use.
VENUSTECH Security Lab
VENUSTECH INFORMATION TECHNOLOGY CO.,LTD(http://www.venustech.com.cn)
Security
Trusted {Solution} Provider
Service