LINQ to XML-Sicherheit (C#)LINQ to XML Security (C#)

In diesem Thema werden Sicherheitsfragen im Zusammenhang mit LINQ to XML erörtert.This topic describes security issues associated with LINQ to XML. Darüber hinaus finden Sie hier einige Empfehlungen zur Minderung der Sicherheitsrisiken.In addition, it provides some guidance for mitigating security exposure.

Übersicht über die Sicherheit in LINQ to XMLLINQ to XML Security Overview

Bei der Entwicklung von LINQ to XML standen nicht die serverseitigen Anwendungen mit strengen Sicherheitsanforderungen, sondern eher das bequeme Programmieren im Vordergrund.LINQ to XML is designed more for programming convenience than for server-side applications with stringent security requirements. Die meisten XML-Szenarios beinhalten die Verarbeitung vertrauenswürdiger XML-Dokumente und nicht die Verarbeitung nicht vertrauenswürdiger XML-Dokumente, die auf einen Server hochgeladen werden.Most XML scenarios consist of processing trusted XML documents, rather than processing untrusted XML documents that are uploaded to a server. Genau für diese Szenarios ist LINQ to XML optimiert.LINQ to XML is optimized for these scenarios.

Wenn Sie nicht vertrauenswürdige Daten aus unbekannten Quellen verarbeiten müssen, empfiehlt Microsoft, eine Instanz der XmlReader-Klasse zu verwenden, die zum Herausfiltern bekannter XML-DoS-Angriffe (Denial of Service) konfiguriert wurde.If you must process untrusted data from unknown sources, Microsoft recommends that you use an instance of the XmlReader class that has been configured to filter out known XML denial of service (DoS) attacks.

Wenn Sie einen XmlReader zur Abwehr von DoS-Angriffen konfiguriert haben, können Sie mit diesem Reader eine LINQ to XML-Struktur auffüllen und damit ebenfalls von den Produktivitätsverbesserungen profitieren, die LINQ to XML für Entwickler bietet.If you have configured an XmlReader to mitigate denial of service attacks, you can use that reader to populate a LINQ to XML tree and still benefit from the programmer productivity enhancements of LINQ to XML. Bei vielen Abwehrstrategien werden Reader erstellt, die für die Minderung der Sicherheitsgefahr konfiguriert werden, und anschließend wird eine XML-Struktur durch den konfigurierten Reader instanziiert.Many mitigation techniques involve creating readers that are configured to mitigate the security issue, and then instantiating an XML tree through the configured reader.

XML an sich ist anfällig für DoS-Angriffe, da Dokumente in Größe, Tiefe, Elementnamengröße usw. unbegrenzt sind.XML is intrinsically vulnerable to denial of service attacks because documents are unbounded in size, depth, element name size, and more. Egal, welche Komponenten Sie zum Verarbeiten von XML verwenden, sollten Sie immer darauf vorbereitet sein, die Anwendungsdomäne wiederherzustellen, falls übermäßig viele Ressourcen verwendet werden.Regardless of the component that you use to process XML, you should always be prepared to recycle the application domain if it uses excessive resources.

Abwehr von XML-, XSD-, XPath- und XSLT-AngriffenMitigation of XML, XSD, XPath, and XSLT Attacks

LINQ to XML basiert auf XmlReader und XmlWriter.LINQ to XML is built upon XmlReader and XmlWriter. LINQ to XML unterstützt durch Erweiterungsmethoden in den Namespaces System.Xml.Schema und System.Xml.XPath XSD und XPath.LINQ to XML supports XSD and XPath through extension methods in the System.Xml.Schema and System.Xml.XPath namespaces. Mit den Klassen XmlReader, XPathNavigator und XmlWriter können Sie in Verbindung mit LINQ to XML XSLT zum Transformieren von XML-Strukturen aufrufen.Using the XmlReader, XPathNavigator, and XmlWriter classes in conjunction with LINQ to XML, you can invoke XSLT to transform XML trees.

In einer weniger sicheren Umgebung gibt es eine Reihe von Sicherheitsproblemen im Zusammenhang mit XML und der Verwendung der Klassen in System.Xml, System.Xml.Schema, System.Xml.XPath und System.Xml.Xsl.If you are operating in a less secure environment, there are a number of security issues that are associated with XML and the use of the classes in System.Xml, System.Xml.Schema, System.Xml.XPath, and System.Xml.Xsl. Dazu gehören u. a. folgende Probleme:These issues include, but are not limited to, the following:

  • XSD, XPath und XSLT sind zeichenfolgenbasierte Sprachen, in denen Sie Vorgänge angeben können, die zeit- oder speicherintensiv sind.XSD, XPath, and XSLT are string-based languages in which you can specify operations that consume a lot of time or memory. Es liegt in der Verantwortung des Anwendungsprogrammierers, der XSD-, XPath- oder XSLT-Zeichenfolgen aus nicht vertrauenswürdigen Quellen verwendet, zu validieren, dass die Zeichenfolgen nicht bösartig sind, oder zu überwachen und die Wahrscheinlichkeit zu verringern, dass die Auswertung dieser Zeichenfolgen zu einem übermäßig hohen Verbrauch der Systemressourcen führt.It is the responsibility of application programmers who take XSD, XPath, or XSLT strings from untrusted sources to validate that the strings are not malicious, or to monitor and mitigate the possibility that evaluating these strings will lead to excessive system resource consumption.

  • XSD-Schemas (auch Inlineschemas) sind von Natur aus anfällig für DoS-Angriffe. Sie sollten daher keine Schemas aus nicht vertrauenswürdigen Quellen akzeptieren.XSD schemas (including inline schemas) are inherently vulnerable to denial of service attacks; you should not accept schemas from untrusted sources.

  • XSD und XSLT können Verweise auf andere Dateien enthalten, und solche Verweise können zu zonen- und domänenübergreifenden Angriffen führen.XSD and XSLT can include references to other files, and such references can result in cross-zone and cross-domain attacks.

  • Externe Entitäten in DTDs können zu zonen- und domänenübergreifenden Angriffen führen.External entities in DTDs can result in cross-zone and cross-domain attacks.

  • DTDs sind anfällig für DoS-Angriffe.DTDs are vulnerable to denial of service attacks.

  • Ausgesprochen tief verschachtelte XML-Dokumente bergen die Gefahr von DoS-Angriffen. Es empfiehlt sich u. U., die Tiefe von XML-Dokumenten zu beschränken.Exceptionally deep XML documents can pose denial of service issues; you might want to limit the depth of XML documents.

  • Akzeptieren Sie keine unterstützenden Komponenten, wie NameTable-Objekte, XmlNamespaceManager-Objekte und XmlResolver-Objekte aus nicht vertrauenswürdigen Assemblys.Do not accept supporting components, such as NameTable, XmlNamespaceManager, and XmlResolver objects, from untrusted assemblies.

  • Lesen Sie Daten in Ausschnitten, um große Dokumentangriffe abzuwehren.Read data in chunks to mitigate large document attacks.

  • Skriptblöcke in XSLT-Stylesheets können eine Reihe von Angriffen möglich machen.Script blocks in XSLT style sheets can expose a number of attacks.

  • Nehmen Sie vor dem Konstruieren dynamischer XPath-Ausdrücke eine sorgfältige Validierung vor.Validate carefully before constructing dynamic XPath expressions.

Sicherheitsprobleme in LINQ to XMLLINQ to XML Security Issues

Die Aufzählung der in diesem Thema genannten Sicherheitsprobleme folgt keiner bestimmten Reihenfolge.The security issues in this topic are not presented in any particular order. Alle Probleme sind gleichermaßen wichtig und sollten entsprechend behandelt werden.All issues are important and should be addressed as appropriate.

Bei einem erfolgreichen Angriff durch Rechteerhöhung erhält die bösartige Assembly mehr Kontrolle über ihre Umgebung.A successful elevation of privilege attack gives a malicious assembly more control over its environment. Ein solcher erfolgreicher Angriff durch Rechteerweiterung kann die Offenlegung von Daten, die Verweigerung des Dienstes und vieles mehr zur Folge haben.A successful elevation of privilege attack can result in disclosure of data, denial of service, and more.

Anwendungen sollten Benutzern, die für das Anzeigen von Daten keine Berechtigungen besitzen, keine Daten offenlegen.Applications should not disclose data to users who are not authorized to see that data.

DoS-Angriffe führen dazu, dass der XML-Parser oder LINQ to XML übermäßig viel Speicher oder CPU-Zeit verbraucht.Denial of service attacks cause the XML parser or LINQ to XML to consume excessive amounts of memory or CPU time. Im Vergleich zu Angriffen durch Rechteerweiterung oder Angriffe, bei denen Daten offengelegt werden, gelten DoS-Angriffe als weniger schwerwiegend.Denial of service attacks are considered to be less severe than elevation of privilege attacks or disclosure of data attacks. In Szenarios, in denen ein Server XML-Dokumente aus nicht vertrauenswürdigen Quellen verarbeiten muss, sind sie dennoch von Bedeutung.However, they are important in a scenario where a server needs to process XML documents from untrusted sources.

Ausnahmen und Fehlermeldungen könnten Daten offenlegenExceptions and Error Messages Might Reveal Data

Fehlerbeschreibungen könnten für einen Angreifer wertvolle Informationen enthalten – von den zu transformierenden Daten über Dateinamen bis hin zu Implementierungsdetails.The description of an error might reveal data, such as the data being transformed, file names, or implementation details. Daher sollten Aufrufer, die nicht vertrauenswürdig sind, keine Fehlermeldungen angezeigt bekommen.Error messages should not be exposed to callers that are not trusted. Sie sollten alle Fehler abfangen und für die Fehlerberichterstattung Ihre eigenen benutzerdefinierten Fehlermeldungen verwenden.You should catch all errors and report errors with your own custom error messages.

Rufen Sie in einem Ereignishandler nicht "CodeAccessPermissions.Assert" aufDo Not Call CodeAccessPermissions.Assert in an Event Handler

Eine Assembly kann mehr oder weniger Berechtigungen besitzen.An assembly can have lesser or greater permissions. Je mehr Berechtigungen eine Assembly besitzt, desto größer ist ihre Kontrolle über den Computer und dessen Umgebungen.An assembly that has greater permissions has greater control over the computer and its environments.

Wenn Code in einer Assembly mit mehr Berechtigungen CodeAccessPermission.Assert in einem Ereignishandler aufruft und die XML-Struktur dann an eine bösartige Assembly übergeben wird, die nur eingeschränkte Berechtigungen besitzt, kann die bösartige Assembly zur Auslösung eines Ereignisses führen.If code in an assembly with greater permissions calls CodeAccessPermission.Assert in an event handler, and then the XML tree is passed to a malicious assembly that has restricted permissions, the malicious assembly can cause an event to be raised. Da das Ereignis den Code ausführt, der sich in der Assembly mit den umfangreicheren Berechtigungen befindet, würde die bösartige Assembly dann mit erweiterten Rechten operieren.Because the event runs code that is in the assembly with greater permissions, the malicious assembly would then be operating with elevated privileges.

Microsoft empfiehlt, CodeAccessPermission.Assert nie in einem Ereignishandler aufzurufen.Microsoft recommends that you never call CodeAccessPermission.Assert in an event handler.

DTDs sind nicht sicherDTDs are Not Secure

Entitäten in DTDs sind von Natur aus nicht sicher.Entities in DTDs are inherently not secure. Ein bösartiges XML-Dokument, das eine DTD enthält, kann Ursache dafür sein, dass der Parser den gesamten Arbeitsspeicher und die gesamte CPU-Zeit nutzt, sodass es zu einem DoS-Angriff kommt.It is possible for a malicious XML document that contains a DTD to cause the parser to use all memory and CPU time, causing a denial of service attack. In LINQ to XML ist die DTD-Verarbeitung aus diesem Grund standardmäßig deaktiviert.Therefore, in LINQ to XML, DTD processing is turned off by default. Sie sollten keine DTDs von nicht vertrauenswürdigen Quellen akzeptieren.You should not accept DTDs from untrusted sources.

Ein Beispiel für das Akzeptieren von DTDs aus nicht vertrauenswürdigen Quellen ist eine Internetanwendung, die es Internetbenutzern erlaubt, XML-Dateien hochzuladen, die auf eine DTD und eine DTD-Datei verweisen.One example of accepting DTDs from untrusted sources is a Web application that allows Web users to upload an XML file that references a DTD and a DTD file. Bei der Validierung der Datei könnte eine bösartige DTD einen DoS-Angriff auf Ihren Server starten.Upon validation of the file, a malicious DTD could execute a denial of service attack on your server. Ein anderes Beispiel für das Akzeptieren von DTDs aus nicht vertrauenswürdigen Quellen ist das Verweisen auf eine DTD auf einer Netzwerkfreigabe, die auch einen anonymen FTP-Zugriff zulässt.Another example of accepting DTDs from untrusted sources is to reference a DTD on a network share that also allows anonymous FTP access.

Vermeiden Sie übermäßige PufferzuordnungAvoid Excessive Buffer Allocation

Anwendungsentwickler müssen sich bewusst sein, dass extrem große Datenquellen eine Ressourcenüberlastung und DoS-Angriffe zur Folge haben können.Application developers should be aware that extremely large data sources can lead to resource exhaustion and denial of service attacks.

Wenn ein böswilliger Benutzer ein sehr großes XML-Dokument sendet oder hochlädt, kann das dazu führen, dass LINQ to XML übermäßig viele Systemressourcen verbraucht.If a malicious user submits or uploads a very large XML document, it could cause LINQ to XML to consume excessive system resources. Dies kann die Grundlage für einen DoS-Angriff sein.This can constitute a denial of service attack. Wenn Sie dies vermeiden möchten, können Sie die XmlReaderSettings.MaxCharactersInDocument-Eigenschaft festlegen und einen Reader erstellen, der die Größe der ladbaren Dokumente beschränkt.To prevent this, you can set the XmlReaderSettings.MaxCharactersInDocument property, and create a reader that is then limited in the size of document that it can load. Anschließend erstellen Sie mit dem Reader die XML-Struktur.You then use the reader to create the XML tree.

Wenn Sie z. B. wissen, dass sich die maximale erwartete Größe Ihrer von einer nicht vertrauenswürdigen Quelle stammenden XML-Dokumente auf unter 50 KBytes beläuft, legen Sie für XmlReaderSettings.MaxCharactersInDocument den Wert "100.000" fest.For example, if you know that the maximum expected size of your XML documents coming from an untrusted source will be less than 50K bytes, set XmlReaderSettings.MaxCharactersInDocument to 100,000. Die Verarbeitung der XML-Dokumente wird davon nicht negativ beeinflusst, und gleichzeitig verringert sich das Risiko von DoS-Angriffen, bei denen Dokumente hochgeladen werden, die große Mengen des Speichers in Anspruch nehmen.This will not encumber your processing of XML documents, and at the same time it will mitigate denial of service threats where documents might be uploaded that would consume large amounts of memory.

Vermeiden Sie eine exzessive EntitätserweiterungAvoid Excess Entity Expansion

Ein bekannter DoS-Angriff mit einer DTD besteht in der Verwendung eines Dokuments, das eine exzessive Entitätserweiterung zur Folge hat.One of the known denial of service attacks when using a DTD is a document that causes excessive entity expansion. Wenn Sie solche Angriffe vermeiden möchten, können Sie die XmlReaderSettings.MaxCharactersFromEntities-Eigenschaft festlegen und einen Reader erstellen, der die Anzahl der Zeichen beschränkt, die aus einer Entitätserweiterung resultieren.To prevent this, you can set the XmlReaderSettings.MaxCharactersFromEntities property, and create a reader that is then limited in the number of characters that result from entity expansion. Anschließend erstellen Sie mit dem Reader die XML-Struktur.You then use the reader to create the XML tree.

Schränken Sie die Tiefe der XML-Hierarchie einLimit the Depth of the XML Hierarchy

Ein möglicher DoS-Angriff besteht darin, ein Dokument zu senden, dass eine außerordentlich große Hierarchietiefe besitzt.One possible denial of service attack is when a document is submitted that has excessive depth of hierarchy. Wenn Sie solche Angriffe verhindern möchten, können Sie in Ihrer eigenen Klasse einen XmlReader umschließen, der die Tiefe der Elemente zählt.To prevent this, you can wrap a XmlReader in your own class that counts the depth of elements. Wenn die Tiefe ein vorher festgelegtes vernünftiges Maß übersteigt, können Sie die Verarbeitung des bösartigen Dokuments beenden.If the depth exceeds a predetermined reasonable level, you can terminate the processing of the malicious document.

Schützen Sie sich vor nicht vertrauenswürdigen "XmlReader"- oder "XmlWriter"-ImplementierungenProtect Against Untrusted XmlReader or XmlWriter Implementations

Administratoren müssen sicherstellen, dass alle extern bereitgestellten XmlReader-Implementierungen oder XmlWriter-Implementierungen starke Namen besitzen und in der Computerkonfiguration registriert sind.Administrators should verify that any externally supplied XmlReader or XmlWriter implementations have strong names and have been registered in the machine configuration. Auf diese Weise wird verhindert, dass bösartiger Code geladen wird, der sich als Reader oder Writer maskiert.This prevents malicious code masquerading as a reader or writer from being loaded.

Geben Sie regelmäßig Objekte frei, die auf "XName" verweisenPeriodically Free Objects that Reference XName

Um sich vor bestimmten Arten von Angriffen zu schützen, sollten Anwendungsprogrammierer in regelmäßigen Abständen alle Objekte freigeben, die auf ein XName-Objekt in der Anwendungsdomäne verweisen.To protect against certain kinds of attacks, application programmers should free all objects that reference an XName object in the application domain on a regular basis.

Schützen Sie sich vor zufälligen XML-NamenProtect Against Random XML Names

Für Anwendungen, die Daten aus nicht vertrauenswürdigen Quellen nehmen, sollte die Verwendung eines XmlReader in Erwägung gezogen werden, der von benutzerdefiniertem Code umschlossen wird und nach möglichen zufälligen XML-Namen und -Namespaces sucht.Applications that take data from untrusted sources should consider using an XmlReader that is wrapped in custom code to inspect for the possibility of random XML names and namespaces. Wenn solche zufälligen XML-Namen und -Namespaces entdeckt werden, kann die Anwendung die Verarbeitung des bösartigen Dokuments abbrechen.If such random XML names and namespaces are detected, the application can then terminate the processing of the malicious document.

Sie können die Anzahl der Namen in einem Namespace (einschließlich von Namen, die sich nicht in einem Namespace befinden) auf ein vernünftiges Maß beschränken.You might want to limit the number of names in any given namespace (including names in no namespace) to a reasonable limit.

Auf Anmerkungen kann von Softwarekomponenten aus zugegriffen werden, die gemeinsam eine LINQ to XML-Struktur nutzenAnnotations Are Accessible by Software Components that Share a LINQ to XML Tree

Mit LINQ to XML könnten Verarbeitungspipelines erstellt werden, in denen verschiedene Anwendungskomponenten geladen, validiert, abgefragt, transformiert, aktualisiert und XML-Daten gespeichert werden, die zwischen Komponenten als XML-Strukturen übergeben werden.LINQ to XML could be used to build processing pipelines in which different application components load, validate, query, transform, update, and save XML data that is passed between components as XML trees. Dies kann zur Optimierung der Leistung beitragen, weil der Mehraufwand für das Laden und Serialisieren von Objekten in XML-Text nur an den Enden der Pipeline entsteht.This can help optimize performance, because the overhead of loading and serializing objects to XML text is done only at the ends of the pipeline. Entwickler müssen sich aber bewusst sein, dass alle Anmerkungen und Ereignishandler, die von einer Komponente erstellt werden, auch für andere Komponenten verfügbar sind.Developers must be aware, however, that all annotations and event handlers created by one component are accessible to other components. Wenn die Komponenten ein unterschiedliches Maß an Vertrauenswürdigkeit besitzen, kann dies zu einer Reihe von Sicherheitsrisiken führen.This can create a number of vulnerabilities if the components have different levels of trust. Wenn Sie sichere Pipelines auch mit weniger vertrauenswürdigen Komponenten erstellen möchten, müssen sie LINQ to XML-Objekte in XML-Text serialisieren, bevor die Daten an eine nicht vertrauenswürdige Komponente übergeben werden.To build secure pipelines across less trusted components, you must serialize LINQ to XML objects to XML text before passing the data to an untrusted component.

Ein gewisses Maß an Sicherheit wird durch die CLR (Common Language Runtime) bereitgestellt.Some security is provided by the common language runtime (CLR). So kann z. B. eine Komponente, die keine private Klasse enthält, auch nicht auf Anmerkungen zugreifen, die von dieser Klasse verschlüsselt wurden.For example, a component that does not include a private class cannot access annotations keyed by that class. Es ist aber möglich, dass Komponenten Anmerkungen löschen können, die sie gar nicht lesen können.However, annotations can be deleted by components that cannot read them. Dieses Verhalten könnte für einen Manipulationsangriff missbraucht werden.This could be used as a tampering attack.

Siehe auchSee Also

Programming Guide (LINQ to XML) (C#) (Programmierhandbuch (LINQ to XML) (C#))Programming Guide (LINQ to XML) (C#)