Microsoft恶意软件防护引擎远程执行代码漏洞(CVE-2017-0290)

释放双眼,带上耳机,听听看~!

 

MsMpEng是默认情况下在Windows 8,8.1,10,Windows Server 2012等上启用的恶意软件防护服务。 此外,Microsoft Security Essentials,System Center Endpoint Protection和各种其他Microsoft安全产品共享相同的核心引擎。 MsMpEng作为NT AUTHORITY \ SYSTEM运行,不需要沙盒,并且可通过各种Windows服务(包括Exchange,IIS等)进行身份验证。

 

在工作站上,攻击者可以通过向用户发送电子邮件来访问mpengine(不需要阅读电子邮件或打开附件),访问Web浏览器中的链接,即时消息等。 此级别的可访问性是可能的,因为MsMpEng使用一个文件系统微型程序拦截和检查所有的系统文件系统活动,因此将受控内容写入磁盘上的任何位置(例如缓存,临时Internet文件,下载(甚至未确认的下载),附件等)都足够了 访问mpengine中的功能。 MIME类型和文件扩展名与此漏洞无关,因为MsMpEng使用自己的内容识别系统。

 

由于服务的特权,可访问性和无处不在,MsMpEng中的漏洞是Windows中最严重的漏洞。

 

负责扫描和分析的MsMpEng的核心组件称为mpengine。 Mpengine是一个庞大而复杂的攻击面,包括数十种深奥归档格式的处理程序,可执行封装程序和隐藏器,用于各种体系结构和语言的完整系统仿真器和解释器等。 所有这些代码都可以被远程攻击者访问。

 

NScript是mpengine的组件,用于评估任何看起来像JavaScript的文件系统或网络活动。 要清楚的是,这是一个非垃圾箱和高度特权的JavaScript解释器,用于在所有现代Windows系统上默认评估不受信任的代码。 这听起来很奇怪。

 

我们已经编写了一个工具,通过一个命令shell来访问NScript以进行测试,这样我们可以探索和评估它:

 

$ mpscript
main(): Please wait, initializing engine…
main(): Ready, type javascript (history available, use arrow keys)
> 6 * 9
JavaScriptLog(): 54
> document.location.hostname
JavaScriptLog(): www.myserver.com
> “abcd” + String.fromCharCode(0x3f)
JavaScriptLog(): abcd?
> /[y]e+(s|S)/.exec(“yes”)[0] // C++ regex engine running unsandboxed as SYSTEM on attacker controlled REGEX?
JavaScriptLog(): yes
> for (i in document) log(i)
JavaScriptLog(): appendChild
JavaScriptLog(): attributes
JavaScriptLog(): childNodes
JavaScriptLog(): createElement
JavaScriptLog(): createTextNode
JavaScriptLog(): getElementById
JavaScriptLog(): getElementsByTagName
JavaScriptLog(): write
JavaScriptLog(): writeln
JavaScriptLog(): referrer
JavaScriptLog(): cookie
JavaScriptLog(): location
JavaScriptLog(): undefined
> window.ScriptEngineBuildVersion
JavaScriptLog(): [object Function]
> window.ScriptEngineBuildVersion()

JavaScriptLog(): 8831

 

我们发现函数JsDelegateObject_Error :: toString()从该对象读取“message”属性,但在将其传递给JsRuntimeState :: triggerShortStrEvent()之前无法验证该属性的类型。

在伪代码中,代码的做法如下:

prophash = JsObject::genPropHash(“message”, 0);
RuntimeState::getThisPtr(&thisptr)

if (JsObject::get(thisptr, prophash, &message)) {
JsRuntimeState::triggerShortStrEvent(“error_tostring”, message);
}

该方法假定消息是一个字符串,但它可以是任何类型,所以这种类型的混淆允许攻击者传递任意其他对象。 JsRuntimeState :: triggerShortStrEvent()在传递的对象上调用JsString :: numBytes(),它将从对象的vtable中调用一个方法。

int __fastcall JsString::numBytes(JsString this)
{
if ( this == 0x12 )
return 0;
if ( (this & 0x12) == 0x12 )
return this >> 5;
return this->vtbl->GetLength(this);

}

 

