主頁 > 後端開發 > Log4j 2 殺不死 Java!

Log4j 2 殺不死 Java!

2021-12-22 06:09:25 後端開發

作者:Erik Costlow
譯者:彎月
原文:https://foojay.io/today/log4j-isnt-killing-java/
譯文:https://blog.csdn.net/csdnnews/article/details/121951895

Java 作為頂級編程語言之一,已經在企業級軟體開發領域活躍 25 年了,有人不斷宣傳 Java 已死,同時也有人堅稱 Java 活得好好的,最近,又有報道稱 log4j 2 漏洞將再次“殺死” Java,我們曾開玩笑說,Java 博物館就好像是一個墓園,記錄了每一次“死亡”的經過,

上周,技術圈被 log4j 2 漏洞掀起巨浪,各大安全公司紛紛發文介紹該漏洞的危害,并給出了各種臨時解決方案,還有一些博主也發表文章教我們如何找到易受攻擊的地方,并采取相應的防御措施,還有大量帖子跟著起哄,討論如何采用一些不必要的防御技術,

目前,log4j 2 官方團隊已發布 2.16.0 新版本,加固漏洞防御機制,log4j 2 是一款基于 Java 研發的開源日志系統,因此,當史詩級漏洞被爆出后,便有人宣稱 log4j 2 漏洞將再次“殺死” Java,已經被“死亡”過無數次的 Java,就像是開了一個墓園,記錄每次“死亡”經過,

本文將簡單介紹一下 Java 生態系統,說明什么是日志記錄框架、在何處使用以及使用的原因,此外,還將介紹各個團隊應當如何觀察和控制 JVM 的行為,

1、Java 開發人員應該做哪些安全作業

快速給 JDK 和庫打補丁是當前最有效的技術,可避免絕大多數大規模的黑客攻擊,

給庫檔案打補丁(必需)

當代碼庫中存在漏洞時,最有效的技術就是打補丁以去除漏洞,如果不給庫檔案打補丁,那么應用程式很有可能被黑客入侵,攻擊者將獲得系統及其資料的完整訪問權限,

無論在何種情況下,通常打補丁都很有效,

日志框架可能來自任何依賴項,可能由另一個庫引入(即傳遞依賴項),而非由開發人員添加(即直接依賴項),我們可以使用依賴項分析工具,例如 Contrast Community Edition,來檢測依賴項和其他自定義的漏洞,

此外,還有一些分析依賴關系的開源工具,比如 Maven 依賴樹(dependency:tree)和 Gradle 依賴樹,NetBeans 等 IDE 也提供了依賴關系圖可視化工具,

對于 log4j2 漏洞,你必須升級到 2.15.0 或更高版本,

給 JRE 打補丁,升級到 Java 的安全基線(推薦,定期執行)

每個Java 主要版本都會維護一個安全基線,由于每個季度 JDK 都會提供帶有新安全改進的補丁,因此這個安全基線也會不斷向前移動,低于安全基線的 Java 包含已知的安全問題,應該升級,

這是標準的安全最佳實踐,與 log4j 2 漏洞沒有直接關系,也不會修復該漏洞,

