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

而這個漏洞的出處更加勁爆,原標(biāo)題直接就是: SSD Advisory – macOS Finder RCE[1]。嚇得我趕緊點進去看看,發(fā)現(xiàn)漏洞原因竟然很簡單: 在 macOS 中,點擊 .netloc 后綴的文件可以執(zhí)行指定命令。
netloc
netloc 文件本身是一個快捷方式文件,從瀏覽器中點擊網(wǎng)址拖拽到桌面或者 Finder 文件夾中就可以自動生成這么一個文件,通常文件內(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>
點擊該文件后會直接使用默認瀏覽器打開 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>
這樣點擊該 .netloc 文件就會打開計算器。蘋果對于 netloc 的 URL 過濾了 file:// 協(xié)議,但是僅對字符串進行了過濾,因此上面將 file 改成 FiLe 就可以簡單繞過了。
另一個 ”RCE“
如果這個也叫做 RCE,那我也來分享一個 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>
甚至都不需要大小寫繞過 file 的協(xié)議,直接雙擊打開:

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

大部分桌面應(yīng)用的開發(fā)者都不會注意這種安全特性,因此很容易在需要的目標(biāo)中構(gòu)造這種釣魚場景。對于一些帶有自動下載文件功能的 APP(比如 Telegram),甚至可以做到一鍵 RCE。
當(dāng)然,Telegram 也已經(jīng)修復(fù)了該漏洞 :)
總結(jié)
本文介紹了最近討論比較多的一個 RCE,并介紹了一個類似的 macOS RCE(fileloc 后綴執(zhí)行文件),這其實是個陳年老問題了,編號為 CVE-2009-2811,蘋果一直也懶得修,畢竟只能彈計算器裝逼,執(zhí)行不了什么有意義的代碼,所以我更愿意稱之為 Feature。在此基礎(chǔ)上介紹一種在桌面應(yīng)用中使用 .terminal 后綴繞過 Quarantine 和 Gatekeeper 實現(xiàn)真正 RCE 的例子。
希望各國安全研究員還是要多珍惜自己的羽毛,少在安全會議上灌水和發(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
