Upload
others
View
16
Download
0
Embed Size (px)
Citation preview
对安全边界的重炮打击:从内核提权到
应用层逻辑漏洞谈起nEINEI/McAfee 入侵防御研究团队
研究背景:我们的问题是什么?1
内核提权漏洞:CVE-2017-02132
沙盒逃逸漏洞:CVE-2015-0016/CVE-2014-40733
Office任意代码执行漏洞:CVE-2017-01994 新的安全边界在哪里?5
一, 研究背景:我们的问题是什么?
安全边界:微软提供了对操作系统,应用程序的各种各样的安全缓解机制,这些机制就是为攻击者划分出的安全边界,多数情况下需要突破这些才能获得代码执行。
逻辑型漏洞:非内存层面,偏程序功能上的缺陷突破了上面谈到的安全边界。它具有先天的跨平台/跨产品,稳定性高的优势。
安全研究防御者:如何对这样的逻辑型漏洞划分新的安全边界?
我们的问题是什么?
这些就是我们平时最熟悉,所面对的安全缓解措施。
我们从中可以看到微软在系统安全方面所做的各种努力。
Windows世界里面的安全边界GS
SEHJIT Mitigation
SMEP SMAP
MemGC HVCI
RFG
CFG
ACG
AppContainer
CIG
SafeSEH
SEHOP
ASLR DEP
Safe unlinking
Isolated heapVtable Guard
LPAC
KASLR
针对内存,进程的安全边界EPM(Enhance Protected Mode)APPContainer…
DEPASLRVTABLE GUARDCFGRFG
…
针对进程层面
针对内存层面
对安全边界的重炮打击
逻辑漏洞:内核提权
漏洞名称:Windows COM Aggregate Marshaler/IRemUnknow2 Type Confusion EoP
影响平台:Win7~Win10公布时间:2017-05-09
发现者:ProjectZero/James Forshaw
https://bugs.chromium.org/p/project-zero/issues/detail?id=1107&can=1&q=owner%3Aforshaw%40google.com&sort=-id
内核提权漏洞:CVE-2017-0213
COM中的包容、聚合
客户程序员:仅通过COM1接口,就可以获得IX,IY,IZ的能力
COM1 (IX):outer
COM2(IY)inner
COM3(IZ)inner
COM进程外调用: 客户程序和组件对象分别在不同的进程空间里面。
通过代理/存根的方式来完成客户和跨进程组件的通信。
COM的透明调用Process: client
Agent
Process: server
stub
RPC通信
列集(marshaling):一种方法,能将客户程序数据传送到组件进程所在的地址空间。
散集(unmarshaling):能将组件进程所在数据传输给客户进程的方法。
传送到数据类型:
1 整数,字符串
2 指针(特殊处理)
3 组件对象接口指针(复杂处理)
COM透明调用
Process: client
Agent
Process: server
stub
marshaling
unmarshaling
Patched:Win7(ole32.dll) ,Win8(combase.dll)
CStdMarshal::Unmarshalnterface
修补丁后 CStdMarshal::Unmarshalnterface
RemQueryInterface2 (xxx,rrid,…)
\|/
CStdMarshal :: Finish_RemQIAndUnmarshal2(xxx,objref,….)\|/
CStdMarshal :: UnmarshalInterface (patch :CStdMarshal::FixIidmatchInUnmarshalInterface)
\|/
\|/Create Local Proxy
漏洞的根本问题
没有校验二者是否一致
1)IBackgroundCopyManagerPtr pJob;
pJob->SetNotifyInterface(pNotify);
2) IUnknownPtr pOuter = new CMarshaller(static_cast<IPersist*>(newFakeObject()));
CoGetStdMarshalEx(pOuter, SMEXF_SERVER, &pInner); //标准聚合在服务端
pNotify.Attach(new CMarshaller(pInner));
CVE-2017-0213漏洞的利用方法寻找一个触发的机会
把一个混淆的,实现了自定义列集的组建对象放入pNotify
3) 建立伪造对象,实现IBackgroundCopyCallback功能class FakeObject : public IBackgroundCopyCallback2, public IPersist{
HRESULT __stdcall QueryInterface(REFIID riid, LPVOID *ppvObj){
...
}}
CVE-2017-0213漏洞的利用方法
4)virtual HRESULT STDMETHODCALLTYPE MarshalInterface(... riid …){
IID iid = riid;if (iid == __uuidof(IBackgroundCopyCallback2) || iid ==
__uuidof(IBackgroundCopyCallback)){
iid = IID_ITMediaControl;}
HRESULT hr = CoMarshalInterface(pStm, iid, _unk, dwDestContext, pvDestContext, mshlflags);}
CVE-2017-0213漏洞的利用方法CMarshal 类实现IMarshal接口,构造函数保留传入的组件对象
Fackobject
Bad iid
CVE-2017-0231漏洞的利用方法构造一个TypeLib库包含IID_ITMediaControl,Typelib用来实现跨进程通信的代理/存根
CVE-2017-0213对防御的影响
EoP.exe ---> 发起请求
svchost.exe(BITS service ….. , -k netsvcs) ---> 被混淆IID的FakeObject
Marshl(通过加载Typelib) ---> 伪造一个Improted type lib
malicious.sct 创建新的进程
malicious.exe (IL = SYSTEM)
Out of scope
逻辑漏洞:沙盒逃逸
沙盒逃逸漏洞:CVE-2015-0016/CVE-2014-4073
Weakness
Weakness:Outer COM object
漏洞说明:CVE-2015-0016:第一个公开的ITW的0day 沙盒逃逸漏洞。
公布时间:2015-01-13影响平台:Win7 ~ Win8.1
发现者:Liam O’Murchu of Symantec
沙盒逃逸漏洞:CVE-2015-0016
1 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{B43A0C1E-B63F-4691-B68F-CD807A45DA01}
AppName : TSWbProxy.exeAppPath:%systemroot%\system32
Policy:0x00000003
沙盒逃逸漏洞:CVE-2015-0016
CTSWebProxy::StartRemoteDestop(启动一个Mstsc.exe远程桌面程序)
沙盒逃逸漏洞:CVE-2015-0016,补丁对比
CVE-2015-0016:增加了校验传入路径的检测函数
沙盒逃逸漏洞:CVE-2015-0016,可以直接使用伪造的进程路径未经校验
补丁后的代码
CVE-2015-0016对防御的影响
IE Sandboxed.exe (Loading DLL) IL = Low -----> 发起请求
TswebProxy.exe ------------> 接收了一个调用请求
CTSWebProxy::StartRemoteDestop(lpAppName, lpCommandLine)
---> 原本想创建mstsc.exe 进程
malicious.exe (IL = Medium)
Out of scope
传入畸形路径获得控制权
https://blogs.technet.microsoft.com/srd/2014/10/14/more-details-about-cve-2014-4073-elevation-of-privilege-vulnerability/
诚如文章中所提到:
CVE-2014-4073对防御的影响
CVE-2014-4073对防御的影响
IE Sandboxed.exe (Loading DLL) IL = Low -----> 发起请求
Dfsvc.exe ------------>
接收委托请求DynamicInvoke ---->
IManagedObject::GetSerializedBuffer().
malicious.exe (IL = Medium)
Out of scope
《CVE-2015-0016: Escaping the Internet Explorer Sandbox》by Henry Li
http://blog.trendmicro.com/trendlabs-security-intelligence/cve-2015-0016-escaping-the-internet-explorer-sandbox/
《IE EPM沙盒逃逸之注册表符号链接攻击》by nEINEI
http://www.vxjump.net/files/vuln_analysis/symbollink_bypass_epm.txt
关于沙盒逃逸
逻辑漏洞:任意代码执行
影响平台: Office2007 ~ Office2016,包含2个Bug.
公布时间:2017-04-12
发现者:Ryan Hanson (@Ryhanson) of Optiv,Genwei Jiang, FLARE Team, FireEye Inc
2017 Pwnie for Best Client-Side Bug:
Ryan Hanson,Haifei Li,Bing Sun
McAfee Labs Blog(2017-04-07)by Haifei Li
https://securingtomorrow.mcafee.com/mcafee-labs/critical-office-zero-day-attacks-detected-wild/
Office远程代码执行提权漏洞:CVE-2017-0199
Object Stream: \x01Ole
RTF ----> 插入StdOlelink对象
---->URL Moniker解析对应URL链接
---->发现目标内容是HTA方式(不能直接插入hta扩展名,需要服务器配合修改)
-----> 通知svchost进程
----->启动mshta.exe来运行目标内容
------>malicous.exe运行
CVE-2017-0199 Root cause
CVE-2017-0199对防御的影响
malicious.rtf ------> 发起请求
WinWord.exe(解析URL Moniker,通知svchost/loading URLMon.dll)
malicious.exe (IL = Medium)
Out of scopeSvchost-k DcomLaunch ---> 创建mshta.exe进程
Mshta.exe进程被创建执行下载的恶意脚本 Out of scope
http://justhaifei1.blogspot.sg/2017/07/bypassing-microsofts-cve-2017-0199-patch.html
精彩的续集:Bypass CVE-2017-0199 by Haifei Li
Sycan360 2017SEA《Moniker Magic: Running Scripts Directly in Microsoft Office》
by Haifei Li,Sun Bing
微软禁止2个对象在office中使用:
{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B} -> “htafile” object
{06290BD3-48AA-11D2-8432-006008C3FBFC} -> “script” object
微软修补CVE-2017-0199机制
Bypass CVE-2017-0199的方式
{00000309-0000-0000-C000-000000000046} -> Composite Moniker
{00000303-0000-0000-C000-000000000046} -> File
{ECABAFC6-7F19-11D2-978E-0000F8757E2A} ->“new” Moniker
= + +
CVE-2017-8570的方式
Composite Moniker File Moniker New Moniker other Moniker
{06290BD2-48AA-11D2-8432-006008C3FBFC} scriptletfile
Run .sct
CVE-2017-8570对防御的影响
malicious.rtf/ppsx +(Remote/local .sct) 发起请求
WinWord.exe(查找对象,解析CompositeMoniker)
------------->直接运行远程、本地目录的.sct文件
malicious.exe (IL = Medium)
可以被保护的
新的安全边界在哪里?
思考? 磁盘实体样本文件的检测要求CVE-2017-0231
内核提权
CVE-2015-0016
沙盒逃逸
CVE-2017-0199
office远程代码执行
CVE-2017-8570
office 远程带代码执行
所在问题不严格属于样本所在空间
所在问题不严格属于样本所在空间
所在问题属于样本所在空间
(仅以事后分析微软补丁的角度)
所在问题属于样本所在空间
(仅以事后分析微软补丁的角度)
思考?对运行时防御检测要求
CVE-2017-0231
内核提权
CVE-2015-0016
沙盒逃逸
CVE-2017-0199
office远程代码执行
CVE-2017-8570
office 远程带代码执行
对SVCHOST服务进程难以划分界限
对TSWebProxy进程难以划分界限
对mshta进程难以划分界限
对Winword/PowerPNT进程可以划分界限
目前,面对逻辑漏洞我们能做到的只能是Case By Case的解决,不能向面对内存破坏型漏洞所有
具有的大量通用型防护机制。
例如, CVE-2017-0199
WinWord.exe- >
URLMon.dll - >
Ole32.dll - >
关于防护:一种退而求其次的方式
HRESULT WINAPI OleGetAutoConvert(_In_ REFCLSID clsidOld,_Out_ LPCLSID pClsidNew)
这是一个很稳定的拦截点
0:000> kpChildEBP RetAddr001caf38 75386662 ole32!OleGetAutoConvert(struct _GUID * clsidOld = 0x001caf7c
001cafa0 7533c09b Urlmon!AppDataFolderList::GetPackageDependencyStateForIUri+0x13e6d…001cb248 7536b7d4 Urlmon!CINet::INetAsyncConnect+0x350001cb304 753102b6 Urlmon!COInetProt::StartEx+0x184001cb948 5b505142 ole32!CDefLink::BindToSource001df740 2f13159a winword+0x1602001df7d0 7689ef1c winword+0x159a
尚未确定补丁机制前,可以从关键API入手防护
OleGetAutoConvert 函数根据参数1 clsidOld,来查找获得新的CLSID如果我们根据window当前堆栈情况来判断1 如果查找的是Application\HTA2 如果执行结果是REGDB_E_KEYMISSING, 表明系统默认关联这一点那么我们直接返回失败
看起来我们面对的问题是这样的External process
被攻击进程
External process
External process
External process
针对内存层面缓解技术
希望为逻辑漏洞划分的新安全边界
Drop.exe
Drop.exe
被突破的边界
如果将这些逻辑漏洞联合起来利用会出现什么效果?
让我们模拟一下从应用层逻辑漏洞到沙盒逃逸逻辑漏洞到内核提权的整体攻击过程。
DEMOMalicious.rtf--->
WinWord.exe --->
svchost(-k DcomLaunch ) ---> 应用层逻辑漏洞
mshta.exe --->
dfsvc.exe ---> 沙盒逃逸的逻辑漏洞
svchost(-k netsvcs) --->
Malicious.exe(IL = System) 内核提权的逻辑漏洞
演示:
http://www.vxjump.net/files/seccon/logic_vuln.jpg
1如果内存破坏性漏洞不能通过缓解技术而得到收敛,那么在相当的一段时期内,逻辑型漏洞不会成为主要的
威胁方向。
2 逻辑型漏洞如果发生在跨进程的交互范畴中(跨2个或多个进程),这使得传统意义上的缓解技术近乎失
效,安全边界难以被定义和划分。
总结
3 如果基于对攻击行为的监控,那么将要面对两难的考虑当中,1)大量的监控信
息如何关联? 2)如何定义逻辑漏洞导致的攻击性行为?
4 深刻为逻辑型漏洞刻画出一个安全边界是非常困难的,这需要自上而下的不断尝
试。
1. https://www.blackhat.com/docs/asia-14/materials/Yason/Asia-14-Yason-Diving-Into-IE10s-Enhanced-Protected-Mode-Sandbox.pdf
2. https://bugs.chromium.org/p/project-zero/issues/detail?id=1107&can=1&q=owner%3Aforshaw%40google.com&sort=-id
3. http://justhaifei1.blogspot.sg/2017/07/bypassing-microsofts-cve-2017-0199-patch.html
4. https://sites.google.com/site/zerodayresearch/Moniker_Magic_final.pdf
5. http://blog.trendmicro.com/trendlabs-security-intelligence/cve-2015-0016-escaping-the-internet-explorer-sandbox/
参考文献
THANKS!
非常感谢我的同事,孙冰,李海飞在这个议题当中给与的帮助!感谢McAfee IPS Research Team