Log4j2 殺不死 Java!
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
譯者:彎月
原文:https://foojay.io/today/log4j-isnt-killing-java/
譯文:https://blog.csdn.net/csdnnews/article/details/121951895
Java 作為頂級(jí)編程語言之一,已經(jīng)在企業(yè)級(jí)軟件開發(fā)領(lǐng)域活躍 25 年了。有人不斷宣傳 Java 已死,同時(shí)也有人堅(jiān)稱 Java 活得好好的。最近,又有報(bào)道稱 log4j 2 漏洞將再次“殺死” Java。我們?cè)_玩笑說,Java 博物館就好像是一個(gè)墓園,記錄了每一次“死亡”的經(jīng)過。
1、Java 開發(fā)人員應(yīng)該做哪些安全工作
快速給 JDK 和庫打補(bǔ)丁是當(dāng)前最有效的技術(shù),可避免絕大多數(shù)大規(guī)模的黑客攻擊。
給庫文件打補(bǔ)?。ū匦瑁?/strong>
當(dāng)代碼庫中存在漏洞時(shí),最有效的技術(shù)就是打補(bǔ)丁以去除漏洞。如果不給庫文件打補(bǔ)丁,那么應(yīng)用程序很有可能被黑客入侵,攻擊者將獲得系統(tǒng)及其數(shù)據(jù)的完整訪問權(quán)限。
無論在何種情況下,通常打補(bǔ)丁都很有效。
日志框架可能來自任何依賴項(xiàng),可能由另一個(gè)庫引入(即傳遞依賴項(xiàng)),而非由開發(fā)人員添加(即直接依賴項(xiàng))。我們可以使用依賴項(xiàng)分析工具,例如 Contrast Community Edition,來檢測(cè)依賴項(xiàng)和其他自定義的漏洞。
此外,還有一些分析依賴關(guān)系的開源工具,比如 Maven 依賴樹(dependency:tree)和 Gradle 依賴樹。NetBeans 等 IDE 也提供了依賴關(guān)系圖可視化工具。
對(duì)于 log4j2 漏洞,你必須升級(jí)到 2.15.0 或更高版本。
給 JRE 打補(bǔ)丁,升級(jí)到 Java 的安全基線(推薦,定期執(zhí)行)
每個(gè)Java 主要版本都會(huì)維護(hù)一個(gè)安全基線。由于每個(gè)季度 JDK 都會(huì)提供帶有新安全改進(jìn)的補(bǔ)丁,因此這個(gè)安全基線也會(huì)不斷向前移動(dòng)。低于安全基線的 Java 包含已知的安全問題,應(yīng)該升級(jí)。
這是標(biāo)準(zhǔn)的安全最佳實(shí)踐,與 log4j 2 漏洞沒有直接關(guān)系,也不會(huì)修復(fù)該漏洞。
各個(gè)團(tuán)隊(duì)可以使用 Foojay Disco API 自動(dòng)監(jiān)控安全基線,并及時(shí)地升級(jí)系統(tǒng)。開發(fā)人員可以將這個(gè)更新與 GitHub 操作相結(jié)合,確保在每次構(gòu)建代碼時(shí),都使用最新的安全更新。如果發(fā)生安全事件,則立即升級(jí) JRE,同時(shí)重新構(gòu)建并重新部署代碼。下面這個(gè)測(cè)試矩陣中就包含了這類的 GitHub 操作(https://github.com/foojayio/discoTestingMatrix)。
推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice
Java 安全基線的升級(jí)時(shí)間為:每年 1 月、4 月、7 月和 10 月,17 日前后的周二。詳細(xì)信息包含在Oracle 重要補(bǔ)丁更新計(jì)劃(https://www.oracle.com/security-alerts/)中,OpenJDK 漏洞組(https://foojay.io/pedia/security-vulnerability-management/)也采用了同一個(gè)計(jì)劃。此外,如果出現(xiàn)重大問題,Oracle 還會(huì)提供計(jì)劃外的安全更新。但 log4j 2 漏洞不屬于這種情況。
另外,最新最全的 Java 面試題整理好了,微信搜索Java面試庫小程序在線刷題。
以下配置演示了如何使用 Java 11 的安全基線:
jobs:
java11:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
update: [x]
package: [jdk, jre]
fail-fast: false
max-parallel: 4
name: ${{ matrix.package }} 11.0.${{ matrix.update }}, ${{ matrix.os }}
steps:
- uses: actions/checkout@v1
- name: Set up JDK 11 Zulu
uses: foojayio/setup-java@disco
with:
java-package: ${{ matrix.package }}
java-version: 11.0.${{ matrix.update }}
distro: zulu
- name: java -version
run: java -version
定期檢測(cè)自定義安全漏洞(推薦測(cè)試采用)
例如,集成分析器不只是簡(jiǎn)單地檢查 log4j2 存在與否及其版本,而且還可以確定攻擊者是否可以控制遠(yuǎn)程日志輸入。
此外,Contrast Community Edition 之類的免費(fèi)分析器還能夠即時(shí)捕獲 log4j 2,并捕獲許多其他的安全漏洞,例如:
應(yīng)用程序的 Hibernate、JBDC 或任何其他地方是否包含 SQL 注入問題? 遠(yuǎn)程用戶能否控制發(fā)送到 Runtime.exec 的任何輸入,即是否存在命令注入漏洞? 應(yīng)用程序使用了哪些加密算法,在何處使用,是否符合適當(dāng)?shù)臉?biāo)準(zhǔn)? 開發(fā)人員在結(jié)合使用多個(gè)庫時(shí),是否意外引入了某個(gè)安全漏洞,例如 OGNL 輸入解析? 以及其他應(yīng)用程序特有的安全漏洞。
使用 JDK Flight Recorder 監(jiān)控安全事件
JDK Flight Recorder 是現(xiàn)代 OpenJDK 發(fā)行版中包含的性能分析工具,它不僅可以生成一些安全信息,而且開銷非常低。各個(gè)團(tuán)隊(duì)可以使用 JDK Flight Recorder 來記錄許多 IO 操作,例如 JRE 訪問了哪些文件,或者哪些類會(huì)被反序列化。
通過使用 JDK Flight Recorder 監(jiān)視 Java 應(yīng)用程序事件,并通過數(shù)據(jù)流將事件傳輸?shù)桨踩畔⒑褪录芾恚⊿ecurity Information and Event Management,即SIEM)系統(tǒng)中,Java 團(tuán)隊(duì)就可以監(jiān)視異常行為,并通過可防止漏洞的 Java 反序列化過濾器來檢查各個(gè)類是否安全。
2、哪些安全措施沒有太大作用
網(wǎng)絡(luò)防御的效果不大。網(wǎng)上流傳著一個(gè)梗,一張經(jīng)過 PS 的汽車照片,其車牌號(hào)上包含了一條注入工具。這個(gè)梗的點(diǎn)就在于,開發(fā)人員都知道,車牌號(hào)會(huì)通過計(jì)算機(jī)視覺分析后記錄到日志中。構(gòu)成注入的數(shù)據(jù)并沒有出現(xiàn)在網(wǎng)絡(luò)層。同樣,大多數(shù)應(yīng)用程序使用數(shù)據(jù)的不同部分,解碼數(shù)據(jù)并記錄各種信息。任何網(wǎng)絡(luò)工具都無法匹配足夠多的模式來檢測(cè)安全問題。 通過觀察和追蹤來阻止攻擊者 IP 的方法并不是特別有效。雖然有些團(tuán)隊(duì)可能會(huì)維護(hù)一張攻擊者的列表,但 AWS IP 之所以被稱為彈性 IP,是因?yàn)檫@些 IP 會(huì)定期變化,因此,即便你阻止了某個(gè) IP,過一段時(shí)間可能就又解鎖了,或者很快就會(huì)受到不同 IP 的攻擊。

