CA3076: Execução de script XSLT não seguro

Property Valor
ID da regra CA3076
Título Execução de script XSLT não seguro
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Se você executar XSLT (Extensible Stylesheets Language Transformations) em aplicativos .NET de maneira não segura, o processador poderá resolver referências de URI não confiáveis que poderiam divulgar informações confidenciais a invasores, resultando em ataques entre sites e de negação de serviço. Para saber mais, confira Considerações sobre segurança do XSLT (Guia do .NET).

Descrição da regra

O XSLT é um padrão W3C (World Wide Web Consortium) para transformar dados XML. O XSLT normalmente é usado para gravar folhas de estilo para transformar dados XML em outros formatos, como HTML, texto de comprimento fixo, texto separado por vírgula ou um formato XML diferente. Embora proibido por padrão, você pode optar por habilitá-lo para seu projeto.

Para garantir que você não esteja expondo uma superfície de ataque, essa regra é disparada sempre que o XslCompiledTransform.Load recebe instâncias de combinação inseguras de XsltSettings e XmlResolver, o que permite o processamento de script mal-intencionado.

Como corrigir violações

  • Substitua o argumento XsltSettings inseguro por XsltSettings.Default ou com uma instância que desabilitou a função de documento e a execução do script.

  • Substitua o argumento XmlResolver por nulo ou uma instância XmlSecureResolver.

Quando suprimir avisos

A menos que você tenha certeza de que se sabe que a entrada vem de uma fonte confiável, não suprima uma regra desse aviso.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA3076
// The code that's violating the rule is on this line.
#pragma warning restore CA3076

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA3076.severity = none

Para obter mais informações, confira Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Violação que usa XsltSettings.TrustedXslt

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
         void TestMethod()
        {
             XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
             var settings = XsltSettings.TrustedXslt;
             var resolver = new XmlUrlResolver();
             xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
        }
    }
}

Solução que usa XsltSettings.Default

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        void TestMethod()
        {
            XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
            var settings = XsltSettings.Default;
            var resolver = new XmlUrlResolver();
            xslCompiledTransform.Load("testStylesheet", settings, resolver);
        }
    }
}

Violação – a função de documento e a execução do script não estão desabilitadas

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod(XsltSettings settings)
        {
            try
            {
                XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
                var resolver = new XmlUrlResolver();
                xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
            }
            catch { throw; }
            finally { }
        }
    }
}

Solução – desabilitar a função de documento e a execução de script

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod(XsltSettings settings)
        {
            try
            {
                XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
                settings.EnableDocumentFunction = false;
                settings.EnableScript = false;
                var resolver = new XmlUrlResolver();
                xslCompiledTransform.Load("testStylesheet", settings, resolver);
            }
            catch { throw; }
            finally { }
        }
    }
}

Confira também