加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 安全 > 正文

大神浅说 IE和Windows的两个0-day漏洞分析

发布时间:2022-07-29 10:34:15 所属栏目:安全 来源:互联网
导读:我们将这一系列攻击称为PowerFall恶意活动。目前,我们暂时不能将恶意活动与任何已知的威胁行为者建立明确联系,但根据它与以前发现漏洞的相似性,我们认为DarkHotel可能是此次攻击的幕后黑手。卡巴斯基产品目前将PowerFall攻击检测为PDM:Exploit.Win32.Gene
  我们将这一系列攻击称为PowerFall恶意活动。目前,我们暂时不能将恶意活动与任何已知的威胁行为者建立明确联系,但根据它与以前发现漏洞的相似性,我们认为DarkHotel可能是此次攻击的幕后黑手。卡巴斯基产品目前将PowerFall攻击检测为“PDM:Exploit.Win32.Generic”。

  在野外发现的Internet Explorer最新0-day攻击利用了旧版本JavaScript引擎jscript.dll中的漏洞CVE-2020-0674、CVE-2019-1429、CVE-2019-0676和CVE-2018-8653。其中,CVE-2020-1380是jscript9.dll中的一个漏洞,该漏洞自Internet Explorer 9开始存在,因此Microsoft建议的缓解步骤(限制jscript.dll的使用)无法针对这个特定漏洞实现防护。

  要理解这一漏洞,我们首先看一下func()的执行方式。这里,重要的是了解将什么值设置为A[5]。根据代码,与之相关的应该是一个参数O。在函数开始时,会将参数O重新分配为1,但随后将函数参数长度设置为0。这个操作不会清除函数参数(通常,常规数组会这样做),但允许将参数O2放在索引为0的参数列表1中,这意味着O = O2。除此之外,如果参数F等于1,则会再次重新分配O,但这次会分配整数2。这意味着,根据参数F的值,O参数会等于O2参数的值或是整数2。参数A是32位浮点型数组,在将值分配给数组的索引5之前,会将值首先转换为浮点数。将整数转换为浮点数的过程比较简单,但是如果要将对象转换为浮点数,这个过程就不再那么简单了。该漏洞利用使用了重载方法valueOf()中的abp对象。当对象转换为浮点型时执行此方法,但是在其内部,包含释放ArrayBuffer的代码,该代码由Float32Array查看,并在其中设置返回值。为了防止将值存储在已释放对象的内存中,JavaScript引擎需要首先检查对象的状态,然后再将值存储在对象中。为了安全地转换和存储浮点值,JScript9.dll使用函数Js::TypedArray::BaseTypedDirectSetItem()。下面是这个函数的反编译代码:
 
  复制
  int Js::TypedArray<float,0>::BaseTypedDirectSetItem(Js::TypedArray<float,0> *this, unsigned int index, void *object, int reserved)
  {
      Js::JavascriptConversion::ToNumber(object, this->type->library->context);
      if ( LOBYTE(this->view[0]->unusable) )
          Js::JavascriptError::ThrowTypeError(this->type->library->context, 0x800A15E4, 0);
      if ( index < this->count )
      {
          *(float *)&this->buffer[4 * index] = Js::JavascriptConversion::ToNumber(
              object,
              this->type->library->context);
      }
      return 1;
  }
  
  double Js::JavascriptConversion::ToNumber(void *object, struct Js::ScriptContext *context)
  {
      if ( (unsigned char)object & 1 )
          return (double)((int)object >> 1);
      if ( *(void **)object == VirtualTableInfo<Js::JavascriptNumber>::Address[0] )
          return *((double *)object + 1);
      return Js::JavascriptConversion::ToNumber_Full(object, context);
  }

  该函数检查浮点型数组的view[0]->unusable和count字段。在执行valueOf()方法的过程中,当ArrayBuffer被释放时,这两项检查都将失败,因为此时view[0]->unusable为1,并且在第一次调用Js::JavascriptConversion::ToNumber()时count为0。问题在于,Js::TypedArray::BaseTypedDirectSetItem()函数仅在解释模式下使用。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读