Nscript支持“短”字符串,长度和值包含在句柄和“长”字符串中,具有行外存储器。 如果字符串为“long”(或似乎是由于类型混淆),则会进行vtable调用来检索长度。 整数句柄表示为四字节值,引擎将最终位设置为1。 整数本身左移一位,最后一位设置为创建句柄。 包括字符串在内的大多数对象的句柄表示为不修改对象的指针的值。 因此,这种类型的混淆允许指定一个整数并将其视为指针(尽管这些位需要移位以获取句柄中的正确值,只有奇数指针值是可能的)。 要重现此漏洞,请下载附带的测试用例。 下面的调试会话访问了一个网站后被捕获:

<a href=”testcase.txt” download id=link>
<script>
document.getElementById(“link”).click();
</script>

3: kd> !process
PROCESS 8805fd28  SessionId: 0  Cid: 0afc    Peb: 7ffdf000  ParentCid: 01c8
DirBase: bded14e0  ObjectTable: bfb99640  HandleCount: 433.
Image: MsMpEng.exe
3: kd> !token -n
_EPROCESS 8805fd28, _TOKEN 00000000
TS Session ID: 0
User: S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)

3: kd> .lastevent
Last event: Access violation – code c0000005 (first chance)
debugger time: Fri May  5 18:22:14.740 2017 (UTC – 7:00)
3: kd> r
eax=00000010 ebx=1156c968 ecx=41414141 edx=115730f8 esi=68bd9100 edi=41414141
eip=68b1f5f2 esp=0208e12c ebp=0208e134 iopl=0         nv up ei ng nz ac po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010293
mpengine!FreeSigFiles+0xec822:
001b:68b1f5f2 8b07            mov     eax,dword ptr [edi] ds:0023:41414141=????????
3: kd> lmv mmpengine
start    end        module name
68790000 6917a000   mpengine   (export symbols)       mpengine.dll
Loaded symbol image file: mpengine.dll
Image path: c:\ProgramData\Microsoft\Microsoft Antimalware\Definition Updates\{1C2B7358-645B-41D0-9E79-5FA3E5C4EB51}\mpengine.dll
Image name: mpengine.dll
Timestamp:        Thu Apr 06 16:05:37 2017 (58E6C9C1)
CheckSum:         00A1330D
ImageSize:        009EA000
Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
3: kd> u
mpengine!FreeSigFiles+0xec822:
001b:68b1f5f2 8b07            mov     eax,dword ptr [edi]
001b:68b1f5f4 56              push    esi
001b:68b1f5f5 8b7008          mov     esi,dword ptr [eax+8]
001b:68b1f5f8 8bce            mov     ecx,esi
001b:68b1f5fa ff15c0450e69    call    dword ptr [mpengine!MpContainerWrite+0x35f3a0 (690e45c0)]
001b:68b1f600 8bcf            mov     ecx,edi
001b:68b1f602 ffd6            call    esi           <— Jump to attacker controlled address
001b:68b1f604 5e              pop     esi

在执行JavaScript之前,mpengine会使用一些启发式来确定是否需要评估。一个这样的启发式估计文件熵在决定是否评估任何javascript之前,但是我们发现附加一些复杂的评论就足以引发这一点。

 

附带的概念验证证明了这一点,但请注意,下载它将立即使MsMpEng的默认配置崩溃,并可能会破坏系统的稳定性。应该特别注意与其他Windows用户通过Exchange或基于IIS的Web服务共享此报告,等等。

 

由于mpengine将打开任意深入的嵌套存档,并支持许多模糊和深奥的归档格式(如Amiga ZOO和MagicISO UIF),因此没有实际的方法来识别网络级的漏洞利用,管理员应尽快修补。

 

我们已经验证,在Windows 10上,为C:\添加一个全面的异常足以防止文件系统活动的自动扫描(您仍然可以启动手动扫描,但是只对信任的文件执行操作似乎谨慎,使操作无意义) 。

 

Google Project Zero的Natalie Silvanovich和Tavis Ormandy发现了这个漏洞。

 

该错误需要90天的披露截止日期。经过90天

或补丁已经广泛使用,错误报告将成为 对公众可见。

此漏洞为一个本地漏洞,不要随便点击邮件发来的链接即可防护


本文源自微信公众号:黑鸟

人已赞赏
安全工具

Tor去匿名化?俄罗斯联邦安全局秘密项目因承包商被入侵遭曝光

2019-10-16 10:42:45

安全工具

网络战加剧:美国声称将加强对俄罗斯电网系统的网络攻击

2019-10-16 10:42:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索