SharePoint-Workflows funktionieren nach der Installation von .NET-Sicherheitsupdates für CVE-2018-8421 nicht mehr

Gilt für: SharePoint Server

Problembeschreibung


Nach der Installation eines der Sicherheitsupdates vom September 2018 für .NET Framework zur Behebung von CVE-2018-8421 (Sicherheitsanfälligkeit in .NET Framework bezüglich Remotecodeausführung) funktionieren die sofort einsatzbereiten SharePoint-Workflows nicht mehr. Wenn dieses Problem auftritt, wird möglicherweise eine Fehlermeldung angezeigt, die so oder ähnlich lautet:

<Date> <Time> w3wp.exe (0x1868) 0x22FC SharePoint Foundation Workflow Infrastructure 72fs Unexpected RunWorkflow: Microsoft.SharePoint.SPException: <Error><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1" Text="Type System.CodeDom.CodeBinaryOperatorExpression is not marked as authorized in the application configuration file." /><CompilerError Line="-1" Column="-1"…

Diese Fehlermeldung weist darauf hin, dass System.CodeDom.CodeBinaryOperatorExpression nicht als autorisierter Typ gekennzeichnet ist.

Weitere Informationen zu den Sicherheitsupdates vom September für .NET Framework finden Sie auf dieser Blogseite von Microsoft.

Ursache


Workflow Foundation (WF) führt nur Workflows aus, wenn alle abhängigen Typen und Assemblys in der .NET-Konfigurationsdatei unter folgender Struktur autorisiert sind (oder explizit über Code hinzugefügt wurden):

<configuration>

<System.Workflow.ComponentModel.WorkflowCompiler>

<authorizedTypes>

<targetFx>

Nach dem Update sind jedoch einige Typen, die von sofort einsatzbereiten SharePoint-Workflows verwendet werden und zuvor nicht notwendig waren, nun erforderlich.

Lösung


Die Lösung besteht darin, die erforderlichen Typen explizit allen web.config-Dateien von Webanwendungen hinzuzufügen.

SharePoint 2013 und neuere Versionen

Fügen Sie für SharePoint 2013 und neuere Versionen die folgenden Zeilen hinzu:

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeBinaryOperatorExpression" Authorized="True" />

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodePrimitiveExpression" Authorized="True" />

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeMethodInvokeExpression" Authorized="True" />

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeMethodReferenceExpression" Authorized="True" />

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeFieldReferenceExpression" Authorized="True" />

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeThisReferenceExpression" Authorized="True" />

<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodePropertyReferenceExpression" Authorized="True" />

Ältere SharePoint-Versionen als SharePoint 2013

Fügen Sie für ältere SharePoint-Versionen als SharePoint 2013 stattdessen die folgenden Zeilen hinzu:

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeBinaryOperatorExpression" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodePrimitiveExpression" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeMethodInvokeExpression" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeMethodReferenceExpression" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeFieldReferenceExpression" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodeThisReferenceExpression" Authorized="True" />

