赌城白帽演讲记
为期一周多的拉斯维加斯之行结束了,这也是今年第三次踏上美帝。在Blackhat Defcon各讲了一个议题,也算是解锁了两项人生成就。现在在回国的飞机上,记录下这次难忘的赌城之行,分享下学习到的技术前沿知识和趋势,紧张刺激的CTF比赛,以及打枪经历 :P
这一篇先分享下Blackhat前半段的经历,着眼于综述,并简单介绍下我们的议题,和几个我觉得不错的议题。该文也同步发表在微信公众号:
Flanker的二进制天空
欢迎关注!
缘起
Blackhat USA作为全球顶尖的安全技术会议,是全球安全圈每一位研究者都梦想登上的舞台,也是全球安全界的盛大集会。Blackhat还没开始前邮箱里已经有五六个Party/Meetup的邀请了,包括来自于Google, Microsoft, Qualcomm, Facebook和BASec这样的华人大拿聚会。这几年来出现在Blackhat舞台上的华人也是越来越多,包括北美许多学术圈的研究人员,以及BAT3基本每年都有议题(Briefings)中选,例如我们熟知的盘古团队,TK教主,Lenx等。我们也是Blackhat的常客:D 像一些新兴公司也凭借开源的新颖或者实用的先进工具入选过兵器库(Arsenal),例如长亭科技(Blackhat USA),盘古,知道创宇(Blackhat Asia)。去年KeenLab的许文凭借PingpongRoot雀屏中选50分钟Session,成为亚洲最年轻的Blackhat USA演讲者。
那好奇的读者可能要问了,那究竟谁是全球最年轻的演讲者呢?这个其实并不可考,但江湖传言是现在在Tesla安全团队工作的一个小伙子,18岁就中选了Blackhat USA。我们今年Pwn2Own成功完成两次攻破MacOS后,也希望继2014年Blackhat EU (Liang Chen), 2015年Blackhat USA(Wen Xu), 2016年Blackhat Asia(Flanker,也就是作者)之后继续向全世界分享我们的研究成果。
BlackHat上有哪些东西?
Blackhat按日程分为三个部分:最早开始的是training。这一般是业界大佬来作为讲师,对某个方向做手把手的深入指导。当然学费也相当不菲,几千刀小意思,其中有很大一部分是作为了Blackhat主办方的分成。当然现在随着各大公司对信息安全的重视程度提高,很多人也以公费留学的形式来参加培训,这次来我也看到了很多3BATH的人员公费派来学习,挂着Training牌子。早些年信息安全还没这么火的时候,现在业界一些顶级大牛曾经不远万里自费来training学习,这种动力或许也是他们如今能站在技术之巅的原因。
Training之后就是万众瞩目的Briefings了。Arsenal也和Briefings同时进行,同时在Business Area还有各大安全厂商的现场宣讲活动(无论是招人还是给产品做广告。相对来讲招人的会比较含蓄,卖产品的则五花八门招数应有尽有)。 Briefings分为25分钟和50分钟,还有100分钟的Workshop。其中25分钟今年开始提供机票但不提供住宿,50分钟则是全包,讲师费也多一倍。50分钟的Topic一般投的人会更多些,也相对更难中选,毕竟主办方要出更多的钱,而25分钟slot比较多,也相对好中一些。像国内的盘古团队是年年都中50分钟,非常厉害。今年投稿人数再创新高,根据官方消息中选率约在1/7,总共700多篇投稿选中了100多篇。
Briefings一旦中选则会给所有的Speaker提供门票,所以往年也有一个Session下面挂了七八个演讲者的情况。Blackhat虽然不赞许这种做法但是最后也容忍了。 主办方会根据Topic的热门程度决定演讲的房间大小。最大最炫酷的当然是Keynote所在的地方,也就是Jeff Moss(Blackhat创始人)开场让大家high起来的地方,可以坐下几千人也就这一个房间有跟踪拍摄实时投影,简直不能更帅。
其他房间就有大小之分了,从200人小房间到2000人房间都有。不过今年有个问题是时间从三天缩短到了两天,导致人员流动性增加,很多场次会出现在一半的时间进来了一群人或者出去了一群人去别的地方听的情况。在每个会议室的入口会有工作人员NFC扫描入场的牌子,在Session结束后会发放调查问卷到对应的邮箱,这意味着演讲质量的好坏也会决定下一年入选的难易程度:)
紧张的CFP
我觉得Blackhat主办方UBM绝对是深谙人类心理学的专家。在选中的议题公布之前,票价是最便宜的。然后陆陆续续公布一批,好,有你感兴趣的议题了?不好意思,票价已经涨了。这样来个几轮,屡试不爽。不仅投稿的人煎熬,买票的人也纠结。
我们在4月份提交了50分钟Topic的CFP,也就是后来中选的https://www.blackhat.com/us-16/briefings.html#subverting-apple-graphics-practical-approaches-to-remotely-gaining-root. 前几轮筛选中始终杳无音信,即没有拒信也没有Accept,让人比较慌张。还好在倒数第二轮Offer中终于出现了我们的名字,excited!现在想想这可能也是UBM的营销策略之一,一些关注度比较高的会被放到后面以增加悬念,卖出更多高价票。
8.1-8.2准备
1号晚上我们到达LAS后入关提取行李再转机,飞到Vegas。入关的时候有个小插曲,Officer看着我递过来的Blackhat网站上打印的Speaker Info,在那里念:"hmm, pwn2own champion team?" 我心里一紧,难道这是要把我关小黑屋的节奏。还好他只是笑了笑,把材料还给我说到good job,就放我入关了,也是虚惊一场。
2号上午进行了一次PPT排练,然后在会场提前注册,speaker多给了一个小包,里面有个小的章和一件外套,另外帮人代购了十来件Blackhat的衣服小物品,后面又有朋友找我我表示行李箱就这么大,已经带不动了。。。下午参加了Lenx和Xiaoning等大佬组织的BASec北美华人聚会,会场上再次分享了这个议题,也算是又熟悉了一次。晚上在会场吃了小龙虾,感觉不错 :D
注册完的资料里有一个通知。。想必大家早就知道了
8.3登台
3号早上我们吃完饭后直奔Speaker Room,里面已经是人满为患,看得出大家对上台还都是非常重视的。
和老朋友们聊了几句之后(Blackhat的现场工作人员例如编辑基本就是那几个人,每年三场分会到处飞来飞去)我们正式登台。这次议题我们分享了今年Pwn2Own我们发现的苹果图形渲染系统里的两个漏洞,通过这两个漏洞再结合两个Safari的漏洞我们成功两次攻破了MacBook。
苹果的图形系统事实上分为两部分,用户态的有WindowServer作为大内总管,在早些年的OSX中,所有的GUI相关操作必须通过WindowServer进行转发。后来出于性能考虑,苹果在内核中对普通应用开放了图形相关的操作接口,进而增加了一个巨大的攻击面。
WindowServer对沙箱内的进程访问有严格的限制,基本上CoreGraphics所有的接口都被苹果审计过加了限制。但是百密一疏,在某个不起眼的地方有一个二级接口QuartzCore被暴露了出来,通过IPC渠道沙箱内进程可以拿到苹果沙箱Policy所允许的服务之外的新服务。我们在反编译逆向二进制文件的过程中,发现其中一个接口程序员手滑调用了两次CFRelease,类似于
if(blabla){xxx; CFRelease(obj);} CFRelease(obj);
进而发现了CVE-2016-1804. 这是一种非常经典的double free漏洞。一般来讲我们要么利用堆管理器的特性实现double free到代码执行(OSX zone allocator会把free掉的内存头部指向freelist上一个地址,如果有vtable调用可以直接转化为代码执行),要么将double free漏洞在间隔时间中填入对象转换为UAF漏洞,后面这个做法更常用一些。严格来讲这个漏洞并不算很好的一个double free,因为两次free的间隔太短,很难在这个时间段内成功填入内存。而对于常见的堆管理器来讲,如果你没有成功填入内存,对一个地址的两次free会导致堆管理器抛出异常终止进程。
然而CFRelease恰好不是一个常见的free函数,对一块free的内存多次调用CFRelease并不会导致崩溃。再结合QuartzCore提供的接口和特性,我们能够实现稳定的内存布局,进而代码执行。具体细节我就不在这里赘述了,有兴趣的读者请参考陈少的两篇博客:http://keenlab.tencent.com/en/2016/07/22/WindowServer-The-privilege-chameleon-on-macOS-Part-1/http://keenlab.tencent.com/en/2016/07/28/WindowServer-The-privilege-chameleon-on-macOS-Part-2/
那么有了windowserver权限又如何?好像权限很低嘛?其实WindowServer本身是一个很有意思的变色龙,虽然在正常情况下它以_windowserver的euid存在,但是它的uid却始终是0.这是因为它作为一个单例进程,还担负着fork出对应用户session进程(loginwindow)的职责。这意味着从设计上来说它需要能够变幻到不同的uid,这也是为什么我们为之取名为变色龙的缘故。所以拿到_windowserver权限后,我们再通过setuid(0),就实现了到root的权限提升
那么我们内核态的漏洞又是什么样子的呢?实际上是一个同样有意思的漏洞。
在典型图形渲染的pipeline中,光栅化是一个很关键的步骤。光栅化中又有一个核心操作blit,在OSX中它负责处理各种用户态传来的大小和位置的矩形surface,根据用户态的要求进行缩放后以浮点数形式归一化,以便交给GPU绘制到物理屏幕上。
这个过程的算法说复杂也算复杂(IDA逆向出的源代码一坨翔。。):
说简单,也不简单
前面提到最开始只有WindowServer这个大内总管能访问这部分显卡驱动里的代码,那自从这部分代码开放给用户态之后,用户态进程可没有WindowServer这么老实。我们发现如果在特定的前置选项条件下给它传递一个畸形的矩形,宽度高度是负数而坐标有非常大的时候,这部分代码的index发生了计算错误,出现了一个out-of-bound access(OOB)漏洞。
然而想让这么一个OOB漏洞变成一个代码执行+kASLR bypass的完整利用,还有很长的路要走。首先我们要通过堆风水让内存处在稳定可控的状态下,实现从OOB到write-anywhere的第一步转换。然而这并不是一个write-anywhere-anything的漏洞,而只是一个write-anywhere-float-restricted的漏洞。
浮点数并不是一个好相处的家伙,-1.0在IEEE.754 float下内存表达是0xbf800000,跟int表达形式相去甚远。我们需要在和这个浮点数相关的内存地址精确布置内容,以达到一次oob write就能改写程序控制流并泄漏内存信息的目的。这个过程有多复杂呢?大概要让内存达到下图这个状态 :P
具体细节我就不在这里赘述了,有兴趣的同学请参考我的博文:http://keenlab.tencent.com/en/2016/07/29/The-Journey-of-a-complete-OSX-privilege-escalation-with-a-single-vulnerability-Part-1/
最终大家上台的时候还是稍微有点紧张的,但是过了一会就正常了,毕竟都排练过这么多次,烂熟于心已经,中间还见缝插针开了几个玩笑,台下也是一片掌声。
几个听下来还不错的议题(1)
讲完之后感觉身体被掏空,直接就去吃饭了,陈少被留在现场回答台下群众的各种问题。午饭需要餐券,提供的其实也不好吃,但是鉴于太饿也无所谓了。接下来关注了几个比较有意思的议题,这篇主要讲下第一天的。下面的截图均来自原作者:
Shell on earth
这个议题来自于我们的老朋友ZDI,介绍了今年pwn2own比赛中各个队伍使用的浏览器漏洞+沙箱逃逸/内核漏洞的POC,exploit方法和patch。
其中Safari总共涉及到了3个UAF漏洞,lokihart使用了fontd中的堆溢出+环境变量注入实现沙箱逃逸,然后使用SubmitDiagInfo导出的XPC服务中任意路径写的漏洞,写入/var/db/sudo/{username}/路径。因为sudo会检查这个路径的修改时间,如果在一定时间范围之内sudo就不会再需要密码,从而实现普通进程再到root的提权。
Flash涉及到...hmm,4个漏洞,包括一个栈上的oob,一个Type confusion,2个UAF。Edge分别由lokihart和我们各打了一个,loki使用的一个栈上未初始化变量漏洞,另外一个则是长度重定义的漏洞。两个POC都很简洁,而且双方不约而同地使用了setjmp来泄漏栈地址,并通过修改栈上存储的返回地址来bypass CFG。
Windows内核也是漏洞重灾区,这里就不再详述了。总体来讲ZDI这篇报告还是很良心的,把各家手里的干货都讲了,有人表示下半年投会都没得投了。。
下图是lokihart的Edge POC,是不是非常简洁?
Breaking-Kernel-Address-Space-Layout-Randomization-KASLR-With-Intel-TSX
这篇报告来自学术界,主要是对之前的一个泄漏kASLR的办法提出了重大改进。
由于我们知道,在主流操作系统中,出于性能的考虑,内核态和用户态是共享TLB和page table的。这意味着我们在用户态是可以通过访问特定的kernel空间地址,通过观察cpu cycle的不同,来探测kernel的地址分布。主要原理简单来讲是如果我们访问一个不存在的地址,那么它不可能进入TLB cache中,kernel需要一级一级查看页表,随后返回错误。但如果访问一个存在的但用户态无权限访问的地址,事实上在第二次访问的过程中地址会进入TLB cache,kernel只需查看cache中的权限位即可判断并返回错误,这个情况明显比第一种情况需要更少的cpu cycle来处理,少到可以在用户态通过高精度timer观察到。
但之前的研究使用捕获异常的方法进行探测,反而引入了OS中异常处理的额外开销。本议题的精华就在于提出了使用TSX这个Intel CPU提供的轻量级异常处理指令的办法,消灭了额外开销,使得精确探测这个边信道差别成了可能的事情。从Paper来看,这是可以实现在完全可以接受的时间粒度之内(<1s)内探测出精确的kASLR值,具有工业级别的实战意义。
下图图片来自于原文。
THE LINUX KERNEL HIDDEN INSIDE WINDOWS 10
在多年之后POSIX又回归了windows,所谓的WSL其实是Project Astoria的遗产,微软放弃了port Android的努力,而是改成了桌面环境下的ubuntu模拟。以Pico process作为用户态的容器,LXSS.SYS / LXCORE.SYS作为kernel态,微软自己实现了这个700KB的subsystem。毫无疑问这里面会出现有趣的漏洞... 更详细的内容请参照ionescu的repo: https://github.com/ionescu007/lxss
说句题外话,ionescu是真正的大佬级别,RECon, blackhat常客,今年blackhat第一批宣布的session有且只有他的。。。有幸在REcon有一张合影:
Adaptive-Kernel-Live-Patching-An-Open-Collaborative-Effort-To-Ameliorate-Android-N-Day-Root-Exploits
来自百度Xlab Lenx和yulong的议题,针对目前Andrioid版本过于碎片化、补丁应用不及时,Nday依然具有威胁的现状,提出了一种基于lua脚本语言的patch framework,通过kmod/kmem device对相应的有漏洞函数进行pointer overwrite/inline hook,对非法参数进行过滤,避免exploit再次发生。不过这个方案理论上还是需要有vendor的支持,效果会更好些。
Xenpwn-Breaking-Paravirtualized-Devices
这个议题其实在某种程度上就是Trend的代表。随着计算资源的提高和并行计算的发展,云计算、虚拟化越来越成为关注点。那么云计算虚拟化本身的安全,包括平台和资源的安全,以及虚拟化又能如何用来辅助漏洞挖掘本身,也越来越成为热门的话题。
计算资源的提升直观表现在挖洞上面就是我们能做之前不能或者效果不好的事情了。我们能够容忍通过例如AFL和ASAN插桩instrument在fuzzing带来的overhead,而拥抱它对于code coverage和fuzz效率的巨大提升。qemu和xen这样的虚拟化或者supervisor的更广泛使用让我们能够对被测试程序的内存/指令有更精确的掌控,从而能够发现更细粒度的漏洞。
这个议题虽然大部分集中在Xen平台本身的特性,但通过Xen on Xen,拦截并记录共享内存中一个地址被host端访问多次这样的double fetch行为,分析trace判断其中是否存在Time to use after time to check漏洞,是一种比较新颖的办法。
这些大概就是Blackhat第一天我所关注的topic内容简介。下一篇文章将介绍第二天部分topic的技术内容,同时也分享下晚上Android Security Dinner沙龙和Qualcomm沙龙的见闻。微软的沙龙由于距离比较远,就直接去高通的沙龙了。