Log4shell 是什麼?
Log4j 是 Apache 基於 Java 開發而成的開源伺服器軟體,是程式內的紀錄工具,可保存執行活動的過程,常被開發人員用來查找錯誤,已被廣泛應用於各種應用程式和網路服務,用戶含括全球知名企業與組織。近日被發現含有 CVE-2021-44228 漏洞,又名Log4Shell,為 Log4j 的 JNDI API 未能驗證遠端攻擊者由惡意 LDAP 或其他端點發送修改過參數的日誌訊息,故當攻擊者能夠掌控日誌訊息或日誌訊息參數,且訊息查詢取代(message lookup substitution) 功能啟用的話,將能自 LDAP 伺服器下載惡意程式碼至受害系統執行,最嚴重可接管整臺系統。由於其應用廣泛,且攻擊複雜度低,故此漏洞影響範圍甚廣且嚴重程度高,是近十年最嚴重的弱點之一。
影響範圍(包含但不僅限於)
專案:Apache Tomcat、Apache Struts2、Apache Spark、Apache Solr、Apache Druid、Apache Flink
版本:Log4j 2.0-beta-9及其以上的版本到 2.14.1及其以下版本
修補建議
請盡速評估並將 Apache Log4j 2 升級到 2.15.0 版(以上)並進行測試,檢視 Log 對應資料是否有異常,以及確認相關資安設備影響(如: IDS、IPS、Log Server、SIEM、MDR 等 Log 使用狀況)。
更新檔案
修補措施概念錯誤說明
1. 單純透過 WAF 並不能完整保護應用程式免受攻擊影響,因為各種規避 WAF 的變種 Payload 已大量出現。
2. 更新 JAVA 至特定版本並不能完整保護應用程式免受攻擊影響,已有對應規避的攻擊手法。
3. 透過修改日誌陳述表達式,將日誌信息格式 PatternLayout 指定為 %m{nolookups} (取代掉原本的%m),不是長遠與安全的做法,並有可能造成 Log 字串串接異常。
註:所有修補都建議先在測試環境實施緩解,並進行弱點測試確認是否緩解,後續評估 Log 資訊對環境影響
緩解措施
2.10 及其以上版本(等效修補方式):
1.在 JVM command line 配置參數-Dlog4j2.formatMsgNoLookups=true
2. 在 log4j2.component.properties 設定檔裡配置 log4j2.formatMsgNoLookups=true
3. Linux 透過在 export LOG4J_FORMAT_MSG_NO_LOOKUPS=true 配置到環境變數中
4. /etc/environment 環境變數設定 LOG4J_FORMAT_MSG_NO_LOOKUPS=true
2.0-beta9 及其以上版本到 2.10.0 及其以下版本
將 JndiLookup 有弱點類別從程式庫中移除:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
Log4shell 檢測方式
1. 白箱:直接確認源碼程式庫引用
2. 灰箱:市面上常見的弱點掃描工具已提供可對應此弱點的測試套件,或是針對此弱點的掃描範本。由於遠端弱點驗證需透過 Callback 行為確認,故進行遠端網路檢測時須確保網路環境 (如防火牆政策或資安設備可能會影響掃描結果);若無法確認網路環境,為確保測試結果的準確性,建議使用 Credentialed scans 進行掃描。
3. 黑箱:人工使用開源專屬工具進行手動測試。
4. Log4Shell-Detector:透過檢查特定對應目錄下的 log 紀錄內容,是否有攻擊嘗試的關鍵字串。