0
瀏覽器就像一扇窗,通過這扇窗,黑客可以攻入電腦的心臟。
就像情場高手,通過眼睛,融化一個人的心靈。
黃正,百度安全實驗室 X-Team 掌門人。2016年,這個信仰“技術可以改變世界”的低調黑客大牛以一己之力挖掘無數瀏覽器漏洞,創(chuàng)下了排名微軟 MSRC 2016 年度黑客貢獻榜中國區(qū)第一(世界第八)的壯舉。
從一個安全開發(fā)工程師華麗轉身,成為安全研究員,黃正最終站在了中國瀏覽器漏洞挖掘的頂峰。本期硬創(chuàng)公開課,我們將會請到黃正為雷鋒網宅客頻道的讀者童鞋們奉獻一場純干貨——如何用正確的姿勢挖掘瀏覽器漏洞。
從上千萬行代碼中,精準地找到那個微小的漏洞,恰如站在萬里之遙,拉弓搭箭。正中靶心。
以下,是雷鋒網宅客頻道(公眾號:宅客頻道)誠意奉上的公開課全文及完整 PPT。
我是百度安全實驗室的黃正,在百度參與過網頁掛馬檢測、釣魚欺詐檢測、病毒木馬分析、偽基站檢測、泛站群打擊、漏洞挖掘和漏洞利用等。
在百度做惡意網頁檢測相關的開發(fā)工作,可以說是一個職業(yè)“鑒黃師”,其實“鑒黃”是一個非常有挑戰(zhàn)的事情,每天要檢測幾億/幾十億的網頁,怎樣設計存儲、調度、檢測算法,才能在有限的服務器、帶寬,在有限的時間內檢測完,還要去保證檢出率和誤報率。
所以惡意網頁檢測是一個比較偏工程的方向,我呢還是有一顆黑客的心,還挑戰(zhàn)一些新的安全技術方向。想去挖漏洞,所以在早期組建安全實驗室團隊時就加入了 X-Team,從安全開發(fā)工程師切換到做瀏覽器漏洞挖掘,今天給大家分享的議題是瀏覽器漏洞挖掘,希望大家能有所收獲。
今天先給大家科普一下瀏覽器的一些基礎知識,再回顧看一下瀏覽器漏洞類型,重點講怎么去做一個 Fuzz 系統(tǒng),以及分享一些我們曾經發(fā)現過的一些漏洞POC,最后再分享一下怎么給微軟、GOOGLE、蘋果報告安全漏洞。
首先,瀏覽器是干嘛用的。大家都知道是用來看網頁用的,再往底層一點呢,它是把html代碼按照一定的標準繪制成在屏幕上肉眼可見的圖像用的。
比如,像這段html代碼,瀏覽器會按照一定的標準去把他變成一張肉眼可見的網頁:
瀏覽器廣泛存在各個地方,Windows,Mac OS X,iOS/iPad,Android,Play station(PS 4),QT,ATM。微信里也有瀏覽器,可能你每天都在用,但是你不知道。
那么瀏覽器是怎么把 Html 代碼渲染成網頁的呢?來看一張瀏覽器渲染引擎的結構圖:
渲染引擎大致可以分成4塊:
HTML解釋器:將HTML文本解釋成DOM;
CSS解釋器:解析CSS,為DOM中的各個元素計算樣式信息;
布局:根據元素與樣式信息,計算大小、位置、布局;
Javascript引擎:解釋js腳本,修改DOM、CSS。
最后使用圖像庫,將布局繪制成圖像結果,也就是人眼看見的網頁。
什么是DOM樹呢?
DOM樹是把 HTML 文檔呈現為帶有元素、屬性和文本的樹結構。比如以下HTML將被解析成如下DOM樹:
使用 DOM 給 JS 開放的接口,可以用用 JS 操作 DOM 對象的屬性。這里列舉一些常見的 DOM 方法:
調用這些 DOM 方法,對 DOM 的修改,最終會體現在繪圖上,也就是肉眼可見的網頁變化。DOM的標準也在不斷在升級:
DOM level 1、DOM level 2、DOM level 3、DOM level 4...
瀏覽器是一個很復雜的工程,不僅要去支持不同時候的DOM標準,而且不同的瀏覽器為了讓解析的速度變得更快,讓用戶使用得更方便,在不斷地增加新功能。從13年的新聞來看,Chrome 瀏覽器的代碼應該至少有1000萬行。
代碼越多,開發(fā)的人員越多,就容易出現安全問題。接著介紹一下瀏覽器的漏洞類型,我自己的分類方法,不一定合理。
比如老的IE瀏覽器可以用 JS 檢測是否存在某文件。這樣會泄漏用戶是否安裝了殺毒軟件,以便進行下一步操作。
有些信息泄漏漏洞會泄漏內存的信息,攻擊者可能使用泄漏的信息來繞過操作系統(tǒng)的保護機制,比如:ASLR、DEP 等等。
還有一類信息泄漏漏洞:UXSS,通用跨域漏洞。這種跨越域隔離策略的漏洞,可以在后臺偷偷地打開其它域的網頁,把你在其它網站上的數據偷走。
內存破壞漏洞又可以細分為釋放后重用漏洞(UAF),越界讀寫漏洞,類型混淆漏洞。越界讀寫漏洞比較神,他也能用來泄漏內存信息,所以越界讀寫漏洞非常好利用。
比如搜狗瀏覽器瀏覽網頁可下載任意文件到任意位置,重啟之后,電腦可能被完全控制。百度瀏覽器可靜默安裝插件,且存在目錄穿越漏洞。解壓縮到啟動目錄,重啟之后,電腦被完全控制。
想像一下:
打開一個網頁,完全控制你的電腦,APT攻擊;
打開一個網頁,完全控制你的手機,監(jiān)聽通話短信;
打開一個網頁,越獄你的游戲機,玩盜版游戲;
打開一個網頁,偷走你京東帳號、控制微博帳號…….
我們曾經抓到一個打 DDoS 的嫌疑人,他控制了200個肉雞,接單打 DDoS。這200個肉雞每天給他創(chuàng)造2000塊的收入,如果有一套組合的瀏覽器0day+一個大站 Webshell,一天上千的肉雞非常簡單,日入萬元不是夢,哈哈。。。
那怎么挖掘瀏覽器漏洞呢?
像Chrome 和 Webkit 這些是開源的,通過理解代碼邏輯來找 Bug。比如 marius.mlynski 讀 Chrome 代碼發(fā)現數十個 UXSS 漏洞,每個漏洞Google獎勵 7500 美元。
國產瀏覽器的漏洞大多是人工測試出來的,用自己的經驗,逆向分析,手工測試。
用機器代替人來自動化挖漏洞。
有一些開源的框架可以學習:Grinder、Fileja、funfzz等。我們來看一下一個Fuzz框架是怎樣實現的。
簡單地說就是控制瀏覽器去加載你生成的測試樣本,捕捉導致瀏覽器崩潰的樣本,傳回服務器作下一步分析。今天給大家分享一個最簡單的Fuzz框架,一行代碼,啟動調試器打開樣本生成器網頁:
windbg -c “!py chrome_dbg_test.py” -o “C:\Program Files\Google\Chrome\Application\chrome.exe --js-flags=”--expose-gc" --no-sandbox --disable-seccomp-sandbox --allow-file-access-from-files --force-renderer-accessibility http://127.0.0.1/fuzzer.php
解釋上面的命令:
使用windbg調試啟動chrome打開樣本生成器http://127.0.0.1/fuzzer.php
http://127.0.0.1/fuzzer.php生成測試樣本并切換樣本。
一個最簡單調試器,十幾行代碼,pydbg 是 windbg 的一個插件,使用它可以編程控制 windbg。
比如用這段代碼,監(jiān)控調試進程產生的調試事件:
while True:
exc = e(".lastevent")
print exc
if exc.find("Exit process") > 0:
os.system("taskkill /F /IM windbg.exe")
觀察windbg收到的調試事件,如果是退出進程事件,那么把windbg退出(同時chrome進程也退出了)。同理,如果windbg收到的調試事件是讀寫內存異常,那就是一個有效崩潰。
這時候你只需要執(zhí)行windbg命令r,k,把結果傳回服務器就完成了一個崩潰信息的收集了。
要想挖掘瀏覽器漏洞,推薦大家去分析以往瀏覽器的漏洞,收集一些POC,這樣能更好地理解瀏覽器漏洞形成的原因以及調試分析方法。來看一個典型IE漏洞的POC:
所以我們的目標是怎樣去生成有效的、復雜的、測試用例,讓瀏覽器崩潰。
我們需要去構建 fuzz 生成算法用的字典,通??梢詫懪老x到 MSDN、MDN、W3C 去抓取,還有可以用 IDA 分析 mshtml 找隱藏的屬性鍵值,還可以看瀏覽器源碼的頭文件。我們需要去構建全面的字典,去覆蓋瀏覽器的各個特性。
網上也有些自動構建字典的方法,可以參考
var elements = [“abbr”, “acronym”, “address”, “article”, “aside”, “b”……];
for (var i = 0; i < elements.length; i++) {
var element = document.createElement(elements[i]);
for (var key in element) {
if (typeof element[key] == "function") {
function_list.push(key);
}
}
構建出來的字典像這樣:
再來一個生成算法,用一個CSS生成算法來舉例,使用剛才收集回來的字典,隨機生成測試用的CSS。
好了,有了源材料和隨機生成方法,現在你可以生成測試樣本了。
然而還有一個大問題:
如果只是這樣隨機生成,跑一年有可能會出來一個有效的崩潰,這是個很可悲的事情。為什么????
一是因為測試的總樣本集非常大,比如一共有110個html標簽的類型,如果我們隨機創(chuàng)建10個,那就是110的10次方種可能,這是個超級大的數,大到你可能永遠都跑不完,二是前輩們可能10年前就跑過了,能發(fā)現的問題早就報告修復完了。
所以FUZZ的核心是樣本生成算法。
我們需要新的樣本生成策略,去發(fā)現別人發(fā)現不了的漏洞。曲博在 2014 BlackHat 分享了一個有意思的故事:
曲博他老婆的iPhone屏幕壞了,讓曲博修,他拆開后,裝上了新屏幕,差不多快好了,發(fā)現多了兩個螺絲,攝像頭不見了……
最終iPhone廢了
QU BO 得出來的啟示是:
工程師把東西拆開的時候容易犯錯誤,工程師把東西恢復的時候容易犯錯誤。
應用到fuzz這塊,有兩個策略,去做相反的事情,去改變初始的狀態(tài)。比如:
我們應用這種想法也找到了一些漏洞:
其中在 document.execCommand("undo"); 這塊我們至少收獲了5枚漏洞。但是也有不少撞洞的情況。
所以我們需要樣本生成策略,去發(fā)現別人發(fā)現不了的漏洞。
我們首先想的是把調用關系做得非常深,制造非常復雜的回調場景。比如以下這個POC,我們多次在事件響應函數中去觸發(fā)另一個事件響應函數,最終導致解析出錯:
看下這個崩潰的調用棧:
我們還可以去fuzz別人搞得少的方向。
CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 應該是一個瀏覽器控件,瀏覽器控件是有自己獨立的前進、后退功能的,如果與父頁面的前進后退功能混用,會導致問題。
我們整理了系統(tǒng)中所有clsid:
在OBJECT這塊我們至少也收獲了5個漏洞。
很少看見有人做fuzz的時候會隨機的用一些unicode字符串來測試,我們在這塊收獲了EDGE一個越界讀漏洞。
現在JS引擎的內存破壞漏洞越來越多了。我們在這塊也挖到不少漏洞,由于目前還都是 0day 的狀態(tài),所以不拿我們自己發(fā)現的 POC 舉例,拿一個 Google Project Zero 分開的 POC 給大家看看長什么樣:
現在很多人生成的fuzz樣本都是用JS生成的,但是對HTML的初始狀態(tài)關注并不多,比如我們在初始狀態(tài)時加了N個復雜的表格嵌套,也發(fā)現了不少的問題。
表格相關的各種元素都有特有方法,比如insertRow、moveRow、deleteRow,還有表單的特有的屬性和方法,如果跟CSS結合,那么渲染起來就更加復雜了,比如下面這個POC:
通過fuzz非常復雜的元素,我們至少收獲了10個漏洞。
去fuzz非常復雜的元素,還有CSS。CSS也有很多種操作方法,比如:
style,<div data-for="result" style="height:0;width:0;overflow:hidden;" id="swfsocketdiv">
obj.style.backgroundColor= "black";
.style1:hover{ background-color:#66B3FF; cursor:pointer;}
obj.style.cssText = "background-color:black; display:block;color:White;
obj.setAttribute("class", "style2");
<link href="css1.css" rel="stylesheet" type="text/css" id="css"/>
obj.setAttribute("href","css2.css");
document.styleSheets
CSS混合生成的方法,我們收獲了幾枚很好利用的類型混淆漏洞。
還有,可以去fuzz新的特性,Html5,SVG,WebGL,Chrome 原生支持的 PDF。
好了,POC分享完了,下面講一下怎么給產商報告漏洞。
注意的是,如果空指針的問題導致系統(tǒng)藍屏的,微軟也會收的。
注意Chrome有很多個版本,只有stable版本的才會有CVE。(Canary、Dev、Stable)
注意Chrome自己也有fuzz集群,如果你跟他撞洞,Sorry。。。
好了,我的分享就到這里了。以下是引用的一些參考資料,大家也可以學習一下。
雷鋒網宅客頻道讀者:在瀏覽器的漏洞挖掘里老師用的最多的工具是神馬。
黃正:
大部分都是自己寫代碼寫出來的,沒有特別的工具,比如為了方便我們調試,我會寫一個工具來自動配置啟動瀏覽器:
不知道是否回答了這位朋友的問題,其它的工具用的是 windbg,VS,python,php 等。都是用這些造出來的,沒有用現成的像 sqlmap, burpsuite 那樣的工具。
雷鋒網宅客頻道讀者:如何評價Pwn2Own2016中360安全衛(wèi)士11秒攻破chrome?
黃正:
其實11秒這個數字不重要,關鍵是攻破了,360牛人多、積累多,從上次他們的博客可以看出,手里有大把的0day,攻破chrome需要很多個漏洞組合,不止是瀏覽器漏洞,確實是能力超強啊。
雷鋒網宅客頻道讀者:深度學習與網絡安全(比如反APT,漏洞挖掘等)有沒有很好的結合點?
黃正:
這個百度已經有了一些嘗試了,百度手機衛(wèi)士移動端病毒檢測使用百度開源的機器學習平臺paddle對病毒樣本的特征進行深度學習,檢出率在國際權威排名中已經多次世界排名第一,感興趣的可以看一下blackhat Europe 2016王磊的議題。
另外,百度安全實驗室也在應用機器學習算法來做撞庫檢測、支付欺詐檢測,效果都很不錯,歡迎來交流。
雷鋒網宅客頻道讀者:八卦一下,黃正老師挖的第一個漏洞是什么?
黃正:
發(fā)現的第一個是釋放后重用漏洞,我可以詳細說一下我從安全工程怎樣革自己的命要搞漏洞的,并最終搞出來的。
成立安全實驗室后,我給自己定的KPI是半年內,要搞通瀏覽器漏洞分析方法,搭建瀏覽器 Fuzz,并且挖出一個瀏覽器漏洞。
壓力大啊,沒有人帶我,完全自己搞,每天都在不斷地學習,不停地嘗試修改生成算法,不斷地去網上爬資料找POC,3個月過去了,一個漏洞都沒發(fā)現,我想這下完了,年終獎要沒了。后來終于在使用 setTimeout 來改變 location 發(fā)現了第一個可以穩(wěn)定崩潰的 POC。并且是可利用完全沒有任何保護機制防護的,下一步就是去精簡樣本,當時很土,手工慢慢刪,最終受不了了寫了自動化精簡樣本的腳本,然后就提交了,完成了半年發(fā)現一個漏洞 KPI。
這是我的第一個漏洞:
雷鋒網:很多同學都想成為黃正老師一樣的漏洞挖掘大牛。對于這些同學,黃老師有什么干貨的建議嗎?
黃正:
別停留于想法,趕緊去做,哈哈,網上資料多得是??纯次掖蛴〉膶W習資料,這還只是一部分:
雷峰網原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。