Oracle:Java 的序列化就是個錯誤,我們要刪掉它!

2020-12-12 CSDN

點擊上方「CSDN」,選擇「置頂公眾號」

關鍵時刻,第一時間送達!

此前,Java提供了一種機制叫做序列化,即通過有序的格式或字節序列持久化Java對象,包括對象的數據、類型,以及保存在對象中的數據類型。簡單來說,就是把對象轉換為字節序列的過程。萬萬沒想到,若干年後,Oracle意識到了Java存在的序列化漏洞,並決心剔除該特性!

近日,據外媒InfoWorld報導稱,Oracle正計劃從Java中去除序列化特性,一直以來,這在安全方面都是一個棘手的問題。該功能也稱為「對象序列化」,主要將對象編碼為字節流形式。除了用於輕量化持久性,以及通過套接字或Java RMI進行通信之外,序列化功能還支持從字節流中重構對象圖。

據了解,該公司Java平臺部門首席架構師Mark Reinhold表示,

「去除序列化是一項長期目標,也是Project Amber的一部分,它專注於面向生產力的Java語言特性。」

為了替換當前的序列化技術,一旦記錄,會在平臺中放置一個小的序列化框架,支持 Java 版本的數據類。該框架可以支持記錄圖形,開發人員可以插入他們選擇的序列化引擎,支持 JSON 或 XML 等格式,從而以安全的方式序列化記錄。 但 Reinhold 還不能確定哪個版本的 Java 將具有記錄功能。

Reinhold還提到:序列化是1997 年犯下的一個「可怕的錯誤」。他估計,至少有三分之一甚至是一半的Java漏洞與序列化有關。總體上,序列化是脆弱的,但具有在單一案例中易於使用的特性。

最近,Java剛剛添加了過濾功能,因此如果(開發者)必須接受自網絡上使用序列化且接受不受信任的序列化數據流,則可以藉此選擇需要過濾掉的類以實現針對序列化安全弱點的防禦機制。

Reinhold指出,Oracle目前收到很多運行在網絡上的應用伺服器的報告,其中未受保護的埠上使用序列化流,這就是過濾功能開發的原因。

參考連結:

s-to-dump-risky-java-serialization.html