各個團隊可以使用 Foojay Disco API 自動監控安全基線,并及時地升級系統,開發人員可以將這個更新與 GitHub 操作相結合,確保在每次構建代碼時,都使用最新的安全更新,如果發生安全事件,則立即升級 JRE,同時重新構建并重新部署代碼,下面這個測驗矩陣中就包含了這類的 GitHub 操作(https://github.com/foojayio/discoTestingMatrix),

Java 安全基線的升級時間為:每年 1 月、4 月、7 月和 10 月,17 日前后的周二,詳細資訊包含在Oracle 重要補丁更新計劃(https://www.oracle.com/security-alerts/)中,OpenJDK 漏洞組(https://foojay.io/pedia/security-vulnerability-management/)也采用了同一個計劃,此外,如果出現重大問題,Oracle 還會提供計劃外的安全更新,但 log4j 2 漏洞不屬于這種情況,

以下配置演示了如何使用 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

定期檢測自定義安全漏洞(推薦測驗采用)

自動化安全工具可以捕獲安全漏洞,不需要安全專業知識,將這類安全工具集成到 Java 應用程式,就可以實作安全監測,并記錄安全資訊,有些工具會根據依賴項的數量來決定是否存在漏洞,而這種方法則會根據依賴資訊,由集成的分析器來報告這些依賴庫的組合情況,并判斷組合后是否安全,

例如,集成分析器不只是簡單地檢查 log4j2 存在與否及其版本,而且還可以確定攻擊者是否可以控制遠程日志輸入,

此外,Contrast Community Edition 之類的免費分析器還能夠即時捕獲 log4j 2,并捕獲許多其他的安全漏洞,例如:

  • 應用程式的 Hibernate、JBDC 或任何其他地方是否包含 SQL 注入問題?
  • 遠程用戶能否控制發送到 Runtime.exec 的任何輸入,即是否存在命令注入漏洞?
  • 應用程式使用了哪些加密演算法,在何處使用,是否符合適當的標準?
  • 開發人員在結合使用多個庫時,是否意外引入了某個安全漏洞,例如 OGNL 輸入決議?
  • 以及其他應用程式特有的安全漏洞,

使用 JDK Flight Recorder 監控安全事件

JDK Flight Recorder 是現代 OpenJDK 發行版中包含的性能分析工具,它不僅可以生成一些安全資訊,而且開銷非常低,各個團隊可以使用 JDK Flight Recorder 來記錄許多 IO 操作,例如 JRE 訪問了哪些檔案,或者哪些類會被反序列化,

通過使用 JDK Flight Recorder 監視 Java 應用程式事件,并通過資料流將事件傳輸到安全資訊和事件管理(Security Information and Event Management,即SIEM)系統中,Java 團隊就可以監視例外行為,并通過可防止漏洞的 Java 反序列化過濾器來檢查各個類是否安全,

2、哪些安全措施沒有太大作用

對于 log4j 2 漏洞的問題,Web Application Firewall(WAF)之類基于網路的防御和工具可能在短期內有一定的效果,但通常都沒有太大作用,而且作業量非常大,

  • 網路防御的效果不大,網上流傳著一個梗,一張經過 PS 的汽車照片,其車牌號上包含了一條注入工具,這個梗的點就在于,開發人員都知道,車牌號會通過計算機視覺分析后記錄到日志中,構成注入的資料并沒有出現在網路層,同樣,大多數應用程式使用資料的不同部分,解碼資料并記錄各種資訊,任何網路工具都無法匹配足夠多的模式來檢測安全問題,
  • 通過觀察和追蹤來阻止攻擊者 IP 的方法并不是特別有效,雖然有些團隊可能會維護一張攻擊者的串列,但 AWS IP 之所以被稱為彈性 IP,是因為這些 IP 會定期變化,因此,即便你阻止了某個 IP,過一段時間可能就又解鎖了,或者很快就會受到不同 IP 的攻擊,

圖:該圖演示了網路層無法檢測到的漏洞

系統屬性和動態補丁的效果一般

有幾個補丁和系統屬性可以控制 log4j 2 的行為并阻止攻擊,有時候,有些庫無法及時更新,或者團隊在努力更新依賴項,但需要一定的時間,在這兩種情況下,就可以考慮這幾個補丁和系統屬性,

相關的 Java 系統屬性有兩個:

  • -Dcom.sun.jndi.rmiobject.trustURLCodebase=false
  • -Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false

將這兩個屬性設定為 false 可以阻止遠程攻擊,

還有一個動態的補丁,它可以連接到正在運行的 JVM 并給其打補丁,這個補丁必須在 JVM 每次啟動時應用,雖然這兩種方法有一定的作用,但相較而言,更新庫更簡單,

3、Java 如何處理日志

Java 開發人員一般可以從多個日志系統和記錄方式中進行選擇,多年來,隨著社區的發展,許多日志框架也可以協同作業了:

  • System Logger(2017 年推出,推薦)是 JDK 9 中引入的日志系統,它改進了 JDK Logger 的 API,并提供了類似于 SLF4j 的記錄方式,可以將 JDK 的日志重定向到應用程式團隊選擇的日志系統,
  • JDK Logger(2004 年推出)是 Java 1.4 中引入的日志系統,由于 JDK 中大量使用了該日志系統,因此變得很流行,但是 API 有點蹩腳,雖然這個日志系統也不錯,但不如其他框架,
  • Log4j 和 Log4j2 是社區推薦的日志系統,二者改進了 API,因此開發團隊可以更輕松地控制記錄的內容以及各個級別的日志記錄資料的方式,
  • Logback 和 SLF4j 也是流行的日志系統,SLF4J 是一個簡單的日志記錄方式,可幫助團隊處理許多日志記錄,庫的維護人員可以將日志輸出到 SLF4J,然后由應用程式開發人員配置他們將使用哪些底層的日志系統來統一輸出,此外 SLF4J 還建立了良好的 API,最大限度地減少了依賴關系,
  • JBoss Logger 是 JBoss 生態系統中的另一個流行的日志系統,該系統性能良好,而且運行速度很快,如今它還支持其他流行框架,如 Quarkus,
  • Apache Commons-Logging(2002 年推出)誕生于 JDK 日志系統之前,并啟發了許多 API,它的最后一個版本是于 2014 年推出的,之后人們陸續開始采用其他以支持良好的日志記錄為目標的 API,

2022年推薦的日志系統

依賴項越少越好,專案越新越好,因此我們可以考慮 System Logger,

有些專案擁有大量依賴項,但優勢在于它們使用的日志記錄工具與大多數的依賴項相同,只不過選用了其他日志記錄方式,

如果你沒有任何日志系統,則可以考慮 System Logger,它是一款擁有良好 API 的 JDK 日志記錄工具,

日志系統到底是做什么的?

日志框架能夠讓應用程式的主人看到通用格式的日志訊息、時間戳、執行緒名稱以及其他資料,

此外,團隊可以將不同的輸出重定向到不同的位置,甚至無需顯示出來,例如,你可以將訪問日志發送到一個檔案,將系統報告發送到其他地方,然后選擇顯示所有級別的日志資訊,或者動態查看某個庫的除錯資訊,

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.勁爆!Java 協程要來了,,,

3.玩大了!Log4j 2.x 再爆雷,,,

4.Spring Boot 2.6 正式發布,一大波新特性,,

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388905.html

標籤:Java

上一篇:Jaeger的客戶端采樣配置(Java版)

下一篇:Springboot MVC 自動配置

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more