作者:riusksk
公眾號:漏洞戰爭
註:本文為原文上下篇合集
在上篇文章《推薦今年C3黑客大會上的幾個議題》中提到“Attacking Chrome IPC”這個議題,我覺得該議題最大的亮點是在前半場,作者nedwill是之前在Hack2Win大賽上因攻破Chrome瀏覽器而一戰成名,他講了如何訓練漏洞研究能力的過程,講述自己這幾年在漏洞研究上的歷程和心得,很勵志,其建議也非常具有可操作性,值得效仿學習。我反覆看了多遍,對其作了一些總結和補充。
1、刻意練習10000小時
這份“雞湯”道理,想必大家都懂,就不解釋了,不懂的自行百度,或者去讀讀《異類》這本經典書籍。
作者建議以月為單位來制定研究目標,他曾連續花了6個月的時間來研究Chrome Sandbox,但最終一無所獲。
所以,有時堅持了不一定能達到目標,但不堅持,就更沒戲了。
2、訓練挖洞的雙技能
-
看洞:哪裡看?歷史漏洞的git log、bug報告、代碼質量報告等等
-
識洞:就是肉眼看代碼找漏洞,即代碼審計,難點也就是在這上面,訓練方法繼續往下看
3、代碼審計訓練
-
根據自己目標定位,尋找相應的歷史漏洞案例進行學習,比如要搞chrome就找chrome的歷史漏洞
-
掌握漏洞所在的模塊或子系統,但不看完整的漏洞細節描述,嘗試在漏洞版本中找出對應的漏洞
-
如果(2)中未能找出漏洞,就去看漏洞細節描述,對比自己的審計過程,看遺漏了哪一步驟
-
不斷重複上述訓練,直至相信:挖洞只是體力消耗,而非能力問題
這第4點說得,非常勵志,因為挖洞挖久了,有時真的容易懷疑自己的能力,目標難度越大,越容易打擊人。
作者第一次訓練的漏洞是j00ru(Project Zero成員)的IDA漏洞:https://j00ru.vexillium.org/2014/10/secure-2014-slide-deck-and-hex-rays-ida-pro-advisories-published/,2014年的文章了
4、3~5年的訓練計劃
1~2年:做做 CTF 或 WarGames 題目,網上有很多CTF writeup可以參考學習
2~3年:簡單點的目標,就是找相對容易挖的產品
3~5年:困難點的目標
目標的難易程度可以直接參考相應的產品的漏洞獎勵計劃或私有市場的價格,挑選出一份目標清單,按難易程度排序,逐一去實現它。
5、Fuzzing訓練
作者代碼審計2年後,才開始嘗試Fuzzer開發。
-
拿已公開的歷史漏洞問自己:如何寫fuzzer挖掘到此漏洞?
-
如果自己不知道此漏洞,那又能夠挖掘到呢?
-
不斷重複訓練並改進fuzzer,相信會有更多漏洞被意外發現
6、努力往往比運氣和天賦更重要
雖然挖洞也需要一定運氣和天賦,但多數你認為的挖洞天才,其實只不過是花了比你多100倍,甚至更多的時間在這項技術研究上而已
7、進入研究者團隊或社區,互相學習
國外的交流氛圍會比國內的更好一些,也更願意分享。
很多時候自己的交流圈,大多是一些熟識的同行,或者同事,一般可交流的人還是比較少的。
經常在網上看到不少人會問,如何認識xx大牛、黑客,但其實很多時候卻是:
努力提高自己的專業能力,圈子最終會吸納你進去認識更多圈內人。
8、建立自己的漏洞信息來源
RSS訂閱無疑是自己最好的方式,這個需要依賴平時自己去不斷收集訂閱。
很多漏洞相關的博文,往往曝露出某些軟件新的攻擊面,搶佔先機就顯得尤為重要,比如當年Android stagefirght mp4漏洞、word公式編輯器、adobe圖片轉換器等等,如果能及時關注並嘗試去挖掘,往往可以收穫不少漏洞的。
9、收集和學習開源的漏洞挖掘工具
比如afl、honggfuzz、libfuzzer等很多優秀的漏洞挖掘工具,都是值得好好閱讀代碼,學習其中的fuzzing思路,可以更好地應用到未來的漏洞挖掘研究上。
10、很多不願搞研究工作的挖洞人,只不過是為了權衡利弊
在《從0到1:開啟商業與未來的秘密》一書中有一章叫做“秘密”,漏洞研究可以當作挖掘秘密,為什麼人們不探索秘密呢?書中提到4種原因,我覺得同樣適用於漏洞研究領域:
-
漸進主義:把目標定得低一些,更容易取得好成績;
-
風險規避:人們害怕秘密是因為怕犯錯,除此之外,可能也擔心KPI沒法完成,又或者挖洞拿到的獎金又該如何跟公司“分贓”呢?
-
自滿:很多時候,某些人可以坐享其成,又何必自己去挖掘秘密;國內研究氛圍又喜歡搞營銷吹牛逼,牛逼吹多了吹大了,有時連自己都信了;
-
扁平化:任何一個擁有雄心壯志的人,在涉及某一研究領域之前都會問自己一個問題:如果有可能挖掘到漏洞,難道全球人才庫中更加聰明、更加有技術能力的人還沒有發現嗎?這種懷疑的聲音阻止了不少人去探索秘密,從事研究工作,因為身處的世界似乎大到任何個人都無法做出獨特的貢獻。
小結
今年因個人原因,已從安全研究轉向業務安全,深知研究的不易。
相信安全領域有秘密的存在,雖會導致黑產的誕生,但肯定也會因此誕生一些優秀的研究者。
這裡以白樺的《船》致敬所有仍在安全研究道路上前進的人,與諸君共勉:
我有過多次這樣的奇遇,
從天堂到地獄只在瞬息之間:
每一朵可愛、溫柔的浪花
都成了突然崛起、隨即傾倒的高山。每一滴海水都變臉色,
剛剛還是那樣的美麗、蔚藍;
旋渦糾纏着旋渦,
我被拋向高空又投進深淵……當時我甚至想到過輕生,
眼前一片苦海無邊;
放棄了希望就像放棄了舵柄,
在暴力之下只能沉默和哀嘆。今天我才有資格嘲笑昨天的自己,
為昨天落葉似的惶恐感到羞慚;
虛度了多少年華,
船身多次被礁石撞穿……千萬次在大洋里撒網,
才捕獲到一點點生活的經驗,
才恍然大悟,
啊!道理原是如此淺顯;你要航行嗎?
必然會有千妖百怪出來阻攔;
暴虐的欺凌是它們的遊戲,
製造滅亡是它們唯一的才幹。命中注定我要常常和它們相逢,
因為我的名字叫做船;
面對強大於自身千萬倍的對手,
能援救自己的只有清醒和勇敢。恐懼只能使自己盲目,
盲目只能誇大魔鬼的猙獰嘴臉;
也許我的樣子比它們更可怕,
當我以命相拼,一往無前!只要我還有一根完整的龍骨,
絕不駛進避風的港灣;
把生命放在征途上,
讓勇敢來決定道路的寬窄、長短。我完完全全的自由了,
船頭成為埋葬它們的鐵鏟;
我在波浪中有節奏地跳躍,
就像盪着一個巨大的鞦韆。即使它們終於把我撕碎,
變成一些殘破的木片,
我不會沉淪,決不!
我還會在浪尖上飛旋。後來者還會在殘片上認出我,
未來的詩人會唱然長嘆:
“這裡有一個幸福的靈魂,
它曾經是一艘前進着的航船……”
11、工具與方法論沉澱
雖說代碼審計是項必備技能,但終究是項體力活。
有些漏洞(比如邏輯漏洞)可能就需要人工審計,但也有不少漏洞是可以自動化Fuzzing,一些能自動化或半自動化實現的,盡量寫程序自動化。
因為,純人工審計終究熬不過年紀,熬不過團隊人員的離散變遷,熬不過互聯網的快速發展……
比如,2012年剛開始寫《漏洞戰爭》時,單身一人,從早上8點多起床吃飯,然後開始調代碼、看代碼,一直奮戰到晚上12點,身體無壓力。近7年過去了,現在要是這麼折騰,身體就要散架了……
比如,團隊里的人分工做不同領域的代碼審計,若無工具和方法論沉澱,那麼有人走的話,此人對應的領域可能就無法持續產出;若有新人加入,代碼審計的技能又不好傳承,很多又得重頭來。所以,一直覺得,好的團隊應該是,即使人員離散變遷,依然能夠獨立運作、持續產出。
比如,Linux內核在2018年凈增87萬行代碼,很多類似複雜龐大的項目,看代碼有時看都看不過來,一般都是針對性地挑模塊作代碼審計。
再比如,Fuzzer開發裡面就有很多共用功能是可以直接做成框架沉澱下來,文件變異、崩潰監控、樣本去重精簡等等,很多時候有個新的攻擊面需要測試,就可以直接在框架的基礎上寫fuzzer,將會高效很多。下文提到的一個IE漏洞挖掘案例就是基於這思路挖到的。
我曾經想開發兩個漏洞挖掘系統,一個二進制,一個Web,名字都想好了,合稱”冰弓玄箭“,就是英雄聯盟中寒冰射手的那套裝備,但一直都沒什麼業餘時間去開發,僅寫了個界面,希望2019年有機會能夠完成:
转载请注明:IAMCOOL » 安全研究者的自我修養(完整版)