我得到了一個Java程序,它讀取一個Java Serial對象,如果它被接收到,程序將運行一些業務邏輯。假設我沒有Java程序源代碼,我也沒有關於Serial對象如何實現的任何文檔。這可能使得fake
客戶端可以讓程序執行嗎?這可能讓其他人在src中實現一個`僞「Java對象嗎?
謝謝。
我得到了一個Java程序,它讀取一個Java Serial對象,如果它被接收到,程序將運行一些業務邏輯。假設我沒有Java程序源代碼,我也沒有關於Serial對象如何實現的任何文檔。這可能使得fake
客戶端可以讓程序執行嗎?這可能讓其他人在src中實現一個`僞「Java對象嗎?
謝謝。
假設Java序列化。
理論上你應該能夠看看串行流,看看哪些類和字段是預期的。然後,您可以及時構建一個類(如果使用ObjectInputStream
解析流,則可能需要重新開始每次讀取流(不確定))。在自定義writeObject
方法中寫入defaultWriteObject
/putFields
之後的任何數據都不會被可靠地解釋。
實際上,人們(包括Java庫的作者)有時會有點調皮,錯過了defaultWriteObject
/putFields
。這意味着該流實際上不是正確的格式。由於向後兼容性,現在解決這個問題可能有點晚了。
假客戶端將不得不知道期望的類的名稱,它可以發現異常消息時,它找不到;其serialVersionUID同上;和它的可序列化字段,它們是而不是可發現的同上。從理論上講,可以從序列化流中發現它,但是假設任何類都可以擁有自己的writeObject()或writeExternalizable()方法,它可以任意快速地任意複雜化。
所以我不會因爲偶然的風險而失去太多的睡眠。
您也可以簽署JAR並密封相關包裝,這樣可以消除特定的風險。
OTOH如果你有一個真正的neeed應用程序安全性,你正在尋找錯誤的地方。
我不完全按照你的想法。
您不能通過將新代碼注入反序列化對象來將新代碼注入到應用程序中。爲了使對象在程序中成功被反序列化,該程序必須具有類路徑中對象的類。如果沒有,反序列化將失敗。另一方面,如果你知道程序已經使用了一個具有特定安全漏洞的特定類,並且你可以欺騙它來反序列化該類的一個實例,以便可以利用這個漏洞,那麼會有一個問題。 (我依稀記得,這種方法已用於某些脆弱類,但我不記得任何細節。)
的底線是安全意識的應用程序不應該試圖反序列化對象可能來自不受信任的來源,或可能在運輸過程中進行過修改。
研究使用模擬框架,如EasyMock或Mockito – krock 2012-04-19 10:56:59