相關焦點

  • 全方位解析Java序列化
    磁碟這些硬體可不認識 Java 對象,它們只認識二進位這些機器語言,所以我們就要把這些對象轉化為字節數組,這個過程就是序列化啦~打個比喻,作為大城市漂泊的碼農,搬家是常態。當我們搬書桌時,桌子太大了就通不過比較小的門,因此我們需要把它拆開再搬過去,這個拆桌子的過程就是序列化。而我們把書桌復原回來(安裝)的過程就是反序列化啦。
  • 【Java拾遺】不可不知的 Java 序列化
    而序列化功能又正好對應這兩點,一個是用來傳輸信息,另一個是用來持久化。序列化用來傳輸的作用,前文已經說過了,關於持久化的作用,也很好理解。首先明確一個問題,序列化的是什麼內容?通常是內存中的內容。而內存有一個特點我們都知道,那就是一重啟就沒了。對於部分內容,我們想在重啟後還存在(比如說 tomcat 中 session 裡面的對象),要怎麼辦呢?
  • Java程式設計師必備:序列化全方位解析
    磁碟這些硬體可不認識Java對象,它們只認識二進位這些機器語言,所以我們就要把這些對象轉化為字節數組,這個過程就是序列化啦~打個比喻,作為大城市漂泊的碼農,搬家是常態。當我們搬書桌時,桌子太大了就通不過比較小的門,因此我們需要把它拆開再搬過去,這個拆桌子的過程就是序列化。而我們把書桌復原回來(安裝)的過程就是反序列化啦。
  • 為什麼Java中序列化的SerialVersionUID總是無意義的?
    java序列化中的serialVersionUID後面我們通常是1L、或者是xxxL。這些數字有什麼意義呢?為什麼我們總是需要這些無意義的ID。帶著這些問題我們一步一步來揭曉答案。1、有意義的ID有一些ID是有意義的,最常見的就是我們的身份證號,一共18位。分別代表著省市縣等等。
  • JAVA反序列化—FastJson抗爭的一生
    對應反序列化攻擊利用三要素來說,以上我們就是找到了readObject複寫點,下面來探討反序列化利用鏈。我們先來看最開始的漏洞版本是<=1.2.24,在這個版本前是默認支持@type這個屬性的。我們應該對這兩個點產生敏感性。修復則是針對三要素中的一者進行截斷。在1.2.25中的修復原理就是針對了反序列化漏洞觸發點進行限制。對於@type標籤進行一個白名單+黑名單的限制機制。
  • 什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決.
    遇到這個 Java Serializable 序列化這個接口,我們可能會有如下的問題作用。為啥要實現這個 Serializable 接口,也就是為啥要序列化serialVersionUID 這個的值到底是在怎麼設置的,有什麼用。有的是1L,有的是一長串數字,迷惑ing。
  • java序列化反序列化中serialVersionUID到底有什麼用
    前言:在回答上面的問題之前,首先要知道什麼是序列化、反序列化、用途是什麼、實現的必要條件。序列化\反序列化:java序列化是指把java對象轉換為字節序列的過程,而java反序列化是指把字節序列恢復為java對象的過程。
  • 關於 Java 序列化你不知道的 5 件事
    我們將使用 Person 來發現您可能不知道的關於 Java 對象序列化的 5 件事。1. 序列化允許重構序列化允許一定數量的類變種,甚至重構之後也是如此,ObjectInputStream 仍可以很好地將其讀出來。
  • 支付寶面試:什麼是序列化,怎麼序列化,為什麼序列化,反序列化會遇到什麼問題,如何解決?
    為啥要實現這個 Serializable 接口,也就是為啥要序列化serialVersionUID 這個的值到底是在怎麼設置的,有什麼用。有的是1L,有的是一長串數字,迷惑ing。我剛剛見到這個關鍵字 Serializable 的時候,就有如上的這麼些問題。
  • Java反序列化漏洞從理解到實踐
    :紙上得來終覺淺,絕知此事要躬行。這也是為什麼我們在學到知識後要付諸實踐的原因所在。在本文中,我們會深入分析大家非常熟悉的Java發序列化漏洞。對我們而言,最好的實踐就是真正理解手頭掌握的知識,並可以根據實際需要加以改進利用。本文的主要內容包括以下兩方面:1. 利用某個反序列化漏洞。2. 自己手動創建利用載荷。
  • 明晰 | Java序列化與反序列化
    序列化需要實現一個接口一個對象需要實現序列化,在這裡,需要實現一個接口,這個接口為java.io.Serializable點開這個接口,可以看到定義的內容如下其代碼如下import java.io.(16進位 71),然後調用writeInt()寫入 007e0000 + handle,這個handle是之前聲明過對象的位置,這裡我還沒弄清除這個位置是怎麼定位的,一般是00 01,也就是說 writeHandle(),一般寫入如下:71 00 7e 00 XX這樣5個字節(最後這個00 XX 還不確定,等我再弄明白,一般是 00 01)
  • 教你徹底學會Java序列化和反序列化
    Java序列化是指把Java對象轉換為字節序列的過程,Java反序列化是指把字節序列恢復為Java對象的過程。反序列化:客戶端重文件,或者網絡中獲取到文件以後,在內存中重構對象。序列化:對象序列化的最重要的作用是傳遞和保存對象的時候,保證對象的完整性和可傳遞性。方便字節可以在網絡上傳輸以及保存在本地文件。
  • 文庫 | 反序列化漏洞匯總
    二.按程式語言分類無論是白盒測試還是黑盒測試,識別不安全的反序列化都是相對簡單的。在審核期間,我們應該查看傳遞到網站的所有數據,並嘗試識別任何看起來像序列化數據的內容。如果知道不同語言使用的格式,則可以相對輕鬆地識別序列化數據。在本節中,我們將展示多種語言的序列化示例及特性。識別序列化數據後,就可以測試是否能夠控制它。
  • 一文帶你全面了解Java 序列化
    在開發過程中經常會對實體進行序列化,但其實我們只是在「只知其然,不知其所以然」的狀態,很多時候會有這些問題:什麼是序列化和反序列化?為什麼要序列化?怎麼實現序列化?序列化的原理是什麼呢?其實我們的對象不只是存儲在內存中,它還需要在傳輸網絡中進行傳輸,並且保存起來之後下次再加載出來,這時候就需要序列化技術。一般Java對象的生命周期比Java虛擬機端,而實際開發中如果需要JVM停止後能夠繼續持有對象,則需要用到序列化技術將對象持久化到磁碟或資料庫。
  • 甲骨文的oracle,mysql,還有java,中國有成熟的替代品嗎?
    完全有替代品曾經一家獨大的Oracleoracle、MySQL、java這三個名詞聯繫到一起,還是不得不提到一個全球大型資料庫軟體公司甲骨文(Oracle),而提到甲骨文又不提到的創始人和CEO。埃裡森是比爾·蓋茨死對頭,也是漫威超級英雄鋼鐵俠的原型。
  • 零基礎學Oracle之1:Oracle體系架構
    5) java pool對於java的支持,如解釋執行java編寫的存儲過程7、PGA(程序全局區):每一個後臺進程一個PGAPGA也是一塊內存區域,包含了單個server process/單個background
  • Java安全之反序列化漏洞分析
    序列化與反序列化對於Java程式設計師來說,應該不算陌生了,序列化與反序列化簡單來說就是Java對象與數據之間的相互轉化。那麼對於完全面向對象的Java語言來說為什麼要有序列化機制?實質上,序列化機制並不只局限於Java語言,序列化的本質是內存對象到數據流的一種轉換,我們知道內存中的東西不具備持久性,但有些場景卻需要將對象持久化保存或傳輸。
  • 深入學習 Java 序列化
    第一種情況是:一般情況下Java對象的聲明周期都比Java虛擬機的要短,實際應用中我們希望在JVM停止運行之後能夠持久化指定的對象,這時候就需要把對象進行序列化之後保存。第二種情況是:需要把Java對象通過網絡進行傳輸的時候。
  • Kryo 2.23 發布,高性能 Java 序列化庫
    a generic class (f9cb9ea)Fix #176 Remove unused "kryo" fields from a number of classes. (77e319f)Fix #168 Infinite loop while extending buffer (82d134d)Fix #100 Serialization for java.util.Locale
  • Java中 serialVersionUID 的作用是什麼?舉個例子說明
    具體的序列化過程是這樣的:序列化操作的時候系統會把當前類的serialVersionUID寫入到序列化文件中,當反序列化時系統會去檢測文件中的serialVersionUID,判斷它是否與當前類的serialVersionUID一致,如果一致就說明序列化類的版本與當前類版本是一樣的,可以反序列化成功,否則失敗。