<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" NameSpace="System.CodeDom" TypeName="CodePropertyReferenceExpression" Authorized="True" />

    Weitere Informationen


    Es wird empfohlen, das folgende Skript zu verwenden, anstatt vorhandene Skripts direkt zu bearbeiten.

    Hinweis Für manche Workflowmodule von Drittanbietern müssen möglicherweise zusätzliche Typen hinzugefügt werden. Wenn dies der Fall ist, wenden Sie sich wegen Informationen zu den erforderlichen Typen an Ihren Hersteller, und passen Sie anschließend das Skript entsprechend an.

    Mit dem folgenden Skript wird die Datei „web.config“ für alle Webanwendungen geändert, um die erforderlichen Einträge hinzuzufügen. Mit diesem Skript werden diese Typen für vorhandene Webanwendungen und neue Webanwendungen, die nach der Ausführung des Skripts erstellt wurden, hinzugefügt. Das Skript sollte nur einmal auf jedem Web-Front-End in der Farm ausgeführt werden (damit werden alle Computer aktualisiert).

    <#

     This script will add the entries to all web.config files for all web applications in the farm.

     Run this script as Farm Administrator in one of the WFEs.

     This script only needs to run one time.

    SUMMARY:

    This script leverages the native SharePoint SPWebConfigModification API to deploy new updates to the web.config file for each web application on each server in the farm.  Servers added a later date will also get the updates applied because the API configuration is persisted in the config database.  This API does not update the web.config for the central administration web application.

    If you are running workflows on the central admin web application, you will need to manually update the web.config using the steps in the referenced blog.

    ==============================================================

    #>

    Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-Null

    function Add-CodeDomAuthorizedType

    {

        <#

        .Synopsis

           Adds the necessary authorizedType elements to all web.config files for all non-central admin web applications

     

        .DESCRIPTION

           Adds the necessary authorizedType elements to all web.config files for all non-central admin web applications

     

        .EXAMPLE

           Add-CodeDomAuthorizedType

     

        #>

        [CmdletBinding()]

        param

        (

        )

        begin

        {

            $farmMajorVersion = (Get-SPFarm -Verbose:$false ).BuildVersion.Major

            $contentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService

            $typeNames = @( "CodeBinaryOperatorExpression", "CodePrimitiveExpression", "CodeMethodInvokeExpression", "CodeMethodReferenceExpression", "CodeFieldReferenceExpression","CodeThisReferenceExpression", "CodePropertyReferenceExpression")

       

        }

        process

        {

            if( @($contentService.WebConfigModifications | ? { $_.Name -eq "NetFrameworkAuthorizedTypeUpdate" }).Count -gt 0 )

            {

                Write-Warning "Existing NetFrameworkAuthorizedTypeUpdate entries found, this script only need to be run once per farm."

                return

            }

            if( $farmMajorVersion -le 14 ) # 2010, 2007

            {

                foreach( $typeName in $typeNames )

                {

                    # System, Version=2.0.0.0

                    $netFrameworkConfig = New-Object Microsoft.SharePoint.Administration.SPWebConfigModification

                    $netFrameworkConfig.Path     = "configuration/System.Workflow.ComponentModel.WorkflowCompiler/authorizedTypes"

                    $netFrameworkConfig.Name     = "authorizedType[@Assembly='System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'][@Namespace='System.CodeDom'][@TypeName='{0}'][@Authorized='True']" -f $typeName

                    $netFrameworkConfig.Owner    = "NetFrameworkAuthorizedTypeUpdate"

                    $netFrameworkConfig.Sequence = 0

                    $netFrameworkConfig.Type     = [Microsoft.SharePoint.Administration.SPWebConfigModification+SPWebConfigModificationType]::EnsureChildNode

                    $netFrameworkConfig.Value    = '<authorizedType Assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Namespace="System.CodeDom" TypeName="{0}" Authorized="True"/>' -f $typeName

               

                    $contentService.WebConfigModifications.Add($netFrameworkConfig);

                }

            }

            else # 2013+

            {

                foreach( $typeName in $typeNames )

                {

                    # System, Version=4.0.0.0

                    $netFrameworkConfig = New-Object Microsoft.SharePoint.Administration.SPWebConfigModification

                    $netFrameworkConfig.Path     = "configuration/System.Workflow.ComponentModel.WorkflowCompiler/authorizedTypes/targetFx"

                    $netFrameworkConfig.Name     = "authorizedType[@Assembly='System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'][@Namespace='System.CodeDom'][@TypeName='{0}'][@Authorized='True']" -f $typeName

                    $netFrameworkConfig.Owner    = "NetFrameworkAuthorizedTypeUpdate"

                    $netFrameworkConfig.Sequence = 0

                    $netFrameworkConfig.Type     = [Microsoft.SharePoint.Administration.SPWebConfigModification+SPWebConfigModificationType]::EnsureChildNode

                    $netFrameworkConfig.Value    = '<authorizedType Assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Namespace="System.CodeDom" TypeName="{0}" Authorized="True"/>' -f $typeName

               

                    $contentService.WebConfigModifications.Add($netFrameworkConfig);

                }

            }

            Write-Verbose "Updating web.configs"

            $contentService.Update()

            $contentService.ApplyWebConfigModifications();

        }

        end

        {

        }   

    }

    function Remove-CodeDomAuthorizedType

    {

        <#

        .Synopsis

           Removes any web configuration entires owned by "NetFrameworkAuthorizedTypeUpdate"

     

        .DESCRIPTION

           Removes any web configuration entires owned by "NetFrameworkAuthorizedTypeUpdate"

     

        .EXAMPLE

            Remove-CodeDomAuthorizedType

        #>

        [CmdletBinding()]

        param()

        begin

        {

            $contentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService

        }

        process

        {

            $webConfigModifications = @($contentService.WebConfigModifications | ? { $_.Owner -eq "NetFrameworkAuthorizedTypeUpdate" })

            foreach ( $webConfigModification in $webConfigModifications )

            {

                Write-Verbose "Found instance owned by NetFrameworkAuthorizedTypeUpdate"

                $contentService.WebConfigModifications.Remove( $webConfigModification ) | Out-Null

            }

            

            if( $webConfigModifications.Count -gt 0 )

            {

                $contentService.Update()

                $contentService.ApplyWebConfigModifications()

            }

        }

        end

        {

        }   

    }

    # will get the timerjob responsible for the web.config change deployment

    # Get-SPTimerJob | ? { $_.Name -eq "job-webconfig-modification" }

     

    # The command below will make the appropriate changes

    Add-CodeDomAuthorizedType

    # remove # below if you need to remove the web.config updates, you can with this function to retract the changes

    # Remove-CodeDomAuthorizedType