5

使用XMLEncoderXMLDecoder將Java Beans序列化爲XML似乎是一個非常簡潔的方法:許多來源的許多類都可以可靠地序列化,只需使用它們的公共接口即可。在API參考的許多地方甚至建議使用這種方法進行序列化。但用於此的XML syntax似乎相當強大。是否有任何安全機制可以防止來自惡意文檔的攻擊?還是應該出於安全原因避免在不受信任的文檔上使用XMLDecoder使用XMLDecoder讀取文檔文件是否安全?

回答

9

XML序列化bean的反序列化可能導致JVM可以執行的任何操作。爲了給你一個醜陋的examle說,可以考慮提出以下文件,它會寫一個特定的文件,沒有任何問題:

<?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語言的定義良好且無害的子集,要麼將自己的格式與等技術一起使用。或者在嚴格控制的環境中執行反序列化,安全管理人員將不允許任何意外操作。

+1

確實。 Java編程語言當前安全編碼指南的準則3-8「JavaBeans組件的長期持久性支持執行Java語句」。 http://www.oracle.com/technetwork/java/seccodeguide-139067.html#3-8 –

3

不,它絕對不安全使用。

示例MvG提供(在接受的答案中)不繪製完整圖片。

看看我的Using XMLDecoder to execute server-side Java Code on an Restlet application (i.e. Remote Command Execution)博客中寫道的例子,我展示瞭如何:

  • 啓動進程,
  • 上傳類文件,
  • 寫入到服務器端的HTML的OutputStream,
  • 創建XSS和
  • 觸發遠程外殼

全部來自由XMLDecoder解析的XML文件/字符串(以及在博客文章中顯示的示例中,通過Restlet的REST API ObjectRepresentation類)

+2

對我來說,我的答案表明了任意代碼的執行,而你描述的所有其他方面只是這個的症狀。但我想不是每個人都可以建立這種連接,特別是服務器進程,所以明確地陳述這一點很好。而且找到了一個易受攻擊的框架使得這個更加有形。你有沒有聯繫過Restlet開發者? – MvG

+0

@MvG:http://osvdb.org/show/osvdb/96079 – h3xStream