虛假的 RCE vs 真實(shí)的 RCE
前言
前兩天看 HackerNews 的時(shí)候發(fā)現(xiàn)一條新聞:

而這個(gè)漏洞的出處更加勁爆,原標(biāo)題直接就是: SSD Advisory – macOS Finder RCE[1]。嚇得我趕緊點(diǎn)進(jìn)去看看,發(fā)現(xiàn)漏洞原因竟然很簡(jiǎn)單: 在 macOS 中,點(diǎn)擊 .netloc 后綴的文件可以執(zhí)行指定命令。
netloc
netloc 文件本身是一個(gè)快捷方式文件,從瀏覽器中點(diǎn)擊網(wǎng)址拖拽到桌面或者 Finder 文件夾中就可以自動(dòng)生成這么一個(gè)文件,通常文件內(nèi)容是:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>URL</key><string>https://evilpan.com/</string></dict></plist>
點(diǎn)擊該文件后會(huì)直接使用默認(rèn)瀏覽器打開(kāi) URL 指定的網(wǎng)址。而上文中的 PoC,則是將網(wǎng)址改為file://地址,比如:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>URL</key><string>FiLe:///System/Applications/Calculator.app</string></dict></plist>
這樣點(diǎn)擊該 .netloc 文件就會(huì)打開(kāi)計(jì)算器。蘋(píng)果對(duì)于 netloc 的 URL 過(guò)濾了 file:// 協(xié)議,但是僅對(duì)字符串進(jìn)行了過(guò)濾,因此上面將 file 改成 FiLe 就可以簡(jiǎn)單繞過(guò)了。
另一個(gè) ”RCE“
如果這個(gè)也叫做 RCE,那我也來(lái)分享一個(gè) RCE,將下面的文件保存成 poc.fileloc:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>URL</key><string>file:///System/Applications/Calculator.app</string></dict></plist>
甚至都不需要大小寫(xiě)繞過(guò) file 的協(xié)議,直接雙擊打開(kāi):

