45

最近、コードのセキュリティ監査が行われました。問題の 1 つは、アプリケーションがXml eXternal Entity (XXE) 攻撃の対象になっていることです。

基本的に、このアプリケーションは、Web サービスを介して XML として入力を受け取る電卓です。

以下は、アプリケーションに対する XXE 攻撃の例です。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <foo:calculateStuff>
         <!--Optional:-->
         <xmlInput><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE currency [  
   <!ENTITY include SYSTEM "file:///d:/" >]>
<calcinput>...</calcinput>
]]></xmlInput>
      </foo:calculateStuff>
   </soapenv:Body>
</soapenv:Envelope>

ご覧のとおり、外部ファイル ( ) を指すエンティティを参照できます"file:///d:/"

XML入力自体(<calcinput>...</calcinput>一部)についてはJAXB(v2.1)でアンマーシャリングされています。Web サービス部分は jaxws-rt (2.1) に基づいています。

Web サービスを保護するために何をする必要がありますか?

4

1 に答える 1

65

JAXB

and/orプロパティが に設定されXMLStreamReaderているからアンマーシャリングすることで、Xml eXternal Entity (XXE) 攻撃を防ぐことができます。IS_SUPPORTING_EXTERNAL_ENTITIESXMLInputFactory.SUPPORT_DTDfalse

JAX-WS

JAX-WS 実装がこれを処理する必要があります。そうでない場合は、特定の実装に対してバグを開くことをお勧めします。


デモ

package xxe;

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
        xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
        XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/xxe/input.xml"));

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Customer customer = (Customer) unmarshaller.unmarshal(xsr);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }

}

入力.xml

この XML ドキュメントには、この例の作成に使用したファイルのリストを取得するように設定されたエンティティが含まれています。

<?xml version="1.0"?>
<!DOCTYPE customer
[
<!ENTITY name SYSTEM "/Users/bdoughan/Examples/src/xxe/">
]
>
<customer>
  <name>&name;</name>
</customer>

お客様

package xxe;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

出力 - デフォルト設定

デフォルトでは、エンティティは解決されます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <name>Customer.java
Demo.java
input.xml
</name>
</customer>

XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIESプロパティが に設定されている場合の出力false

このプロパティが設定されている場合、エンティティは解決されません。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <name></name>
</customer>

XMLInputFactory.SUPPORT_DTDプロパティが に設定されている場合の出力false

このプロパティを設定すると、エンティティを解決しようとして例外がスローされます。

Exception in thread "main" javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,15]
Message: The entity "name" was referenced, but not declared.]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:436)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:372)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:342)
    at xxe.Demo.main(Demo.java:18)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,15]
Message: The entity "name" was referenced, but not declared.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598)
    at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:196)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:370)
    ... 2 more
于 2012-10-19T16:48:40.010 に答える