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