什麼是序列化(Serialization)和反序列化(Deserialization)?
要了解不安全的反序列化前就要先了解什麼是序列化和反序列化,簡單的說序列化就是把一個object轉換成一個byte一個byte,用以讓程式可以傳送或儲存object,大家可以想像一下, 把object想像是一個很大的東西,我們要把這個很大的東西透過一個小水管傳送到另一個地方,而這個水管的大小無法一次把這個很大的東西一次送過去,所以我們必需把 這個很大的物件拆成一小塊一小塊來傳送,到逹目的地再把一小塊一小塊組合起來還原成原來的物件,右邊的影片即示意序列化與反序例化一個物件的過程。
駭客如何透過不安全的反序例化(Unsafe Deserialization)入侵你的系統?
右邊Youtube影片介紹Java的序列化(serialization)及反序列化(deserialization)二支程式,用第三支程式來修改序列化程式所產生的封包,使反序列化程式原本無法還原序列化程式所產生的封包,經過修改後, 即可使反序列化程式成功把封包還原到不同物件,雖然影片並沒有修改物件的變數,但是使用影片中相同的方法也可修改物件的變數,所以反序列化程式若沒有嚴格的檢查所要還原的物件封包即有可能危害到你們的系統。
Unsafe Deserialization可能造成的衝擊
視反序列化程式的內容,例如反序列化程式可能透過序列化封包決定執行shell command,或程式可能透過序列化封包直接或間接的呼叫到Reflection程式,如果處理的不恰當都很可能造成很嚴重的後果,而Unsafe Deserialization可能造成以下的衝擊:
- 遠端程式碼執行(RCE)
- 產生遠端程式碼執行(Remote code execution,RCE)的狀況有很多,例如上面所提到的直接或間接呼叫shell command,或者Unsafe Deserialization也可能結合Buffer overflow造成重的破壞。
- 認證及驗證機制失效
- 如果你在Login程式如果有implemnte serializable interface而月又沒verify封包,就有機會讓駭客在你程式做認證時被bypass。
- 特權提升
- 如果在授權程式的部份implemnte serializalbe interface,在做Deserialization又沒仔細確認封包是否為你程式所產生的,則有機會讓駭客在登入時提升Login權限,造成系統更嚴重的破壞
- 阻斷服務攻擊(DoS)
- 駭客可能會送很大size的payload到你的程式,如果你沒檢查長度就直接做deserialization,可能造成你的系統會被癱瘓。
- 資訊洩漏
- 資訊洩漏也就是你的資料被駭客竊取,至於會偷到什麼資料,造成什麼樣的問題,就要視你的程式在處理什麼資料,當然也駭客有可以利用RCE,在你的程式植入木馬或各種手法來得他想要的資料Unsafe Deserialization Impact。
Unsafe Deserialization處理方式
防範Unsafe Deserialization方式有很多,下面這些是Owasp網站的應對方法,這些方法只適合不了解自己程式弱點該如何修改的人來處理,我處理弱點的方式一向建議大家針對問題去處理, 很多人從Internet找到的處理方式,大都屬於大範圍的防範方法,這種方式其實不適合大部份的弱點修改,若不清楚要怎麼修改這些弱點,可以找適合的資安顧問,他們會幫您找到適合的方式來做修改。
- 完整性檢查
- 完整性的檢查即確保備份取得的序列化封包的的完整性,以這點來說不管是加密或Hash都是不錯的方法,能夠使用數位簽章會更好。
- 強制使用嚴格型別(strict type)
- 限制Deserialization的Clsas,也就是白名單的方式來限制可使反序列化的Class,只能Deserialization白名單內的Class。
- 在低權限的環境執行反序列化(Deserializes)
- 如果可能的話在低權限的環境做Deserialization,這個方式是為了預防萬一被駭客成功做了反序列化,可減少對系統所造成傷害。
- 失敗(failures)和例外(exception)deserialization的日誌(log)
- 執行反序列化時Log一定要做記錄,被攻擊了之後才能找出應對的方式。
- 限制或監視反序列化(deserialize)的網路連線
- 限制做Deserialization的連線來源,沒辨法限制的話也要做監控反序列化的網路連線。
- 持序性的反序列化(deserialize)需發出警告(Alert)
- 如果有連線一直在做Deserialization一定要馬上發出Alert。