Java Beans を XML にシリアライズする方法はかなり巧妙なアプローチのようXMLEncoder
にXMLDecoder
思えます。パブリック インターフェイスを使用するだけで、多くのソースからの多くのクラスを確実にシリアライズできます。このアプローチをシリアル化に使用することは、API リファレンスの多くの場所で提案されています。しかし、これに使用されるXML 構文は非常に強力なようです。悪意のあるドキュメントからの攻撃を防ぐセキュリティ メカニズムはありますか? またはXMLDecoder
、セキュリティ上の理由から、信頼されていないドキュメントでの使用を避ける必要がありますか?
2 に答える
XML でシリアライズされた Bean のデシリアライズは、JVM が実行できるほぼすべての操作を引き起こす可能性があります。見苦しい例として、特定のファイルを何も質問せずに書き込む次のドキュメントを考えてみましょう。
<?xml version="1.0" encoding="UTF-8" ?>
<java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>/tmp/Hacked.txt</string>
<void method="println">
<string>You have been hacked!</string>
</void>
<void method="close"/>
</object>
</java>
これはメソッドとほぼ同じです
PrintWriter deserialize() {
PrintWriter obj = new PrintWriter("/tmp/Hacked.txt");
obj.println("You have been hacked!");
obj.close();
return obj;
}
このため、 を使用して信頼できないソースからデータを単純に読み取らないことを強くお勧めしXMLDecoder
ます。
XML 言語の明確に定義された無害なサブセットに対してドキュメントを検証するか、独自の形式をjaxbなどのテクノロジと共に使用します。または、予期しない操作を禁止するセキュリティ マネージャーを使用して、厳密に制御された環境で逆シリアル化を実行します。
いいえ、絶対に安全に使用することはできません。
MvG が提供する例 (受け入れられた回答) は、全体像を示していません。
Using XMLDecoder to execute server-side Java Code on an Restlet application (ie Remote Command Execution)というブログ記事で私が書いた例を見てください。
- 開始プロセス、
- クラスファイルのアップロード、
- サーバー側の HTML OutputStream に書き込みます。
- XSS を作成し、
- リモート シェルをトリガーする
すべて XMLDecoder によって解析される XML ファイル/文字列から (およびブログ投稿に示されている例では、Restlet の REST API ObjectRepresentation クラスを介して)