前言:
当前兄弟们对“apachejaxpjar”大约比较珍视,你们都需要分析一些“apachejaxpjar”的相关内容。那么小编在网摘上网罗了一些对于“apachejaxpjar””的相关内容,希望我们能喜欢,你们一起来学习一下吧!JAVA漏洞代码示例1
class XXE { private static void receiveXMLStream(InputStream inStream, DefaultHandler defaultHandler) throws ParserConfigurationException, SAXException, IOException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(inStream, defaultHandler); // process xml data } public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { try { receiveXMLStream(new FileInputStream("evil.xml"), new DefaultHandler()); } catch (java.net.MalformedURLException mue) { System.err.println("Malformed URL Exception: " + mue); } }}
如果evil.xml文件包含以下内容,该程序将受到XML实体扩展攻击:
<?xml version="1.0" ?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "; >]> <foo>&xxe;</foo>
解析后,evil.xml文件将包含应用程序所在主机的/etc/passwd文件的内容。该攻击可以被利用来窃取任意文件,发起服务器端请求伪造攻击(例如,从受害应用程序的网络角度扫描端口)并执行拒绝服务。
如何防护
使用XML库的Java应用程序特别容易受到XXE的攻击,因为大多数Java XML解析器的默认设置是启用XXE。要安全地使用这些解析器,必须显式地禁用所使用解析器中的XXE。下面介绍如何在最常用的Java XML解析器中禁用XXE。
JAXP DocumentBuilderFactory, SAXParserFactory 和 DOM4J
DocumentBuilderFactory、SAXParserFactory和DOM4J XML解析器可以使用相同的技术进行配置,以保护它们不受XXE的影响。
JAXP DocumentBuilderFactory setFeature方法允许开发人员控制启用或禁用哪些XML处理器特性。
这些特性既可以在Factory上设置,也可以在底层XMLReader setFeature方法上设置。
每个XML处理器都有自己的特性来控制如何处理dtd和外部实体。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();String FEATURE = null;try { // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all // XML entity attacks are prevented // Xerces 2 only - FEATURE = ";; dbf.setFeature(FEATURE, true); // If you can't completely disable DTDs, then at least do the following: // Xerces 1 - // Xerces 2 - // JDK7+ - FEATURE = ";; dbf.setFeature(FEATURE, false); // Xerces 1 - // Xerces 2 - // JDK7+ - FEATURE = ";; dbf.setFeature(FEATURE, false); // Disable external DTDs as well FEATURE = ";; 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 // () and denial // of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk." // remaining parser logic} catch (ParserConfigurationException e) { // This should catch a failed setFeature feature logger.info("ParserConfigurationException was thrown. The feature '" + FEATURE + "' is probably not supported by your XML processor.");} catch (SAXException e) { // On Apache, this should be thrown when disallowing DOCTYPE logger.warning("A DOCTYPE was passed into the XML document");} catch (IOException e) { // XXE that points to a file that doesn't exist logger.error("IOException occurred, XXE may still possible: " + e.getMessage());}// Load XML file or stream using a XXE agnostic configured parserDocumentBuilder safebuilder = dbf.newDocumentBuilder();
Xerces 1特性:
不要通过将设置为false来包含外部实体。不要通过将设置为false来包含参数实体。不要通过将设置为false来包含外部dtd。
Xerces 2特性:
通过将设置为true来禁止内联DTD。不要通过将设置为false来包含外部实体。不要通过将设置为false来包含参数实体。不要通过将设置为false来包含外部dtd。
注意:上述防御需要Java 7更新67,Java 8更新20或更高版本,因为上述针对DocumentBuilderFactory和SAXParserFactory的防御措施在较早的Java版本中被破坏了(相关漏洞编号:CVE-2014-6517)。
XMLInputFactory (a StAX parser)
诸如XMLInputFactory之类的StAX解析器允许设置各种属性和特性。来保护Java XMLInputFactory不受XXE攻击:
// This disables DTDs entirely for that factoryxmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // disable external entitiesxmlInputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);TransformerFactory
保护javax.xml.transform.TransformerFactory不受XXE影响:
TransformerFactory tf = TransformerFactory.newInstance();tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");Validator
保护javax.xml.validation.Validator不受XXE影响:
SchemaFactory factory = SchemaFactory.newInstance(";);Schema schema = factory.newSchema();Validator validator = schema.newValidator();validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");SchemaFactory
保护javax.xml.validation.SchemaFactory 不受XXE影响
SchemaFactory factory = SchemaFactory.newInstance(";);factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");Schema schema = factory.newSchema(Source);SAXTransformerFactory
保护javax.xml.transform.sax.SAXTransformerFactory不受XXE影响:
SAXTransformerFactory sf = SAXTransformerFactory.newInstance();sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");sf.newXMLFilter(Source);
注意:使用以下XMLConstants需要JAXP 1.5,它是在7u40和Java 8中添加到Java中的:
javax.xml.XMLConstants.ACCESS_EXTERNAL_DTDjavax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMAjavax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEETXMLReader
保护Java org.xml.sax.XMLReader不受XXE影响:
XMLReader reader = XMLReaderFactory.createXMLReader();reader.setFeature(";, true);// This may not be strictly required as DTDs shouldn't be allowed at all, per previous line.reader.setFeature(";, false); reader.setFeature(";, false);reader.setFeature(";, false);SAXReader
保护Java org.dom4j.io. SAXReader不受XXE影响
saxReader.setFeature(";, true);saxReader.setFeature(";, false);saxReader.setFeature(";, false);
根据测试,如果您缺少其中之一,您仍然容易受到XXE攻击。
SAXBuilder
保护Java org.jdom2.input.SAXBuilder 免受XXE影响:
SAXBuilder builder = new SAXBuilder();builder.setFeature(";,true);builder.setFeature(";, false);builder.setFeature(";, false);Document doc = builder.build(new File(fileName));No-op EntityResolver
对于接受EntityResolver的api,你可以通过实现一个no-op来抵消XML解析器解析实体的能力:
public final class NoOpEntityResolver implements EntityResolver { public InputSource resolveEntity(String publicId, String systemId) { return new InputSource(new StringReader("")); }}xmlReader.setEntityResolver(new NoOpEntityResolver());documentBuilder.setEntityResolver(new NoOpEntityResolver());JAXB Unmarshaller
由于javax.xml.bind.Unmarshaller解析XML,并且不支持禁用XXE的任何标志,因此必须首先通过可配置的安全解析器解析不受信任的XML,生成一个源对象,并将源对象传递给解组器。例如:
//Disable XXESAXParserFactory spf = SAXParserFactory.newInstance();spf.setFeature(";, false);spf.setFeature(";, false);spf.setFeature(";, false);//Do unmarshall operationSource xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(), new InputSource(new StringReader(xml)));JAXBContext jc = JAXBContext.newInstance(Object.class);Unmarshaller um = jc.createUnmarshaller();um.unmarshal(xmlSource);XPathExpression
xpathexpression类似于Unmarshaller,无法通过它自身的配置来达到安全目的,因此必须首先通过另一个安全的XML解析器解析不受信任的数据。
例如:
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();df.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");df.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");DocumentBuilder builder = df.newDocumentBuilder();String result = new XPathExpression().evaluate( builder.parse( new ByteArrayInputStream(xml.getBytes())) );java.beans.XMLDecoder
这个类中的readObject()方法基本上是不安全的。它所解析的XML不仅会导致XXE,而且该方法还可用于构造任何Java对象,并执行此处所述的任意代码。重要的是,除了信任或正确验证传入该类的输入外,没有任何方法可以安全使用该类。因此,我们强烈建议避免使用这个类,并将其替换为安全或正确配置的XML解析器。
Other XML Parsers
有许多第三方库直接或通过使用其他库解析XML。请测试并验证他们的XML解析器默认情况下能抵抗XXE攻击。如果解析器在默认情况下不安全,请查找解析器支持的标志以禁用所有可能的外部资源包含,如上面给出的示例。如果没有向外部公开控件,首先请确保通过安全解析器传递不受信任的内容,然后将其传递给不安全的第三方解析器,这与Unmarshaller的安全方式类似。
Spring Framework MVC/OXM XXE Vulnerabilities
例如,在Spring OXM和Spring MVC中发现了一些XXE漏洞。以下版本的Spring Framework易受XXE攻击:
3.0.0 to 3.2.3 (Spring OXM & Spring MVC)4.0.0.M1 (Spring OXM)4.0.0.M1-4.0.0.M2 (Spring MVC)
还有其他一些问题后来也被修复了,所以为了完全解决这些问题,Spring建议您升级到Spring Framework 3.2.8+或4.0.2+。
对于Spring OXM,这指的是使用org.springframework.oxm.jaxb.Jaxb2Marshaller。请注意,Spring OXM的CVE特别指出,有两种XML解析情况由开发人员来处理,其中两种是Spring的责任,并发布了补丁来解决这个CVE漏洞。
他们是这么说的:
开发者必须处理两种情况:
对于DOMSource, XML已经被用户代码解析过,用户自己的代码负责防止XXE。对于StAXSource, XMLStreamReader已经由用户代码创建,用户自己的代码负责防止XXE。
Spring修复的问题:
对于SAXSource和StreamSource实例,Spring默认情况下处理外部实体,因此产生了此漏洞。
下面是一个使用易受攻击的StreamSource的例子,但如果你使用的是Spring OXM或Spring MVC的最新版本,那么现在是安全的,:
import org.springframework.oxm.Jaxb2Marshaller;import org.springframework.oxm.jaxb.Jaxb2Marshaller;Jaxb2Marshaller marshaller = new Jaxb2Marshaller();// Must cast return Object to whatever type you are unmarshallingmarshaller.unmarshal(new StreamSource(new StringReader(some_string_containing_XML));
因此,根据Spring OXM CVE的记录,以上内容现在是安全的。但是如果您要使用DOMSource或StAXSource,那么将由您来配置这些源,使其免受XXE的威胁。
标签: #apachejaxpjar