欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

某工业组态软件整数溢出漏洞(CVE-2018-7471)分析

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

0×1 漏洞信息
CNVD-ID:CNVD-2018-00995
CVE ID:CVE-2018-7471
某公司工业组态软件存在整数溢出漏洞,该漏洞是由于stgopenstorage读取失败,返回的错误代码超出int在32位系统中的范围,攻击者可利用该漏洞执行任意代码。
补丁信息:http://www.kingview.com/news_info.php?num=1000656
漏洞发布:http://www.cnvd.org.cn/flaw/show/CNVD-2018-00995
0×2 OpenStorage函数说明
OpenStorage加载结构化存储的文件,函数返回HRESULT类型变量。函数原型如下:

返回的结果为长整形:当函数读取正常时,返回值为0,读取失败,返回长整型整数
函数说明参考MSDN:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380024(v=vs.85).aspx
0×3查找漏洞函数
根据补丁对比,将漏洞组件确定为Touchvewocx.ocx。经分析,该模块有五个函数有变化,其中三个进行了修改,逐一进行分析。

3.1 0x100223C0
CViewManager::LoadDocInfor(CViewManager *this,CPicDocument *pd)

放大来看,主要是增加0×10022780部分的判断程序块。 

3.1.1 补丁前
.text:100223C0 var_814         = dword ptr -814h
.text:100223C0var_810         = dword ptr -810h    -int 32
.text:100223C0 pwcsName        = dword ptr -80Ch
.text:100223C0 ppstgOpen       = dword ptr -808h   

var_810(v25)是一个值为负数的int32(函数调用错误是,返回一个负值,其高位为1)变量,系统为64位时,负数扩展高位补F。
3.1.2 补丁后
返回值为dword 类型,返回若不为S_OK,返回值转换为Cstring(whar_t)后,进行异常处理。
.text:100223C0sc              = dword ptr -810h
.text:100223C0 lpsz            = dword ptr -80Ch
.text:100223C0 lpStorage       = dword ptr -808h


3.2 0×10039530

修复后:  

将字符串改为wchar
3.3 0×10151880

修补前:  


修补后:

if ( StgIsStorageFile(lpsz) == 1 )
  {
    sc =StgCreateDocfile(lpsz, 0x30022u, 0, &lpStorage);
    if ( sc0 || !lpStorage )
      sc =StgCreateDocfile(lpsz, 0x30000u, 0, &lpStorage);
  }
  else
  {
    sc =StgOpenStorage(lpsz, 0, 0x10022u, 0, 0, &lpStorage);
    if ( sc0 || !lpStorage )
      sc =StgOpenStorage(lpsz, 0, 0x10000u, 0, 0, &lpStorage);

[1] [2]  下一页

0×1 漏洞信息
CNVD-ID:CNVD-2018-00995
CVE ID:CVE-2018-7471
某公司工业组态软件存在整数溢出漏洞,该漏洞是由于stgopenstorage读取失败,返回的错误代码超出int在32位系统中的范围,攻击者可利用该漏洞执行任意代码。
补丁信息:http://www.kingview.com/news_info.php?num=1000656
漏洞发布:http://www.cnvd.org.cn/flaw/show/CNVD-2018-00995
0×2 OpenStorage函数说明
OpenStorage加载结构化存储的文件,函数返回HRESULT类型变量。函数原型如下:

返回的结果为长整形:当函数读取正常时,返回值为0,读取失败,返回长整型整数
函数说明参考MSDN:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380024(v=vs.85).aspx
0×3查找漏洞函数
根据补丁对比,将漏洞组件确定为Touchvewocx.ocx。经分析,该模块有五个函数有变化,其中三个进行了修改,逐一进行分析。 本文来自无奈人生安全网

3.1 0x100223C0
CViewManager::LoadDocInfor(CViewManager *this,CPicDocument *pd)

放大来看,主要是增加0×10022780部分的判断程序块。 

3.1.1 补丁前
.text:100223C0 var_814         = dword ptr -814h
.text:100223C0var_810         = dword ptr -810h    -int 32
.text:100223C0 pwcsName        = dword ptr -80Ch
.text:100223C0 ppstgOpen       = dword ptr -808h   

内容来自无奈安全网


var_810(v25)是一个值为负数的int32(函数调用错误是,返回一个负值,其高位为1)变量,系统为64位时,负数扩展高位补F。
3.1.2 补丁后
返回值为dword 类型,返回若不为S_OK,返回值转换为Cstring(whar_t)后,进行异常处理。
.text:100223C0sc              = dword ptr -810h
.text:100223C0 lpsz            = dword ptr -80Ch
.text:100223C0 lpStorage       = dword ptr -808h

无奈人生安全网


3.2 0×10039530

修复后:  

将字符串改为wchar
3.3 0×10151880

修补前:  

无奈人生安全网


修补后:

if ( StgIsStorageFile(lpsz) == 1 )
  {
    sc =StgCreateDocfile(lpsz, 0x30022u, 0, &lpStorage);
    if ( sc0 || !lpStorage )
      sc =StgCreateDocfile(lpsz, 0x30000u, 0, &lpStorage);
  }
  else
  {
    sc =StgOpenStorage(lpsz, 0, 0x10022u, 0, 0, &lpStorage);
    if ( sc0 || !lpStorage )
      sc =StgOpenStorage(lpsz, 0, 0x10000u, 0, 0, &lpStorage);
无奈人生安全网

[1] [2]  下一页 copyright 无奈人生

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。