白帽賭城演講記:Trend, Tech, Team,還有打槍 (Blackhat篇 - 1)
為期一周多的拉斯維加斯之行結束了,這也是今年第三次踏上美帝。在Blackhat Defcon各講了一個議題,也算是解鎖了兩項人生成就。現在在回國的飛機上,記錄下這次難忘的賭城之行,分享下學習到的技術前沿知識和趨勢,緊張刺激的CTF比賽,以及打槍經歷
這一篇先分享下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號晚上我們到達LAX後入關提取行李再轉機,飛到Vegas。入關的時候有個小插曲,Officer看著我遞過來的Blackhat網站上列印的Speaker Info,在那裡念:"hmm, pwn2own champion team?" 我心裡一緊,難道這是要把我關小黑屋的節奏。還好他只是笑了笑,把材料還給我說到good job,就放我入關了,也是虛驚一場。
2號上午進行了一次PPT排練,然後在會場提前註冊,speaker多給了一個小包,裡面有個小的章和一件外套,另外幫人代購了十來件Blackhat的衣服小物品,後面又有朋友找我我表示行李箱就這麼大,已經帶不動了。。。下午參加了Lenx和Xiaoning等大佬組織的BASec北美華人聚會,會場上再次分享了這個議題,也算是又熟悉了一次。晚上在會場吃了小龍蝦,感覺不錯
註冊完的資料里有一個通知。。想必大家早就知道了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就能改寫程序控制流並泄漏內存信息的目的。這個過程有多複雜呢?大概要讓內存達到下圖這個狀態
具體細節我就不在這裡贅述了,有興趣的同學請參考我的博文: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值,具有工業級別的實戰意義。
下圖圖片來自於原文。
在多年之後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沙龍的見聞。微軟的沙龍由於距離比較遠,就直接去高通的沙龍了。
推薦閱讀: