Professional Documents
Culture Documents
An Toàn Web
An Toàn Web
C/C++
Libxml2:
The Enum xmlParserOption không nên có các tùy chọn sau được định nghĩa:
XML_PARSE_NOENT: Mở rộng các thực thể và thay thế chúng bằng văn
bản thay thế.
XML_PARSE_DTDLOAD: Tải DTD bên ngoài.
Bắt đầu với libxml2 phiên bản 2.9, XXE đã bị tắt theo mặc định như cam kết của
bản vá sau.
Tìm kiếm cách sử dụng các APIs sau để đảm bảo không có XML_PARSE_NOENT
và XML_PARSE_DTDLOAD được xác định trong các tham số:
xmlCtxtReadDoc
xmlCtxtReadFd
xmlCtxtReadFile
xmlCtxtReadIO
xmlCtxtReadMemory
xmlCtxtUseOptions
xmlParseInNodeContext
xmlReadDoc
xmlReadFd
xmlReadFile
xmlReadIO
xmlReadMemory
Libxerces-c
Sử dụng XercesDOMParser để ngăn XXE:
XercesDOMParser *parser = new XercesDOMParser;
parser->setCreateEntityReferenceNodes(true);
parser->setDisableDefaultEntityResolution(true);
JAVA
Các ứng dụng Java sử dụng các thư viện XML đặc biệt dễ bị tấn công bởi XXE vì
các cài đặt mặc định cho hầu hết các trình phân tích cú pháp Java XML là phải bật
XXE. Để sử dụng các trình phân tích cú pháp này một cách an toàn, ta phải vô hiệu
hóa XXE trong trình phân tích cú pháp mà bạn sử dụng. 1 số mô tả cách tắt XXE
trong các trình phân tích cú pháp XML được sử dụng phổ biến nhất cho Java.
JAXP DocumentBuilderFactory, SAXParserFactory and DOM4J
DocumentBuilderFactory, SAXParserFactory và DOM4J XML Parsers có thể
được cấu hình bằng các kỹ thuật tương tự để bảo vệ chúng chống lại XXE.
Chỉ có ví dụ DocumentBuilderFactory được trình bày ở đây. Phương thức JAXP
DocumentBuilderFactory setFeature) cho phép nhà phát triển kiểm soát các tính
năng bộ xử lý XML dành riêng cho việc triển khai nào được bật hoặc tắt.
Các tính năng có thể được đặt trên nhà máy hoặc phương thức setReature
XMLReader nằm bên dưới.
Mỗi triển khai bộ xử lý XML có các tính năng riêng chi phối cách xử lý các DTD
và các thực thể bên ngoài.
Đối với syntax highlighted đoạn mã ví dụ bằng SAXParserFactory:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; // catching unsupported features
...
// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
// JDK7+ - http://xml.org/sax/features/external-parameter-entities
FEATURE = "http://xml.org/sax/features/external-parameter-entities";
dbf.setFeature(FEATURE, false);
// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
// And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then
// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
// (http://cwe.mitre.org/data/definitions/918.html) and denial
// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
Xerces 1 Features:
Không bao gồm các thực thể bên ngoài bằng cách đặt feature này thành false.
Không bao gồm các thực thể tham số bằng cách đặt feature này thành false.
Không bao gồm các DTD bên ngoài bằng cách đặt feature này thành false.
Xerces 2 Features:
Không cho phép một DTD nội tuyến bằng cách đặt feature này thành đúng.
Không bao gồm các thực thể bên ngoài bằng cách đặt feature này thành false.
Không bao gồm các thực thể tham số bằng cách đặt feature này thành false.
Không bao gồm các DTD bên ngoài bằng cách đặt feature này thành false.
Lưu ý: Các biện pháp bảo vệ ở trên yêu cầu cập nhật Java 7 67, cập nhật Java 8 20 hoặc cao hơn, vì các
biện pháp đối phó ở trên đối với DocumentBuilderFactory và SAXParserFactory đã bị phá vỡ trong các
phiên bản Java trước đó, theo: CVE-2014-6517.
TransformerFactory
Để bảo vệ một javax.xml.transform.TransformerFactory khỏi XXE:
ransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
Validator
Để bảo vệ một javax.xml.validation.Validator khỏi XXE:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
SchemaFactory
Để bảo vệ một javax.xml.validation.SchemaFactory khỏi XXE:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
Schema schema = factory.newSchema(Source);
SAXTransformerFactory
Để bảo vệ một javax.xml.transform.sax.SAXTransformerFactory khỏi XXE:
SAXTransformerFactory sf = SAXTransformerFactory.newInstance();
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
sf.newXMLFilter(Source);
Lưu ý: Việc sử dụng các XMLConstants sau đây yêu cầu JAXP 1.5, được thêm vào Java trong 7u40 và
Java 8:
javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD
javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA
javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET
XMLReader
Để bảo vệ một org.xml.sax.XMLReader khỏi XXE:
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// This may not be strictly required as DTDs shouldn't be allowed at all, per previous line.
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
SAXReader
Để bảo vệ một org.dom4j.io.SAXReader khỏi XXE:
saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
saxReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Dựa trên thử nghiệm, nếu thiếu một trong số này, vẫn có thể dễ bị tấn công XXE
attack.
SAXBuilder
Để bảo vệ một org.jdom2.input.SAXBuilder khỏi XXE:
SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
builder.setFeature("http://xml.org/sax/features/external-general-entities", false);
builder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Document doc = builder.build(new File(fileName));
No-op EntityResolver
Đối với các API sử dụng EntityResolver, bạn có thể vô hiệu hóa khả năng của trình
phân tích cú pháp XML để giải quyết các thực thể bằng cách: cung cấp một a no-op
implementation:
// ...
xmlReader.setEntityResolver(new NoOpEntityResolver());
documentBuilder.setEntityResolver(new NoOpEntityResolver());
JAXB Unmarshaller
Do javax.xml.bind.Unmarshaller phân tích cú pháp XML và không hỗ trợ bất kỳ cờ nào để
vô hiệu hóa XXE, nên trước tiên phải phân tích cú pháp XML không tin cậy thông
qua trình phân tích cú pháp bảo mật có thể định cấu hình, tạo đối tượng nguồn và
chuyển đối tượng nguồn sang Unmarshaller. Ví dụ:
//Disable XXE
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
java.beans.XMLDecoder
Phương thức readObject() trong lớp này về cơ bản không an toàn.
XML không chỉ phân tích cú pháp theo XXE, nhưng phương thức này có thể sử
dụng để xây dựng bất kỳ Java object nào , và thực thi mã tùy ý như được mô tả ở
đây(execute arbitrary code as described here .).
Và không có cách nào để sử dụng lớp này an toàn ngoại trừ tin tưởng hoặc xác
nhận hợp lệ đầu vào được truyền vào nó.
Do đó, chúng tôi thực sự khuyên bạn nên tránh hoàn toàn việc sử dụng lớp này và
thay thế nó bằng trình phân tích cú pháp XML an toàn hoặc được cấu hình đúng
như được mô tả ở nơi khác trong bảng cheat này.
Other XML Parsers
Có nhiều thư viện bên thứ 3 phân tích cú pháp XML trực tiếp hoặc thông qua việc
sử dụng các thư viện khác của họ. Có thể test và xác minh trình phân tích cú pháp
XML của họ được bảo mật chống lại XXE theo mặc định. Nếu trình phân tích cú
pháp không an toàn theo mặc định, hãy tìm các cờ được trình phân tích cú pháp hỗ
trợ để vô hiệu hóa tất cả các vùi tài nguyên bên ngoài có thể như các ví dụ đã nêu ở
trên. Nếu không có kiểm soát nào được đưa ra bên ngoài, trước tiên hãy đảm bảo
nội dung không tin cậy được chuyển qua trình phân tích cú pháp bảo mật và sau đó
được chuyển đến trình phân tích cú pháp của bên thứ 3 không an toàn tương tự như
cách bảo mật của Unmarshaller.
Có những vấn đề khác cũng đã được khắc phục sau đó, vì vậy để giải quyết đầy
đủ những vấn đề này, Spring khuyên người dùng nên nâng cấp lên Spring
Framework 3.2.8+ hoặc 4.0.2+.
Đối với Spring OXM, điều này đề cập đến việc sử dụng
org.springframework.oxm.jaxb.Jaxb2Marshaller. Lưu ý rằng CVE cho Spring
OXM chỉ ra cụ thể rằng 2 tình huống phân tích cú pháp XML tùy thuộc vào nhà
phát triển để xử lý đúng và 2 là trách nhiệm của Spring và đã được sửa để giải
quyết CVE này.
Đối với DOMSource, XML đã được phân tích cú pháp bởi mã người dùng và
mã đó chịu trách nhiệm bảo vệ chống lại XXE.
Đối với StAXSource, XMLStreamReader đã được tạo bởi mã người dùng và
mã đó chịu trách nhiệm bảo vệ chống lại XXE.
Đối với các phiên bản SAXSource và StreamSource, Spring đã xử lý các thực
thể bên ngoài theo mặc định do đó tạo ra lỗ hổng này.
Vì vậy, theo Spring OXM CVE writeup , ở trên là an toàn. Nhưng nếu bạn sử dụng
DOMSource hoặc StAXSource thay vào đó, có thể cấu hình các nguồn đó để an
toàn từ XXE.
Castor
Castor là một khung liên kết dữ liệu cho Java. Nó cho phép chuyển đổi giữa các
đối tượng Java, XML và các bảng quan hệ. Các tính năng XML trong Castor trước
phiên bản 1.3.3 dễ bị tấn công bởi XXE và nên được nâng cấp lên phiên bản mới
nhất. Để biết thêm thông tin, hãy kiểm tra tệp cấu hình XML configuration file .
.NET
Thông tin sau đây về tiêm XXE trong .NET là trực tiếp từ web application of unit tests
by Dean Fleming.
Ứng dụng web này bao gồm tất cả các trình phân tích cú pháp .NET XML hiện
được hỗ trợ và có các trường hợp thử nghiệm cho từng trình diễn khi chúng an toàn
khỏi tiêm XXE và khi nào thì không.
Trước đây, thông tin này được dựa trên bài viết James Jardine's excellent .NET XXE
article.
Ban đầu, nó cung cấp nhiều thông tin gần đây và chi tiết hơn so với bài viết cũ của
James Jardine's excellent .NET XXE article ., tuy nhiên, nó có một số điểm không chính
xác mà ứng dụng web đưa ra.
Bảng sau liệt kê tất cả các trình phân tích cú pháp .NET XML được hỗ trợ và các
mức an toàn mặc định của chúng:
XmlDictionaryReader Yes
XmlDocument
...prior to 4.5.2 No
XmlNodeReader Yes
XmlReader Yes
XML Parser Safe by default?
XmlTextReader
...prior to 4.5.2 No
XPathNavigator
...prior to 4.5.2 No
XslCompiledTransform Yes
LINQ to XML
Cả hai đối tượng XElement và XDocument trong thư viện System.Xml.Linq đều an toàn
khi tiêm XXE theo mặc định XElement chỉ phân tích các phần tử trong tệp XML, do
đó các DTD bị bỏ qua hoàn toàn. XDocument có các DTD bị tắt theo mặc
định( disabled by default ) và chỉ không an toàn nếu được xây dựng với trình phân
tích cú pháp XML không an toàn khác.
XmlDictionaryReader
System.Xml.XmlDictionaryReader theo mặc định là an toàn, vì khi nó cố phân tích
DTD, trình biên dịch sẽ đưa ra một ngoại lệ nói rằng "các phần tử CData không
hợp lệ ở cấp cao nhất của tài liệu XML". Nó trở nên không an toàn nếu được xây
dựng với trình phân tích cú pháp XML không an toàn khác.
XmlDocument
Trước .NET Framework phiên bản 4.5.2, System.Xml.XmlDocument không an toàn
theo mặc định. Đối tượng XmlDocument có một đối tượng XmlResolver bên trong nó
cần được đặt thành null trong các phiên bản trước 4.5.2. Trong các phiên bản 4.5.2
trở lên, XmlResolver này được đặt thành null theo mặc định.
Ví dụ dưới đây cho thấy cách nó được thực hiện an toàn:
static void LoadXML()
{
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM
'file:///C:/Users/testdata2.txt'>]>"
+ "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;
XmlNodeReader
Các đối tượng System.Xml.XmlNodeReader an toàn theo mặc định và sẽ bỏ qua các
DTD ngay cả khi được xây dựng với trình phân tích cú pháp không an toàn hoặc
được bọc trong một trình phân tích cú pháp không an toàn khác.
XmlReader
Các đối tượng System.Xml.XmlReader được an toàn theo mặc định.
Chúng được đặt theo mặc định để đặt thuộc tính ProhibitDtd của chúng thành false
trong các phiên bản .NET Framework 4.0 trở về trước hoặc thuộc tính
DtdProcessing của chúng được đặt thành Prohibit trong phiên bản .NET 4.0 trở lên.
Ngoài ra, trong các phiên bản .NET 4.5.2 trở lên, XmlReaderSettings thuộc XmlReader
có XmlResolver được đặt thành null theo mặc định, cung cấp thêm một lớp an toàn.
Do đó, các đối tượng XmlReader sẽ chỉ trở nên không an toàn trong phiên bản 4.5.2
trở lên nếu cả thuộc tính DtdProcessing được đặt thành Parse và XmlReaderSetting của
XmlResolver được đặt thành XmlResolver không có cài đặt mặc định hoặc không an
toàn. Nếu bạn cần kích hoạt xử lý DTD, các hướng dẫn về cách thực hiện một cách
an toàn được mô tả chi tiết trong bài viết referenced MSDN article.
XmlTextReader
không an toàn theo mặc định trong các phiên bản .NET
System.Xml.XmlTextReader
Framework trước 4.5.2. Đây là cách làm cho nó an toàn trong các phiên bản .NET
khác nhau:
Trước .NET 4.0
Trong các phiên bản .NET Framework trước 4.0, hành vi phân tích cú pháp DTD
cho các đối tượng XmlReader như XmlTextReader được kiểm soát bởi thuộc tính
Boolean ProhibitDtd được tìm thấy trong các lớp System.Xml.XmlReaderSettings và
System.Xml.XmlTextReader classes.
Đặt các giá trị này thành true để tắt hoàn toàn các DTD inline.
XmlTextReader reader = new XmlTextReader(stream);
// NEEDED because the default is FALSE!!
reader.ProhibitDtd = true;
Tuy nhiên, họ đã không thay đổi cài đặt mặc định nên XmlTextReader vẫn dễ bị XXE
mặc định.
Đặt DtdProcessing thành Prohibit khiến cho bộ thực thi đưa ra một ngoại lệ nếu một
phần tử <! DOCTYPE> có trong XML.
Để tự đặt giá trị này:
XmlTextReader reader = new XmlTextReader(stream);
// NEEDED because the default is Parse!!
reader.DtdProcessing = DtdProcessing.Prohibit;
Ngoài ra, ta có thể đặt thuộc tính DtdProcessing thành Ignore, điều này sẽ không gây
ra ngoại lệ khi gặp phần tử <! DOCTYPE> mà sẽ bỏ qua nó và không xử lý nó.
Cuối cùng, ta có thể đặt DtdProcessing thành Parse nếu bạn muốn cho phép và xử lý
các DTD inline.
Bạn có thể làm cho XPathNavigator an toàn bằng cách cung cấp cho nó một trình
phân tích cú pháp an toàn như XmlReader (mặc định là an toàn) trong XPathDocument
constructor.
Đây là một ví dụ:
XmlReader reader = XmlReader.Create("example.xml");
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
string xml = nav.InnerXml.ToString();
XslCompiledTransform
System.Xml.Xsl.XslCompiledTransform(một biến XML) theo mặc định là an toàn miễn
là trình phân tích cú pháp được cung cấp là an toàn.
Theo mặc định, nó an toàn vì trình phân tích cú pháp mặc định của các phương
thức Transform() là XmlReader, theo mặc định là an toàn (theo ở trên).
Mã nguồn cho phương pháp này:
http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/f
x/src/Xml/System/Xml/Xslt/XslCompiledTransform@cs/1305376/XslCompiledTransform@cs .
Một số phương thức Transform () chấp nhận XmlReader hoặc IXPathNavigable (ví
dụ: XmlDocument) làm đầu vào và nếu ta chuyển qua XML Parser không an toàn
thì Transform cũng sẽ không an toàn.
IOS
libxml2
iOS bao gồm thư viện libxml2 C / C ++ được mô tả ở trên, do đó, hướng dẫn sẽ
được áp dụng nếu đang sử dụng libxml2 trực tiếp.
Tuy nhiên, phiên bản libxml2 được cung cấp qua iOS6 trước phiên bản 2.9 của
libxml2 (bảo vệ chống lại XXE theo mặc định).
NSXMLDocument
iOS cũng cung cấp loại NSXMLDocument, được xây dựng dựa trên libxml2.
Tuy nhiên, NSXMLDocument cung cấp một số biện pháp bảo vệ bổ sung chống lại XXE
không có sẵn trong libxml2.
Trên phần 'API giới hạn thực thể bên ngoài NSXMLDocument' của trang :
https://developer.apple.com/library/ios/#releasenotes/Foundation/RN-Foundation-
iOS/Foundation_iOS5.html
iOS4 trở về trước: Tất cả các thực thể bên ngoài được tải theo mặc định.
iOS5 trở lên: Chỉ các thực thể không yêu cầu truy cập mạng mới được tải.
(an toàn hơn)
Tuy nhiên, để vô hiệu hóa hoàn toàn XXE trong NSXMLDocument trong bất kỳ phiên
bản iOS nào, bạn chỉ cần chỉ định NSXMLNodeLoadExternalEntitiesNever khi tạo
NSXMLDocument .
PHP
Theo the PHP documentation, nên đặt các mục sau đây khi sử dụng default PHP
XML parser của PHP để ngăn XXE:
libxml_disable_entity_loader(true);
Một mô tả về cách lạm dụng điều này trong PHP được trình bày trong một bài viết
hay SensePost article mô tả một lỗ hổng XXE dựa trên PHP tuyệt vời đã được sửa
trong Facebook.
Python
The Python 3 official documentation chứa một phần về xml vulnerabilities . Đối với
Python 2, bạn có thể tham khảo trang: https://docs.python.org/2/library/xml.html#xml-
vulnerabilities.
Bảng sau đây cung cấp tổng quan về các mô-đun khác nhau trong Python 3 được
sử dụng để phân tích cú pháp XML và liệu chúng có dễ bị khai thác hay không.
e e e e
External Entity
Safe Safe Safe Safe Safe
Expansion
Decompression
Safe Safe Safe Safe Vulnerable
Bomb
Để bảo vệ ứng dụng của khỏi các cuộc tấn công applicable attacks, two packages
tồn tại để giúp ta bảo đầu vào và bảo vệ ứng dụng khỏi DDoS và các cuộc tấn
công từ xa.
XML Security
Thông số kỹ thuật cho các lược đồ XML và XML bao gồm nhiều lỗi bảo mật.
Đồng thời, các thông số kỹ thuật này cung cấp các công cụ cần thiết để bảo vệ các
ứng dụng XML. Sử dụng các lược đồ XML để xác định tính bảo mật của tài liệu
XML, chúng có thể được sử dụng để thực hiện một loạt các cuộc tấn công: file
retrieval, server side request forgery, port scanning, or brute forcing. Tài liệu XML
không đúng định dạng: các lỗ hổng sử dụng các tài liệu không được định dạng tốt.
Có thể tham khảo phần XML security trên https://cheatsheetseries.owasp.org/ :
URL: https://cheatsheetseries.owasp.org/cheatsheets/XML_Security_Cheat_Sheet.html .