Play 框架安全公告

XML 外部实体

日期

2013 年 9 月 20 日

描述

在 Play 的 XML 处理中发现了一个漏洞。

攻击者可以使用 XML 外部实体从文件系统、内部网络读取文件或对应用程序进行拒绝服务攻击。

影响

任何使用默认任何内容解析器或专门使用 XML 解析器的应用程序都可能存在漏洞。

受影响的版本

解决方法

更改 JDK 使用的默认 SAXParserFactory 实现,使其禁用外部实体。

例如,如果使用 Oracle JDK,请将以下类添加到您的应用程序中

package xml;

import org.xml.sax.*;
import javax.xml.parsers.*;

public class SecureSAXParserFactory extends SAXParserFactory {
    private final SAXParserFactory platformDefault = new com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl();

    public SecureSAXParserFactory() throws SAXNotSupportedException, SAXNotRecognizedException, ParserConfigurationException {
        platformDefault.setFeature("http://xml.org/sax/features/external-general-entities", false);
        platformDefault.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        platformDefault.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    }

    public SAXParser newSAXParser() throws ParserConfigurationException, SAXException {
        return platformDefault.newSAXParser();
    }

    public void setFeature(String name, boolean value) throws ParserConfigurationException, SAXNotRecognizedException, SAXNotSupportedException {
        platformDefault.setFeature(name, value);
    }

    public boolean getFeature(String name) throws ParserConfigurationException, SAXNotRecognizedException, SAXNotSupportedException {
        return platformDefault.getFeature(name);
    }
}

然后在生产模式下启动应用程序时,将以下系统属性添加到命令行参数中

-Djavax.xml.parsers.SAXParserFactory=xml.SecureSAXParserFactory

修复

升级到以下适当的版本

CVSS 指标 (更多信息)

致谢

发现此漏洞的功劳归于澳大利亚邮政数字邮箱安全团队和http://www.ubercomp.com/的Reginaldo Silva。