web-dev-qa-db-ja.com

C#で外部エンティティ解決を無効にするようにXMLパーサーを構成する方法

var xDoc = XDocument.Load(fileName);

上記のコードをXMLファイルをロードする関数で使用しています。機能的には機能的には問題ありませんが、Veracodeチェック後にVeracodeの問題が発生しています。

説明

製品は、意図された制御範囲外のドキュメントに解決されるURLを持つXMLエンティティを含むことができるXMLドキュメントを処理します。これにより、製品は誤ったドキュメントを出力に埋め込みます。デフォルトでは、XMLエンティティリゾルバは外部参照の解決と取得を試みます。攻撃者が制御するXMLをこれらの機能のいずれかに送信できる場合、攻撃者は内部ネットワーク、ローカルファイルシステム、またはその他の機密データに関する情報にアクセスする可能性があります。これは、XML eXternal Entity(XXE)攻撃として知られています。

推奨

XMLパーサーを構成して、外部エンティティーの解決を無効にします。

それを解決するために私がする必要があること

カスタムXmlResolverを実装し、それをXMLの読み取りに使用します。デフォルトでは、解決された参照を自動的にダウンロードするXmlUrlResolverが使用されます。

public class CustomResolver : XmlUrlResolver
{
    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        // base calls XmlUrlResolver.DownloadManager.GetStream(...) here
    }
}

次のように使用します。

var settings = new XmlReaderSettings { XmlResolver = new CustomResolver() };
var reader = XmlReader.Create(fileName, settings);
var xDoc = XDocument.Load(reader);
4
György Kőszeg

XMLで外部エンティティ参照を使用していない場合は、 XXE攻撃を防ぐ方法(XmlDocument in .net)からnullに設定してリゾルバーを無効にできます

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(OurOutputXMLString);

ドキュメントにエンティティ参照が含まれることを期待している場合は、カスタムリゾルバとホワイトリストを作成して、期待しているものを作成する必要があります。 特に、あなたが管理していないウェブサイトへの参照。

13
Casey

公式のOWASPドキュメントによると、これを行う必要があります。

XercesDOMParserを使用すると、XXEを防止できます。

XercesDOMParser *parser = new XercesDOMParser;
parser->setCreateEntityReferenceNodes(false);

SAXParserを使用して、XXEを防ぐためにこれを行います。

SAXParser* parser = new SAXParser;
parser->setDisableDefaultEntityResolution(true);

SAX2XMLReaderを使用して、XXEを防ぐためにこれを行います。

SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);

これらのガイドをご覧ください: https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

2
jfcorugedo