デベロッパーズコーナー: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
