2016-11-17 31 views
2

私たちはコードに対してセキュリティ監査を行い、コードは外部エンティティ(XXE)攻撃に対して脆弱であると述べました。XXE攻撃を防止する方法

説明- XML外部エンティティ攻撃は、処理時にドキュメントを動的に構築するXML機能の恩恵を受けます。 XML エンティティは、特定のリソースから動的にデータを含めることを許可します。外部エンティティでは、XML文書に外部URIのデータ を含めることができます。そうでない場合を除いて、外部エンティティはXMLパーザに、指定されたリソース に、URI(例えば、ローカルマシン上またはリモートシステム上のファイル)にアクセスするように強制する。この現象は、アプリケーションをXMLに公開します。外部 ローカルシステムのサービス拒否を実行したり、ローカルマシンのファイルへの不正なアクセスを取得したり、リモートマシンをスキャンしたり、サービス拒否を実行したりするエンティティ(XXE)攻撃リモートシステム。 以下のXML文書は、XXE攻撃の例を示しています。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo [ 
<!ELEMENT foo ANY > 
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo> 

(UNIXシステム上)サーバーをクラッシュさせる可能性がある。この例では、XMLパーサが の/ dev /ランダムファイルの内容を持つエンティティを代用しようとした場合。

おすすめ - XMLアンマーシャラーは、XMLエンティティー の一部として外部エンティティーを許可しないように、安全に構成する必要があります。 XXE注入を避けるには、XMLソースを直接java.io.File、java.io.Reader、または java.io.InputStreamとして処理する非整列化メソッドを使用しないでください。安全構成パーサーを使用してドキュメントを解析し、次の例に示すように、XMLソースとしてセキュア

パーサを取るアンマーシャルメソッドを使用:XXE攻撃を見つけた場合

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setExpandEntityReferences(false); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document document = db.parse(<XML Source>); 
Model model = (Model) u.unmarshal(document); 

書き込まれたコードは、以下であります -

Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
System.out.println("outputing to : " + outputLocation); 
File outputFile = new File(outputLocation); 
StreamResult result = new StreamResult(outputFile); 
DOMSource source = new DOMSource(doc); 
transformer.transform(source, result); 

私のコードで上記の推奨事項を実装するにはどうすればよいですか。

誰かが私が行方不明を助けることができますか?誰でも助けていただければ幸いです!

答えて

1

TransformerFactoryのセキュア処理機能を有効にする必要があります。それはあなたがDocumentBuilderFactoryと同じアプローチを使用することができます

TransformerFactory tf = TransformerFactory.newInstance(); 
tf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
Transformer transformer = tf.newTransformer(); 
+0

ありがとう、ありがとう、私は既存のロジックにDocumentBuilderFactoryを実装する必要があります.... btw私はあなたの指定された提案を使用していますが、エラー "メソッドsetFeature(String、boolean)はTransformer型のために定義されていません"。 – SANNO

+0

Eh、申し訳ありませんが、TransformerFactoryで設定する必要があります。 – Kayaman

+0

カヤマンありがとう!そのうまく動作しますが、TransformerFactoryの概念をDocumentBuilderFactoryのコンセプトに置き換えることができます。本当にそれは感知できるでしょう。 – SANNO

0

起こってから一定の可能性が悪意のあるもの(DOS攻撃など)を制限します:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
... 

を誰もがこれを自動的に使うようにするには、あなたを作成する必要がありますあなた自身が実装している(あなたが使っているものを拡張して、あなたのデバッガを使って見つけ出す)。コンストラクタでフィーチャを設定します。

次に、システムファクトリjavax.xml.parsers.DocumentBuilderFactoryで使用する新しいファクトリをJava VMに渡して、すべての人が使用します。

関連する問題