ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  JavaプログラミングとXML

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:Javaプログラミングを極める「DoS攻撃への対策」(3)

2004年01月20日作成 

Javaプログラミングを極める
第10回:XMLを利用したDoS攻撃への対策

(株)日本ユニテック
太田 純

<この記事はDigital Xpress 2002 Vol.16(8-9月号)に掲載されたものです>

DoS(Denial of Service)攻撃とは、悪意を持つ者が、標的としたサーバのサービスを停止に追い込むような攻撃をいいます。通常はサーバに対して短時間に非常に多くのリクエストを送りつけたり、サーバソフトウェアのバグを狙って攻撃するものが多いのですが、XML データを受信して処理するサービスでは、たった 1 回の通信でサービス能力の低下、あるいはサービス停止に追い込まれる可能性があります。今回はその点を検証し、対策を考えましょう。

<<前ページ「J2SE 1.4.2 によるセキュリティ強化」

Xerces2 のセキュリティ強化機能の利用

Apache XML プロジェクトが提供するXML パーサXerces2(http://xml.apache.org/xerces2-j/index.html) においても、Crimson-1.1.3+ と同様のエンティティ展開の数およびDTD の使用を制限できます。順に見ていくことにしましょう。本稿執筆に当たっては Xerces 2.4.0 を使用して動作確認を行いました。なお、Xerces2 をJ2SE 1.4.x 環境でセットアップする場合、JREディレクトリのlib\endorsed にjar ファイルをコピーします。J2SE 1.3.x 環境では、クラスパスを通せば利用可能になります。セットアップ方法の詳細についてはXerces2 のサイトで確認ください。

展開するエンティティ数の制限

Xerces2 はデフォルトで展開するエンティティ数に制限を設けていません。展開するエンティティ数に制限を設定するにはパーサプロパティ「http://apache.org/xml/properties/security-manager」 にorg.apache.xerces.util.SecurityManager オブジェクトを設定します。SecurityManager を生成してそのまま使うと、展開エンティティ数の上限が100,000 になります。他の値を設定するにはSecurityManager のメソッドsetEntityExpansionLimit を使います。SAX でのコーディング例をリスト4 に示します。org.xml.sax.XMLReader のメソッドsetProperty を使って上記パーサプロパティを設定します。

【リスト 4 : Xerces2 で展開エンティティ数を制限するSAX サンプル(SAXTest2.java)】

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.apache.xerces.util.SecurityManager;

public class SAXTest2 extends DefaultHandler {
    public static void main (String[] args) {
        try {
            SAXParserFactory spfactory = SAXParserFactory.newInstance();
            SAXParser parser = spfactory.newSAXParser();
            XMLReader reader = parser.getXMLReader();
            SecurityManager securityManager = new SecurityManager();
            securityManager.setEntityExpansionLimit(1000);
            reader.setProperty(
                "http://apache.org/xml/properties/security-manager",
                securityManager);
            parser.parse(args[0], new SAXTest());
            System.out.println("Normal End.");
    } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

DOMでのコーディング例をリスト5 に示します。Xerces2の サイトの説明によると、JAXP のインターフェースDocumentBuilderFactory 経由でパーサプロパティを設定しても動作は保証されないため、Xerces2 のDOMParser オブジェクトを使用する必要があります。

【リスト 5 : Xerces2 で展開エンティティ数を制限するDOM サンプル(DOMTest2.java)】

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;
import org.apache.xerces.util.SecurityManager;

public class DOMTest2 {
    public static void main (String[] args) {
        try {
                DOMParser parser = new DOMParser();
                Security Manager security Manager = new SecurityManager();
                securityManager.setEntityExpansionLimit(1000);
                parser.setProperty(
                    "http://apache.org/xml/properties/security-manager",
                    securityManager);
                parser.parse(args[0]);
                Document d = parser.getDocument();
                System.out.println("Normal End.");
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
}

DTD の使用禁止

Xerces2 でDTD の使用を禁止するには、パーサのフィーチ ャ「http://apache.org/xml/features/disallow-doctype-decl」を true に設定します。SAX のコーディング例をリスト6 に、DOM のコーディング例をリスト7 に示します。

【リスト 6 : Xerces2 でDTD の使用を禁止するSAX サンプル(SAXTest3.java)】

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

public class SAXTest3 extends DefaultHandler {
    public static void main (String[] args) {
        try {
            SAXParserFactory spfactory = SAXParserFactory.newInstance();
            SAXParser parser = spfactory.newSAXParser();
            XMLReader reader = parser.getXMLReader();
            reader.setFeature(
                "http://apache.org/xml/features/disallow-doctype-decl",
                true);
            parser.parse(args[0], new SAXTest());
            System.out.println("Normal End.");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

【リスト 7 : Xerces2 でDTD の使用を禁止するDOM サンプル(DOMTest3.java)】

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;

public class DOMTest3 {
    public static void main (String[] args) {
        try {
            DOMParser parser = new DOMParser();
            parser.setFeature(
                "http://apache.org/xml/features/disallow-doctype-decl",
                true);
            parser.parse(args[0]);
            Document d = parser.getDocument();
            System.out.println("Normal End.");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

今回は、J2SE 1.4 に含まれているXML パーサCrimson-1.1.3+およびXerces2 においてXML を使ったDoS 攻撃に備える方法を扱いました。堅牢なXML アプリケーションを作成するための参考にしてください。

 

※1 リ スト1 のサンプルは、http://java.sun.com/j2se/1.4.2/ja/relnotes.html#jaxp にDoS 攻撃の例として挙げられたコードを基にして作成しました。




関連サービス

IT技術およびIT製品の可用性調査・検証業務



この記事と関連の高い記事

関連キーワード:DoS攻撃


関連キーワード:Java




ページトップへ戻る