浏览器就像一扇窗户,黑客可以通过它闯入电脑的心脏。
像恋爱高手一样,通过眼神融化一个人的心智。
百度安全实验室X-Team负责人黄征。2016年,这个低调的、相信“技术可以改变世界”的黑客大牛,独自利用无数浏览器漏洞,成就了微软MSRC2016年黑客贡献榜中国第一(全球第八)的壮举。
从安全开发工程师到安全研究员,黄征终于站在了中国浏览器漏洞挖掘的巅峰。本次硬公开课,我们将邀请黄征为边肖家政频道的读者童鞋奉上一份纯干货——如何以正确的姿势利用浏览器漏洞。
从几千万行代码中准确找到那个微小的瑕疵,就像站在千里之外,拉弓搭箭。击中靶心。
以下是边肖Homeguest频道(微信官方账号:Homeguest频道)诚意呈现的公开课全文及完整PPT。
关于我自己我是百度安全实验室的黄征。在百度参与过网页挂马检测、钓鱼欺诈检测、病毒木马分析、伪基站检测、泛站群攻击、漏洞挖掘、漏洞利用等工作。
百度从事恶意网页检测相关的开发工作,可以说是专业的“涉黄行家”。其实《黄色鉴赏家》是一个很有挑战性的任务。每天都要检测几亿/几十亿的网页。如何设计存储、调度和检测算法,使得在有限的服务器和带宽下,在有限的时间内完成检测,并保证检测率和误报率。
所以恶意网页检测是一个比较偏工程化的方向。我还是有一颗黑客的心,挑战一些新的安全技术方向。我想利用漏洞,所以前期组建安全实验室团队的时候加入了X-Team,从安全开发工程师转行做浏览器漏洞挖掘。今天和大家分享的话题是浏览器漏洞挖掘。希望你能有所收获。
今天给大家讲一些浏览器的基础知识,然后复习一下浏览器漏洞的类型,重点讲一下如何做一个Fuzz系统,分享一些我们发现的漏洞POC。最后,我分享一下如何向微软、谷歌、苹果举报安全漏洞。
浏览器基础知识首先,浏览器是干什么用的?众所周知,它是用来看网页的。再往下,它是用来把html代码按照一定的标准绘制成屏幕上肉眼可见的图像。
比如像这个html代码,浏览器会按照一定的标准把它变成肉眼可见的网页:
浏览器无处不在,比如Windows、MacOSX、iOS/iPad、Android、Playstation(PS4)、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级别1、DOM级别2、DOM级别3、DOM级别4...
浏览器是一个非常复杂的工程,不仅要支持不同时期的DOM标准,而且不同的浏览器为了让解析速度更快,让用户使用起来更方便,也在不断的添加新的功能。从13年的消息来看,Chrome浏览器的代码应该至少有1000万行。
代码越多,开发者越多,安全问题就会越多。然后,介绍一下浏览器的漏洞类型,以及我自己的分类方法,不一定合理。
浏览器漏洞类型第一类漏洞是信息泄漏漏洞,有以下几种场景:比如老的IE浏览器可以用JS检测是否存在某文件。这样会泄漏用户是否安装了杀毒软件,以便进行下一步 *** 作。有些信息泄漏漏洞会泄漏内存的信息,攻击者可能使用泄漏的信息来绕过 *** 作系统的保护机制,比如:ASLR、DEP等等。还有一类信息泄漏漏洞:UXSS,通用跨域漏洞。这种跨越域隔离策略的漏洞,可以在后台偷偷地打开其它域的网页,把你在其它网站上的数据偷走。第二类漏洞是内存破坏漏洞:内存损坏漏洞可细分为释放重用漏洞(UAF)、跨界读写漏洞和类型混淆漏洞。跨界读写漏洞相当巧妙,还可以用来泄露内存信息,所以跨界读写漏洞非常容易利用。
第三类漏洞,是国产浏览器的一些神漏洞,特权域XSS+特权域API:比如搜狗浏览器在浏览网页的时候可以下载任意文件到任意位置。重启后,电脑可能会被完全控制。百度浏览器可以静默安装插件,存在目录遍历漏洞。解压到启动目录,重启后电脑就完全被控制了。
利用这些浏览器漏洞可以做什么可怕的事情呢?想象一下:
打开网页,完全控制你的电脑,APT攻击;
打开网页,全面掌控手机,监控通话信息;
打开网页,越狱你的游戏机,玩盗版游戏;
打开网页,盗取你的JD.COM账号,控制你的微博账号...
我们曾经抓过一个玩DDoS的嫌疑人。他控制了200只肉鸡,单次服用DDoS。这200只肉鸡每天为他创收2000元。如果有一套组合浏览器0day+一个大站Webshell,一天上千只肉鸡就很简单了。日进万元不是梦,哈哈。。。
浏览器漏洞挖掘方法那么如何利用浏览器漏洞呢?
第一种方法,人工Chrome和Webkit是开源的,通过理解代码逻辑来发现bug。比如marius.mlynski在读取Chrome代码时发现了几十个UXSS漏洞,谷歌每发现一个漏洞就奖励7500美元。
国内浏览器的漏洞大部分都是人工测试,用自己的经验,逆向分析,人工测试。
第二种方法,自动化Fuzz用机器代替人自动挖洞。
有一些开源框架可以借鉴:Grinder,Fileja,funfzz等。让我们来看看Fuzz框架是如何实现的。
简单来说,就是控制浏览器加载你生成的测试样本,捕获导致浏览器崩溃的样本,并发送回服务器做进一步分析。今天给大家分享一个最简单的Fuzz框架,一行代码,启动调试器打开样本生成器的网页:
windbg-c”!pychrome_dbg_test.py"-o"C:ProgramFilesGoogleChromeApplicationchrome.exe-js-flags="-expose-GC"-no-sandbox-disable-seccomp-sandbox-allow-file-access-from-files-force-renderer-accessibilityhttp://127.0.0.1/fuzzer.PHP
解释上面的命令:
使用windbg调试启动chrome并打开示例生成器http:/http://127.0.0.1/fuzzer.PHP
Http://127.0.0.1/fuzzer.php生成测试样本和切换样本。
一个最简单的调试器,十几行代码,pydbg是windbg的插件,可以用来编程控制windbg。
例如,使用以下代码监视调试过程生成的调试事件:
虽然正确:
exc=e("。最后一次事件”)
打印exc
ifexc.find("退出进程")>0:
OS.system("taskkill/F/IMwindbg.exe")
观察windbg收到的调试事件,如果是退出进程事件,则退出windbg(chrome进程也退出)。同样,如果windbg接收到的调试事件是读写内存异常,则是有效崩溃。
这时候你只需要执行windbg命令r,k,并将结果发送回服务器,就完成了崩溃信息的收集。
要挖掘浏览器漏洞,建议大家分析一下以前浏览器的漏洞,收集一些POC,这样可以更好的了解浏览器漏洞的成因,调试分析方法。看看一个典型IE漏洞的POC:
所以我们的目标是如何生成有效的、复杂的和测试用例,并使浏览器崩溃。
我们需要为模糊生成算法建立一个字典。通常,我们可以向MSDN、MDN和W3C编写爬虫来检索它们。除此之外,我们还可以用IDA来分析mshtml,找到隐藏的属性键值,还可以看看浏览器源代码的头文件。我们需要建立一个全面的字典来涵盖浏览器的所有功能。
网上也有一些自动建字典的方法,可以参考一下。
varelements=["abbr","acronym","address","article","side","b"……];
for(varI=0;我
varelement=document.createelement(elements[I]);
for(元素中的变量键){
if(typeofelement[key]=="function"){
function_list.push(key);
}
}
构建的字典看起来是这样的:
再来一个生成算法。以一个CSS生成算法为例。用刚收集的字典随机生成CSS进行测试。
好了,有了源材料和随机生成方法,现在你可以生成测试样本了。
然而,有一个大问题:
如果只是随机生成,运行一年可能会导致有效崩溃,这是一件很可悲的事情。为什么????
首先,测试的总样本集非常大。例如,有110种html标签。如果我们随机创建10,它将是110的10次方。这是一个超级大的数字,大到你可能永远也数不完。第二,前辈可能10年前就运行过了,能发现的问题早就上报修复了。
所以FUZZ的核心是样本生成算法。
我们需要一种新的样本生成策略来发现别人找不到的漏洞。2014年,曲博的BlackHat分享了一个有趣的故事:
曲博的妻子的iPhone屏幕坏了,所以曲波修理了它。他把它拆开后,安装了一个新的屏幕,这几乎是现成的。他发现又多了两个螺丝,相机也不见了...
最终iPhone报废了。
曲波的启示是:
工程师在拆东西的时候容易出错,工程师在还原东西的时候也容易出错。
应用于fuzz,有两种策略,反其道而行之,改变初始状态。例如:
我们在应用这个想法时也发现了一些漏洞:
其中document.execcommand("undo");我们在这一块至少钻了五个洞。然而,也有许多洞碰撞的情况。
所以我们需要一个样本生成策略来发现别人找不到的漏洞。
我们要做的第一件事就是把通话关系做得非常深,创造一个非常复杂的回拨场景。例如,在下面的POC中,我们在事件响应函数中重复触发另一个事件响应函数,最终导致解析错误:
看看这个崩溃的调用堆栈:
我们也可以去别人做得少的fuzz。
Fuzz别人搞得少的方向,第一个是 OBJECT。CLSID:8856f961-340a-11d0-A96b-00c04FD705a2应该是一个浏览器控件,有自己独立的前进后退功能。如果和父页面的前进后退功能混在一起,就会出问题。
我们整理了系统中的所有clsid:
我们还在对象块中获得了至少五个漏洞。
Fuzz别人搞得少的方向,第二个是unicode。很少看到有人在做fuzz的时候随机测试一些unicode字符串。我们在EDGE中获得了一个越界阅读的漏洞。
Fuzz别人搞得少的方向,第三种是正则表达式。fuzz别人搞得少的方向,第四种是JS解析引擎。现在JS引擎的内存崩溃漏洞越来越多。我们也在这一块挖了很多洞。由于目前仍处于0day状态,所以不拿我们自己发现的POC举例,我们将向您展示一个来自GoogleProjectZero的独立POC是什么样子的:
Fuzz别人搞得少的方向,第五种是混合生成。现在很多人用JS生成fuzz样本,但是并不太关注HTML的初始状态。比如我们在初始状态增加了N个复杂的表格嵌套,发现了很多问题。
去fuzz非常复杂的元素,比如表格、表单、Frame。表单的各种相关元素都有唯一的方法,如insertRow、moveRow、deleteRow,以及表单的唯一属性和方法。如果和CSS结合,渲染起来会更复杂,比如下面这个POC:
通过非常复杂的fuzz元素,我们已经获得了至少10个漏洞。
去fuzz的非常复杂的元素,还有CSS。CSS的 *** 作方式也有很多种,比如:
style,obj.style.backgroundcolor="black";
.style1:hover{background-color:#66B3ff;光标:指针;}
obj.style.CSStext="background-color:black;显示:块;颜色:白色;
obj.setAttribute("class","style2");
obj.setAttribute("href","css2.css");document.styleSheetsCSS混合生成的方法,我们收获了几枚很好利用的类型混淆漏洞。还有,你可以去fuzz的新功能,Chrome原生支持的Html5,SVG,WebGL,pdf。如何提交漏洞?POC分享完了,再来说说如何向厂商报告漏洞。如何向微软提交漏洞
注意,如果空指针的问题导致系统蓝屏,微软也会接受。如何向谷歌提交漏洞
注意,Chrome有很多版本,只有稳定版才会有CVE。(Canary,Dev,Stable)注意Chrome有自己的fuzz集群。如果你和他撞到一个洞里,对不起。。。如何向苹果提交漏洞
好了,我的分享到此为止。以下是一些引用的参考资料,你也可以借鉴一下。
问与答。边肖()家乡频道读者:老师在浏览器漏洞挖掘中最常用的工具是什么?黄征:大部分都是我自己写的代码,没有专门的工具。例如,为了方便我们的调试,我将编写一个工具来自动配置启动浏览器:
不知道有没有回答这位朋友的问题。其他工具有windbg、VS、python、php等。都是用这些做的,但是没有现成的工具像sqlmap,burpsuite。边肖家政频道读者:如何评价Pwn2Own2016中360安全卫士11秒破chrome?黄征:实际上,11秒这个数字并不重要。关键是要打破它。360人众多,积累很多。从他们上一篇博客可以看出,他们手里有很多0day。破解chrome需要大量的漏洞组合,不仅仅是浏览器漏洞,还需要超强的能力。边肖嘉宾频道读者:深度学习和网络安全有没有很好的结合(比如反APT,漏洞挖掘等)?黄征:这个百度已经做了一些尝试。百度手机卫士手机病毒检测利用百度开源机器学习平台paddle,深度研究病毒样本特征,检出率在国际权威排名中多次位居全球第一。如果你有兴趣,请看看黑帽欧洲2016王乐妍的话题。此外,百度安全实验室也在应用机器学习算法检测数据库碰撞和支付欺诈,效果非常好。欢迎交流。边肖家政频道读者:八卦,黄征老师挖的第一个漏洞是什么?黄征:我发现的第一个漏洞是发布后重用漏洞。我可以详细告诉你我是怎么从安全工程改命做漏洞,最后弄出来的。安全实验室成立后,我给自己定下的KPI是,半年内,要把浏览器漏洞分析方法弄通,把浏览器Fuzz建立起来,挖出一个浏览器漏洞。压力很大。没人带我,我就全靠自己了。每天坚持学习,努力修改生成算法,上网搜索POC。三个月后,我没有发现任何漏洞。我觉得完了,年终奖也没了。终于找到了第一个使用setTimeout改变位置就能稳定崩溃的POC。而且根本没有保护机制可以保护。下一步是简化样本。那时候很土,用手慢慢删。最后,我受不了自动精简样本的脚本,然后提交。半年后,我发现了一个漏洞KPI。这是我的第一个漏洞:
边肖:许多学生想成为像黄征一样的大牛。黄老师对这些同学有什么干货建议吗?黄征:不要停止思考,快点做。哈哈,网上信息多的是。看看我打印的学习资料。这只是一部分:
注:阅读相关建站技巧请移至建站教程频道。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)