中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java序列化的狀態(tài)

2018-09-14    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

關(guān)鍵要點(diǎn)

  • Java序列化在很多庫(kù)中引入了安全漏洞。
  • 對(duì)序列化進(jìn)行模塊化處于開(kāi)放討論狀態(tài)。
  • 如果序列化能夠成為模塊,開(kāi)發(fā)人員將能夠?qū)⑵鋸墓舯砻嫔弦瞥?/li>
  • 移除其他模塊可以消除它們所帶來(lái)的風(fēng)險(xiǎn)。
  • 插樁提供了一種編織安全控制的方法,提供現(xiàn)代化的防御機(jī)制。

多年來(lái),Java的序列化功能飽受 安全漏洞 和zero-day攻擊,為此贏得了“ 持續(xù)奉獻(xiàn)的禮物 ”和“ 第四個(gè)不可饒恕的詛咒 ”的綽號(hào)。

作為回應(yīng),OpenJDK貢獻(xiàn)者團(tuán)隊(duì)討論了一些用于限制序列化訪問(wèn)的方法,例如將其 提取到可以被移除的jigsaw模塊中 ,讓黑客無(wú)法攻擊那些不存在的東西。

一些文章(例如“ 序列化必須死 ”)提出了這樣的建議,將有助于防止 某些流行軟件(如VCenter 6.5)的漏洞被利用 。

什么是序列化?

自從1997年發(fā)布 JDK 1.1 以來(lái),序列化已經(jīng)存在于Java平臺(tái)中。

它用于在套接字之間共享對(duì)象表示,或者將對(duì)象及其狀態(tài)保存起來(lái)以供將來(lái)使用(反序列化)。

在JDK 10及更低版本中,序列化作為java.base包和java.io.Serializable方法的一部分存在于所有的系統(tǒng)中。

GeeksForGeeks對(duì) 序列化的工作原理 進(jìn)行了詳細(xì)的描述。

有關(guān)更多如何使用序列化的代碼示例,可以參看Baeldung對(duì) Java序列化的介紹 。

序列化的挑戰(zhàn)和局限

序列化的局限主要表現(xiàn)在以下兩個(gè)方面:

  1. 出現(xiàn)了新的對(duì)象傳輸策略,例如JSON、XML、Apache Avro、Protocol Buffers等。
  2. 1997年的序列化策略無(wú)法預(yù)見(jiàn)現(xiàn)代互聯(lián)網(wǎng)服務(wù)的構(gòu)建和攻擊方式。

進(jìn)行序列化漏洞攻擊的基本前提是找到對(duì)反序列化的數(shù)據(jù)執(zhí)行特權(quán)操作的類,然后傳給它們惡意的代碼。為了理解完整的攻擊過(guò)程,可以參看Matthias Kaiser在2015年發(fā)表的“ Exploiting Deserialization Vulnerabilities in Java ”一文,其中幻燈片第14頁(yè)開(kāi)始提供了相關(guān)示例。

其他大部分與序列號(hào)有關(guān)的安全研究 都是基于Chris Frohoff、Gabriel Lawrence和Alvaro Munoz的工作成果。

序列化在哪里?如何知道我的應(yīng)用程序是否用到了序列化?

要移除序列化,需要從java.io包開(kāi)始,這個(gè)包是java.base模塊的一部分。最常見(jiàn)的使用場(chǎng)景是:

  • 實(shí)現(xiàn)Serializable接口和(可選)serialversionuid長(zhǎng)整型字段。
  • 使用ObjectInputStream或ObjectOutputStream。
  • 使用 嚴(yán)重依賴序列化 的庫(kù),例如:Xstream、Kryo、BlazeDS和 大多數(shù)應(yīng)用程序服務(wù)器 。

使用這些方法的開(kāi)發(fā)人員應(yīng)考慮使用其他存儲(chǔ)和讀回?cái)?shù)據(jù)的替代方法。Eishay Smith發(fā)布了 幾個(gè)不同序列化庫(kù)的性能指標(biāo) 。在評(píng)估性能時(shí),需要在基準(zhǔn)度量指標(biāo)中包含安全方面的考慮。默認(rèn)的Java序列化“更快”一些,但漏洞也會(huì)以同樣的速度找上門來(lái)。

我們?cè)撊绾谓档托蛄谢毕莸挠绊懀?/h2>

項(xiàng)目Amber 包含了一個(gè)關(guān)于將序列化API隔離出來(lái)的討論。我們的想法是將序列化從java.base移動(dòng)到單獨(dú)的模塊,這樣應(yīng)用程序就可以完全移除它。在確定 JDK 11功能集 時(shí)并沒(méi)有針對(duì)該提議得出任何結(jié)果,但可能會(huì)在未來(lái)的Java版本中繼續(xù)進(jìn)行討論。

通過(guò)運(yùn)行時(shí)保護(hù)來(lái)減少序列化暴露

