log4j2的核彈漏洞是如何被發(fā)現(xiàn)的?
開篇
上一篇文章log4j2的codeql規(guī)則我看了codeql官方的規(guī)則,然后發(fā)現(xiàn)了一個2020年的規(guī)則,從而推出很可能是codeql挖到的(現(xiàn)在哪個大佬還一個個代碼看idea挖洞啊,那都是廉價安服小弟干的事情)
隨著科學(xué)技術(shù)的發(fā)展和摩爾定律的規(guī)律,我們現(xiàn)在挖洞已經(jīng)不是一個個看代碼的php時代的時候了,其實這些0day難挖嗎?我和你說:一點都不!
我們現(xiàn)在挖掘漏洞有各種辦法,一個是人經(jīng)驗上的閱讀代碼,一個是掃描,包括iast掃描,但是我看來,iast的挖掘0day和靜態(tài)代碼里的call graph差不多,沒啥區(qū)別,只是iast動態(tài)的,靜態(tài)代碼遇到一些動態(tài)的場景會嗝屁。不過隨著各種靜態(tài)代碼掃描的方式的改進,人們不斷去研究安全方面的編譯問題,使得未來這些問題都可以有辦法迎刃而解。
如果您正在學(xué)習(xí)Spring Boot,那么推薦一個連載多年還在繼續(xù)更新的免費教程:http://blog.didispace.com/spring-boot-learning-2x/
lgtm
阿里的作者首先關(guān)注了codeql,并且關(guān)注了codeql的前身:lgtm。
https://lgtm.com/ 這個是他的官方網(wǎng)站,這個網(wǎng)站支持在線掃描一個github上的項目,當(dāng)然是用codeql,這個codeql和我們?nèi)ハ螺d的codeql有啥區(qū)別?這個我還真的不知道。
我們來看一個有趣的頁面
https://lgtm.com/projects/g/apache/logging-log4j2/alerts/?mode=list
打開這個url 你會看到一個commit為50979af的掃描結(jié)果,這個掃描是codeql掃描的。
我直接上結(jié)果

可以很明顯看到codeql掃到了這次我們的0day,并且和我推測的一樣,作者是用了已經(jīng)別人寫好的規(guī)則掃到的,這個規(guī)則在codeql的security目錄下并且編號是cwe-074
CWE-074
我們來看下這個規(guī)則的具體邏輯,這個CWE-074規(guī)則之前一直處于試驗狀態(tài),對應(yīng)的編號是CWE-117,今年轉(zhuǎn)正過了試用期,變成正式的規(guī)則了。

首先,這個規(guī)則是一個非常保守和常規(guī)的開局布局。里面寫了2個數(shù)據(jù)流邏輯,我們看第一個,
source是remoteflowsource,這個類在廣大安全工程師的迭代下已經(jīng)相當(dāng)完善了,這個source幾乎是一個不用改的地方了,然后過濾也是很簡單,java基礎(chǔ)類型的都干掉,因為long什么的不可能jndi注入,最后是sink,sink里寫了一大堆的可能點,這個和SQL注入里的jdbc.execute之類是一樣的。

這個看著像是字節(jié)碼,但是可能是codeql自己生成的一種ir。把大量的lookup之類的列入了sink。這種寫法是比較原生的,我們拿到未解析之前的一個node就是這樣的,作者比較懶。。。
第二條數(shù)據(jù)流進不說了,暫時和這個應(yīng)該沒關(guān)系。
如果您正在學(xué)習(xí)Spring Cloud,推薦一個經(jīng)典教程(含Spring Cloud Alibaba):https://blog.didispace.com/spring-cloud-learning/
結(jié)論
所以到這里,我們可以看到開源的東西,規(guī)則的確也是開源的,正如作者所說的,一切都是公開的,為什么你們沒發(fā)現(xiàn)?
其實可能有些人發(fā)現(xiàn)了有些人沒有,有的開發(fā)把lookup當(dāng)作一個功能。但是我覺得不是,只是大家都在上班,沒人工作就是挖這種0day,要么就是挖0day的人知道,不想公開而已。畢竟規(guī)則開源,這種的確很好挖的。真的沒難度?。。?!你以為組件的0day很難嗎?可能你缺的是不知道如何編譯原生jdk到codeql數(shù)據(jù)庫 不知道如何寫ql查詢,不知道在什么情況下數(shù)據(jù)流斷了,斷了怎么連,xml怎么編譯進去,怎么寫ql的代碼去識別自定義的框架等等。
我是不知道他們怎么想的,因為這個規(guī)則的誕生明顯就說明一件事情:有安全人員知道sink是lookup的就是危險的,并且有那么多組件,咋就沒人去掃下。。理論上挖hackerone的小伙子 如饑似渴。。。
總結(jié)
1.把你要掃描開源代碼的git地址粘貼到lgtm網(wǎng)站里

2.等待掃描

3.等待閱讀漏洞

4.拿0day去做法律范圍內(nèi)合法的事情,或者報告給官方,或者去刷hackerone都行。
當(dāng)然真正的 用好codeql工具比上面這4個步驟更麻煩點。
題外話
1)fortify可以掃嗎?
其實理論上是可以的,但是fortify就一言難盡,不是很友好的規(guī)則編寫,在一些情況下難以編寫掃描。
2)真的這么簡單嗎?codeql掃掃就挖到漏洞了?
是的,真的是掃掃就挖到了……
3)codeql怎么學(xué)啊?
看官方文檔,或者國內(nèi)一些同學(xué)的資料,我以前也寫過,不過被我刪了。有緣再放出來吧。
其實0day挖多了也就這樣,時間久了你會和我一樣覺得無聊,不就天天寫寫規(guī)則而已,無趣,有些apache項目,千瘡百孔,我學(xué)codeql的時候,還以為自己遇到了一個靶場…,然后你就會一起來重新學(xué)習(xí)編譯原理,然后一步步找資料,然后加各種編譯原理的微信群,然后去聽北大熊英飛老師的課,南大譚添老師的課等。那才是正確的方向,我們要自主可控這些東西,這方面的人才還是太少了,安全圈懂這些的也太少了
譚老師和我差不多大 哎 真是年少有為啊!太強了 膜拜下。
好了,希望大家好好學(xué)習(xí) 不要挖無意義的0day,反正挖了也沒啥用,我懷疑美國jun方早就把github用超算跑著,畢竟很多大廠都在做這個事情,武器庫的0day級別不是一個等級的。log4j可能只是usa 棱鏡計劃里的冰山一角里的一角,小的可憐。
所以一起來看這個編譯原理課程吧~ 為真正的國家安全做一份力。
往期推薦
技術(shù)交流群
點擊閱讀原文,送你免費Spring Boot教程!