當(dāng)然,效果和上面的“漏洞”一樣,只能打開(kāi)任意本地程序,不能指定參數(shù),所以從實(shí)際上來(lái)說(shuō),并沒(méi)有什么卵用。除了 .fileloc 后綴,.url 后綴也有同樣效果。
Quarantine
那么,為什么這么一個(gè) Feature,會(huì)被上面的安全研究員說(shuō)成是 RCE 呢?個(gè)人猜測(cè)除了 PR/KPI 的壓力,還有一個(gè)重要原因是在 MacOS 中下載的可執(zhí)行文件通常有更加嚴(yán)格的安全校驗(yàn),即 Quarantine/Gatekeeper。
如果可執(zhí)行文件包含com.apple.quarantine屬性,那么在運(yùn)行前會(huì)進(jìn)行一系列檢查:
1.Gatekeeper 校驗(yàn)?zāi)繕?biāo)的簽名 (codesign)2.Gatekeeper notarization check3.Gatekeeper 惡意代碼掃描4.Quarantine 提示用戶該應(yīng)用通過(guò)互聯(lián)網(wǎng)下載,是否要執(zhí)行
看到前面的 RCE,有人應(yīng)該就問(wèn)了,何必要這種奇怪的后綴,直接保存成可執(zhí)行文件不是更方便?可惜,這種常見(jiàn)的可執(zhí)行文件 (.app,machO 等) 在下載后都會(huì)被加上 Quarantine 屬性,用戶點(diǎn)擊會(huì)彈出二次確認(rèn)警告,因此實(shí)用價(jià)值就大打折扣了。
雖然可執(zhí)行文件不能點(diǎn)擊運(yùn)行,腳本應(yīng)該可以吧?可惜實(shí)際上點(diǎn)擊 .sh/.bash/.applescript 等文件默認(rèn)是用 XCode 打開(kāi)的。不過(guò),還有一個(gè)特殊的文件格式可以直接點(diǎn)擊運(yùn)行,而且不需要加chmod +x權(quán)限,它就是 .terminal 文件。
一個(gè)簡(jiǎn)單的 PoC 示例如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CommandString</key><string>echo "Hello"</string><key>ProfileCurrentVersion</key><string>2.06000000001</string><key>RunCommandAsShell</key><false/><key>name</key><string>poc</string><key>type</key><string>Window Settings</string></dict></plist>
直接保存成 poc.terminal ,點(diǎn)擊即可運(yùn)行任意命令,而且不止可以彈計(jì)算器,還可以控制任意執(zhí)行命令的參數(shù)。當(dāng)然,蘋(píng)果也有意識(shí)到這個(gè)問(wèn)題,所以從瀏覽器下載的 .terminal 文件也是會(huì)被加上 Quarantine 屬性的。
但是相比于.app等可執(zhí)行文件,.terminal 文件有一個(gè)獨(dú)特的優(yōu)勢(shì): 因?yàn)樵撐募?plist 格式,因此沒(méi)有 codesign 簽名檢查,所以一旦我們可以繞過(guò) Quarantine 檢查,就可以實(shí)現(xiàn)真正的 RCE。
真 · macOS RCE
網(wǎng)上下載的可執(zhí)行文件會(huì)被加上 Quarantine 屬性,這句話中我們可以提出一個(gè)問(wèn)題: 這個(gè)屬性是誰(shuí)加的?答案很簡(jiǎn)單: 瀏覽器。也很容易驗(yàn)證,因?yàn)樵诿钚兄惺褂?wget/curl 下載的可執(zhí)行文件是沒(méi)有 Quarantine 屬性的。
既然如此,我們可以再提一個(gè)問(wèn)題,如果是在 APP 中下載呢?比如 Telegram、WhatsApp、PC 微信、QQ、釘釘?shù)鹊?。所以一個(gè)新的攻擊面呼之欲出: 我們可以對(duì)于一些可以從 APP 內(nèi)下載并打開(kāi)文件的行為中構(gòu)造一個(gè) RCE,比如以 WhatsApp 為例(已經(jīng)修復(fù)):

大部分桌面應(yīng)用的開(kāi)發(fā)者都不會(huì)注意這種安全特性,因此很容易在需要的目標(biāo)中構(gòu)造這種釣魚(yú)場(chǎng)景。對(duì)于一些帶有自動(dòng)下載文件功能的 APP(比如 Telegram),甚至可以做到一鍵 RCE。
當(dāng)然,Telegram 也已經(jīng)修復(fù)了該漏洞 :)
總結(jié)
本文介紹了最近討論比較多的一個(gè) RCE,并介紹了一個(gè)類(lèi)似的 macOS RCE(fileloc 后綴執(zhí)行文件),這其實(shí)是個(gè)陳年老問(wèn)題了,編號(hào)為 CVE-2009-2811,蘋(píng)果一直也懶得修,畢竟只能彈計(jì)算器裝逼,執(zhí)行不了什么有意義的代碼,所以我更愿意稱之為 Feature。在此基礎(chǔ)上介紹一種在桌面應(yīng)用中使用 .terminal 后綴繞過(guò) Quarantine 和 Gatekeeper 實(shí)現(xiàn)真正 RCE 的例子。
希望各國(guó)安全研究員還是要多珍惜自己的羽毛,少在安全會(huì)議上灌水和發(fā)布些虛假的 RCE 預(yù)警吧。Peace。
參考資料
Quarantine nights - Exploring File Quarantine handling in macOS Apps / @Metnёw[2]
引用鏈接
[1] SSD Advisory – macOS Finder RCE: https://ssd-disclosure.com/ssd-advisory-macos-finder-rce/[2] Quarantine nights - Exploring File Quarantine handling in macOS Apps / @Metnёw: https://objectivebythesea.com/v3/talks/OBTS_v3_vMetnew.pdf