一個(gè)可以監(jiān)控風(fēng)險(xiǎn)并自動(dòng)化可重復(fù)安全專業(yè)知識(shí)的系統(tǒng)對(duì)于很多企業(yè)來(lái)說(shuō)都是很有用的。Java應(yīng)用程序可以將JVMTI工具嵌入到安全監(jiān)控系統(tǒng)中,通過(guò)插樁的方式將傳感器植入到應(yīng)用程序中。Contrast Security是這個(gè)領(lǐng)域的一個(gè)免費(fèi)產(chǎn)品,它是JavaOne大會(huì)的 Duke's Choice大獎(jiǎng)得主 。與其他軟件項(xiàng)目(如MySQL或GraalVM)類似, Contrast Security的社區(qū)版 對(duì)開(kāi)發(fā)人員是免費(fèi)的。

將運(yùn)行時(shí)插樁應(yīng)用在Java安全性上的好處是它不需要修改代碼,并且可以直接集成到JRE中。

它有點(diǎn)類似于面向切面編程,將非侵入式字節(jié)碼嵌入到源端(遠(yuǎn)程數(shù)據(jù)進(jìn)入應(yīng)用程序的入口)、接收端(以不安全的方式使用數(shù)據(jù))和轉(zhuǎn)移(安全跟蹤需要從一個(gè)對(duì)象移動(dòng)到另一個(gè)對(duì)象)。

通過(guò)集成每個(gè)“接收端”(如ObjectInputStream),運(yùn)行時(shí)保護(hù)機(jī)制可以添加額外的功能。在從JDK 9移植反序列化過(guò)濾器之前,這個(gè)功能對(duì)序列化和其他攻擊的類型(如SQL注入)來(lái)說(shuō)至關(guān)重要。

集成這個(gè)運(yùn)行時(shí)保護(hù)機(jī)制只需要修改啟動(dòng)標(biāo)志,將javaagent添加到啟動(dòng)選項(xiàng)中。例如,在Tomcat中,可以在bin/setenv.sh中添加這個(gè)標(biāo)志:

CATALINA_OPTS=-javaagent:/Users/ecostlow/Downloads/Contrast/contrast.jar

啟動(dòng)后,Tomcat將會(huì)初始化運(yùn)行時(shí)保護(hù)機(jī)制,并將其注入到應(yīng)用程序中。關(guān)注點(diǎn)的分離讓應(yīng)用程序可以專注在業(yè)務(wù)邏輯上,而安全分析器可以在正確的位置處理安全性。

其他有用的安全技術(shù)

在進(jìn)行維護(hù)時(shí),可以不需要手動(dòng)列出一長(zhǎng)串東西,而是使用像 OWASP Dependency-Check 這樣的系統(tǒng),它可以識(shí)別出已知安全漏洞的依賴關(guān)系,并提示進(jìn)行升級(jí)。也可以考慮通過(guò)像 DependABot 這樣的系統(tǒng)進(jìn)行庫(kù)的自動(dòng)更新。

雖然用意很好,但默認(rèn)的 Oracle序列化過(guò)濾器 存在與SecurityManager和相關(guān)沙箱漏洞相同的設(shè)計(jì)缺陷。因?yàn)樾枰煜巧珯?quán)限并要求提前了解不可知的事物,限制了這個(gè)功能的大規(guī)模采用:系統(tǒng)管理員不知道代碼的內(nèi)容,所以無(wú)法列出類文件,而開(kāi)發(fā)人員不了解環(huán)境,甚至DevOps團(tuán)隊(duì)通常也不知道系統(tǒng)其他部分(如應(yīng)用程序服務(wù)器)的需求。

移除未使用模塊的安全隱患

Java 9的模塊化JDK能夠 創(chuàng)建自定義運(yùn)行時(shí)鏡像 ,移除不必要的模塊,可以使用名為jlink的工具將其移除。這種方法的好處是黑客無(wú)法攻擊那些不存在的東西。

從提出模塊化序列化到應(yīng)用程序能夠?qū)嶋H使用以及使用其他序列化的新功能需要一段時(shí)間,但正如一句諺語(yǔ)所說(shuō):“種樹的最佳時(shí)間是二十年前,其次是現(xiàn)在”。

剝離Java的原生序列化功能還應(yīng)該為大多數(shù)應(yīng)用程序和微服務(wù)提供更好的互操作性。通過(guò)使用標(biāo)準(zhǔn)格式(如JSON或XML),開(kāi)發(fā)人員可以更輕松地在使用不同語(yǔ)言開(kāi)發(fā)的服務(wù)之間進(jìn)行通信——與Java 7的二進(jìn)制blob相比,python微服務(wù)通常具有更好的讀取JSON文檔的集成能力。不過(guò),雖然JSON格式簡(jiǎn)化了對(duì)象共享,針對(duì)Java和.NET解析器的“ Friday the 13th JSON attacks ”證明了銀彈是不存在的( 白皮書 )。

