CA3076:安全ではない XSLT スクリプトの実行

プロパティ
ルール ID CA3076
Title 安全ではない XSLT スクリプトの実行
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

.NET アプリケーションで XSLT (Extensible Stylesheet Language Transformation) を安全ではない方法で実行すると、攻撃者に機密情報を漏えいする可能性のある、信頼されていない URI 参照がプロセッサにより解決されるおそれがあります。そのことは、サービス拒否攻撃やクロスサイト攻撃につながります。 詳しくは、XSLT のセキュリティに関する考慮事項 (.NET ガイド) に関するページをご覧ください。

規則の説明

XSLT は、XML データを変換するための W3C (World Wide Web Consortium) 規格です。 通常 XSLT は、XML データを他の形式 (HTML、固定長のテキスト、コンマ区切りのテキスト、または別の XML 形式など) に変換するために、スタイル シートを書き込むのに使用します。 既定では禁止になっていますが、プロジェクトに応じて有効にもできます。

攻撃にさらされないようにするため、悪意あるスクリプトの処理を許してしまうような、LoadXsltSettings のインスタンスの安全ではない組み合わせを XslCompiledTransform. XmlResolverが受け取った場合には常に、このルールがトリガーされます。

違反の修正方法

  • 安全ではない XsltSettings 引数を XsltSettings.Default と置き換えます。または、document 関数とスクリプトの実行を無効にしたインスタンスに置き換えます。

  • XmlResolver 引数を null または XmlSecureResolver インスタンスに置き換えます。

どのようなときに警告を抑制するか

入力が信頼できるソースからのものとわかっているのでない限り、この警告からのルールを抑制しないでください。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

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

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

疑似コードの例

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
        }
    }
}

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);
        }
    }
}

違反 - ドキュメント関数とスクリプトの実行が無効になっていない

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 { }
        }
    }
}

解決策 - ドキュメント関数とスクリプトの実行を無効にする

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 { }
        }
    }
}

関連項目