デベロッパーズコーナー:Javaプログラミングを極める「DoS攻撃への対策」(1)
2004年01月20日作成
Javaプログラミングを極める
第10回:XMLを利用したDoS攻撃への対策
(株)日本ユニテック
太田 純
<この記事はDigital Xpress 2002 Vol.16(8-9月号)に掲載されたものです>
DoS(Denial of Service)攻撃とは、悪意を持つ者が、標的としたサーバのサービスを停止に追い込むような攻撃をいいます。通常はサーバに対して短時間に非常に多くのリクエストを送りつけたり、サーバソフトウェアのバグを狙って攻撃するものが多いのですが、XML データを受信して処理するサービスでは、たった 1 回の通信でサービス能力の低下、あるいはサービス停止に追い込まれる可能性があります。今回はその点を検証し、対策を考えましょう。 |
みなさんは「ブラウザ・クラッシャー」という言葉をお聞きになったことがあるでしょうか?ブラウザでWeb
ページを開いた時にブラウザをフリーズさせたり、システムをリソース不足にして動作不能にさせるような危険なWeb
ページのことです。匿名掲示板などでいやがらせをするためにブラウザ・クラッシャーへのリンクが書き込まれる場合があるの
で、リンクを不用意にクリックすることは避けなければなりません。
さて、このブラウザ・クラッシャーは、ブラウザやシステムの脆弱性を利用するものもありますが、JavaScript
を利用するものやimg タグを利用するものなどもあり、ブラウザに問
題がなくても攻撃の被害に遭う可能性があります。たとえば、以下のようなタグがHTML内に埋め込まれていると、多くのWeb
ブラウザでは、メーラーのメッセージ作成ウィンドウが立ち上がります。
<img src=mailto:1>
<img src=mailto:2>
<img src=mailto:3> |
このようなタグが何十個も並べて書いてあったら、次々にメーラーのウィンドウが立ち上がり、操作不能になってしまう
ことでしょう。
XML のエンティティを使ったDoS 攻撃
XML はHTML とは異なり、スクリプトを実行したり他のアプリケーションを立ち上げたりする機能はありません。しかしながら、XML
自体が持つ機能、言い替えるとXML パーサが実行する機能であるエンティティ参照を悪用する攻撃をされる可能性があります。エンティティによる循環参照はXML
の仕様によって禁止されていますが、入れ子の非常に深いエンティティを作成することは可能です。そのようなサンプルをリスト1
に示しました*1。
【リスト 1:DoS 攻撃を行うXML サンプル(DoS.xml)】
<?xml version="1.0" encoding ="UTF-8"?>
<!DOCTYPE foobar[
<!ENTITY x100 "foobar">
<!ENTITY x99 "&x100;&x100;">
<!ENTITY x98 "&x99;&x99;">
(中略)
<!ENTITY x2 "&x3;&x3;">
<!ENTITY x1 "&x2;&x2;">
]>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:aaa xmlns:ns1="urn:aaa" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<foobar xsi:type="xsd:string">&x1;</foobar>
</ns1:aaa>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> |
110 行ほどの、それほど大きなサンプルではありません。しかし、これをXML パーサに読み込ませるとエンティティ参照「&x1;」を展開するときに、入れ子になったエンティティ(x2、
x3、…)の展開処理が次々に行われていきます。ほとんどのシステムではCPU の利用率が100% になり、多くのメモリが消費され、アプリケーションが応答しなくなります。
当然のことながら、外部からのXML データを扱わないアプリケーションではこの点を考慮する必要はありません。一方、不特定の外部からのデータを受け付けるWeb
サービスの場合は、このようなデータが送りつけられるとサーバが処理不能になる可能性があるため対策が必要です。
ここから、DoS 攻撃を行うXML データを扱うためのサンプルプログラムを紹介していきます。テストをする際には、影響を与える可能性のあるアプリケーションやサービスが動作していないことを確認してから行ってください。また、検証機能を持つ
XML エディタの使用は避けるようお勧めします。
>>続いて「J2SE 1.4.2 によるセキュリティ強化」についてみてみましょう。
関連サービス
IT技術およびIT製品の可用性調査・検証業務
関連キーワード:
DoS攻撃
関連キーワード:
Java