在進(jìn)行剝離之前,序列化讓然保留在java.base中。這些技術(shù)可以降低與其他模塊相關(guān)的風(fēng)險(xiǎn),在序列化被模塊化之后,仍然可以使用這些技術(shù)。

為Apache Tomcat 8.5.31模塊化JDK 10的示例

在這個(gè)示例中,我們將使用模塊化的JRE來(lái)運(yùn)行Apache Tomcat,并移除任何不需要的JDK模塊。我們將得到一個(gè)自定義的JRE,它具有更小的攻擊表面,仍然能夠用于運(yùn)行應(yīng)用程序。

確定需要用到哪些模塊

第一步是檢查應(yīng)用程序?qū)嶋H使用的模塊。OpenJDK工具jdeps可以對(duì)JAR文件的字節(jié)碼執(zhí)行掃描,并列出這些模塊。像大多數(shù)用戶一樣,對(duì)于那些不是自己編寫的代碼,我們根本就不知道它們需要哪些依賴項(xiàng)或模塊。因此,我使用掃描器來(lái)檢測(cè)并生成報(bào)告。

列出單個(gè)JAR文件所需模塊的命令是:

jdeps -s JarFile.jar

它將列出模塊信息:

tomcat-coyote.jar -> java.base
tomcat-coyote.jar -> java.management
tomcat-coyote.jar -> not found

最后,每個(gè)模塊(右邊的部分)都應(yīng)該被加入到一個(gè)模塊文件中,成為應(yīng)用程序的基本模塊。這個(gè)文件叫作module-info.java,文件名帶有連字符,表示不遵循標(biāo)準(zhǔn)的Java約定,需要進(jìn)行特殊處理。

下面的命令組合將所有模塊列在一個(gè)可用的文件中,在Tomcat根目錄運(yùn)行這組命令:

find . -name *.jar ! -path "./webapps/*" ! -path "./temp/*" -exec jdeps -s {} \; | sed -En "s/.* -\> (.*)/  requires \1;/p" | sort | uniq | grep -v "not found" | xargs -0 printf "module com.infoq.jdk.TomcatModuleExample{\n%s}\n"

這組命令的輸出將被寫入lib/module-info.java文件,如下所示:

module com.infoq.jdk.TomcatModuleExample{
  requires java.base;
  requires java.compiler;
  requires java.desktop;
  requires java.instrument;
  requires java.logging;
  requires java.management;
  requires java.naming;
  requires java.security.jgss;
  requires java.sql;
  requires java.xml.ws.annotation;
  requires java.xml.ws;
  requires java.xml;
}

這個(gè)列表比整個(gè)Java模塊列表要短得多。

下一步是將這個(gè)文件放入JAR中:

javac lib/module-info.java
jar -cf lib/Tomcat.jar lib/module-info.class

最后,為應(yīng)用程序創(chuàng)建一個(gè)JRE:

jlink --module-path lib:$JAVA_HOME/jmods --add-modules ThanksInfoQ_Costlow --output dist

這個(gè)命令的輸出是一個(gè)運(yùn)行時(shí),包含了運(yùn)行應(yīng)用程序所需的恰到好處的模塊,沒(méi)有任何性能開(kāi)銷,也沒(méi)有了未使用模塊中可能存在的安全風(fēng)險(xiǎn)。

與基礎(chǔ)JDK 10相比,只用了98個(gè)核心模塊中的19個(gè)。

java --list-modules

com.infoq.jdk.TomcatModuleExample
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

運(yùn)行這個(gè)命令后,就可以使用dist文件夾中的運(yùn)行時(shí)來(lái)運(yùn)行應(yīng)用程序。

看看這個(gè)列表:部署插件(applet)消失了,JDBC(SQL)消失了,JavaFX也不見(jiàn)了,很多其他模塊也消失了。從性能角度來(lái)看,這些模塊不再產(chǎn)生任何影響。從安全角度來(lái)看,黑客無(wú)法攻擊那些不存在的東西。保留應(yīng)用程序所需的模塊非常重要,因?yàn)槿绻鄙龠@些模塊,應(yīng)用程序也無(wú)法正常運(yùn)行。

關(guān)于作者

Java序列化的狀態(tài) Erik Costlow 是甲骨文的Java 8和9產(chǎn)品經(jīng)理,專注于安全性和性能。他的安全專業(yè)知識(shí)涉及威脅建模、代碼分析和安全傳感器增強(qiáng)。在進(jìn)入技術(shù)領(lǐng)域之前,Erik是一位馬戲團(tuán)演員,可以在三輪垂直獨(dú)輪車上玩火。

查看英文原文: The State of Java Serialization

 

來(lái)自:http://www.infoq.com/cn/articles/java-serialization-aug18

 

標(biāo)簽: Mysql 安全 代碼 服務(wù)器 互聯(lián)網(wǎng) 互聯(lián)網(wǎng)服務(wù) 漏洞 權(quán)限 通信

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:谷歌為何會(huì)選用TypeScript?

下一篇:SpringBoot | 第二十二章:定時(shí)任務(wù)的使用