大神浅说 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()函数仅在解释模式下使用。 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |