這兩個對象封裝了文件系統和 shell 相關的功能。雖然我們不能 require(child_process),但是通過 appshell.fs 可以實現任意文件讀寫。到文件讀寫這一步其實已經可以拿 flag 了,當然一開始我們沒有給出 flag 的路徑,還是反彈一個 shell 比較靠譜。覆蓋可執行文件加上額外的觸發條件即可實現遠程代碼執行。
前者支持打開 file:/// 域,在 Windows 下相當於 ShellExecute,打開一個 .cmd 或者 .exe 即可執行代碼;而 showOSFolder 在 macOS 下的表現是,如果文件夾是一個有效的 .app bundle,那麼等同於雙擊 .app,也就是運行。如果你不太明白,那麼請嘗試在終端中執行
到這裡即可實現與 VSCode 之前的 bug 完全一致的效果,通過 dns 重綁定攻擊本地埠實現遠程代碼執行。在我之前的漏洞報告後,libCEF 參考 node.js 和 Electron 的做法修復了 dns 重綁定的問題。但是最新版 Brackets 的這個埠仍然可以從 localhost 訪問。
Dash 可以說是以 macOS 為主力開發環境的程序員當中很受歡迎的一款工具了,主要功能就是離線看文檔。文檔是一個後綴為 docset 的 bundle 文件夾,存放 html 資源和索引資料庫等。
它具有兩個攻擊面,一個是展示文檔時用的是 WebView,另一個是在打開文檔的時候會啟用一個內置的 GCDWebServer 來啟動一個 http 服務,可通過其他計算機訪問。
在之前版本的 Dash 就可以通過一個惡意的 docset,以 XMLHttpRequest 的方式讀取並上傳本地文件(例如 ssh 公私鑰)的內容。在 3.x 的某一個版本(具體不詳)中增加了限制,如果訪問的文件在 docset 目錄之外會失敗。但這個版本可以使用在壓縮包中添加符號鏈接的方式繞過(由於 docset 是文件夾,通常的分發方式是使用 tar.gz 包)。此外符號鏈接的問題同樣影響 Dash 內置的 http 服務。