圖:該圖演示了網(wǎng)絡(luò)層無法檢測(cè)到的漏洞
系統(tǒng)屬性和動(dòng)態(tài)補(bǔ)丁的效果一般
有幾個(gè)補(bǔ)丁和系統(tǒng)屬性可以控制 log4j 2 的行為并阻止攻擊。有時(shí)候,有些庫無法及時(shí)更新,或者團(tuán)隊(duì)在努力更新依賴項(xiàng),但需要一定的時(shí)間,在這兩種情況下,就可以考慮這幾個(gè)補(bǔ)丁和系統(tǒng)屬性。
相關(guān)的 Java 系統(tǒng)屬性有兩個(gè):
-Dcom.sun.jndi.rmiobject.trustURLCodebase=false -Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false
將這兩個(gè)屬性設(shè)置為 false 可以阻止遠(yuǎn)程攻擊。
還有一個(gè)動(dòng)態(tài)的補(bǔ)丁,它可以連接到正在運(yùn)行的 JVM 并給其打補(bǔ)丁。這個(gè)補(bǔ)丁必須在 JVM 每次啟動(dòng)時(shí)應(yīng)用。雖然這兩種方法有一定的作用,但相較而言,更新庫更簡(jiǎn)單。
3、Java 如何處理日志
Java 開發(fā)人員一般可以從多個(gè)日志系統(tǒng)和記錄方式中進(jìn)行選擇。多年來,隨著社區(qū)的發(fā)展,許多日志框架也可以協(xié)同工作了:
System Logger(2017 年推出,推薦)是 JDK 9 中引入的日志系統(tǒng)。它改進(jìn)了 JDK Logger 的 API,并提供了類似于 SLF4j 的記錄方式,可以將 JDK 的日志重定向到應(yīng)用程序團(tuán)隊(duì)選擇的日志系統(tǒng)。 JDK Logger(2004 年推出)是 Java 1.4 中引入的日志系統(tǒng)。由于 JDK 中大量使用了該日志系統(tǒng),因此變得很流行,但是 API 有點(diǎn)蹩腳。雖然這個(gè)日志系統(tǒng)也不錯(cuò),但不如其他框架。 Log4j 和 Log4j2 是社區(qū)推薦的日志系統(tǒng),二者改進(jìn)了 API,因此開發(fā)團(tuán)隊(duì)可以更輕松地控制記錄的內(nèi)容以及各個(gè)級(jí)別的日志記錄數(shù)據(jù)的方式。 Logback 和 SLF4j 也是流行的日志系統(tǒng)。SLF4J 是一個(gè)簡(jiǎn)單的日志記錄方式,可幫助團(tuán)隊(duì)處理許多日志記錄,庫的維護(hù)人員可以將日志輸出到 SLF4J,然后由應(yīng)用程序開發(fā)人員配置他們將使用哪些底層的日志系統(tǒng)來統(tǒng)一輸出。此外 SLF4J 還建立了良好的 API,最大限度地減少了依賴關(guān)系。 JBoss Logger 是 JBoss 生態(tài)系統(tǒng)中的另一個(gè)流行的日志系統(tǒng)。該系統(tǒng)性能良好,而且運(yùn)行速度很快。如今它還支持其他流行框架,如 Quarkus。 Apache Commons-Logging(2002 年推出)誕生于 JDK 日志系統(tǒng)之前,并啟發(fā)了許多 API。它的最后一個(gè)版本是于 2014 年推出的,之后人們陸續(xù)開始采用其他以支持良好的日志記錄為目標(biāo)的 API。
2022年推薦的日志系統(tǒng)
依賴項(xiàng)越少越好,項(xiàng)目越新越好,因此我們可以考慮 System Logger。
有些項(xiàng)目擁有大量依賴項(xiàng),但優(yōu)勢(shì)在于它們使用的日志記錄工具與大多數(shù)的依賴項(xiàng)相同,只不過選用了其他日志記錄方式。
如果你沒有任何日志系統(tǒng),則可以考慮 System Logger,它是一款擁有良好 API 的 JDK 日志記錄工具。
日志系統(tǒng)到底是做什么的?
日志框架能夠讓應(yīng)用程序的主人看到通用格式的日志消息、時(shí)間戳、線程名稱以及其他數(shù)據(jù)。
此外,團(tuán)隊(duì)可以將不同的輸出重定向到不同的位置,甚至無需顯示出來,例如,你可以將訪問日志發(fā)送到一個(gè)文件,將系統(tǒng)報(bào)告發(fā)送到其他地方,然后選擇顯示所有級(jí)別的日志信息,或者動(dòng)態(tài)查看某個(gè)庫的調(diào)試信息。
怎么接私活?這個(gè)渠道你100%有用!請(qǐng)收藏!
喜歡文章,點(diǎn)個(gè)在看


