| CVE編號 | CVE-2017-17562 |
|---|---|
| 影響產品 | GoAhead 3.6.5之前版本 |
| 解決辦法 | Embedthis已釋出修補版GoAhead 3.6.5 |
| 張貼日 | 2017-12-29 |
| 上稿單位 | TWCERT/CC |
●概述:
Embedthis GoAhead系列存在弱點,僅對http請求內REMOTE_HOST和HTTP_AUTHORIZATION進行過濾,其他參數則視作安全可靠,駭客利用其輸入驗證機制缺陷,先以launchCgi注入惡意碼到暫存檔,再提供惡意envp參數給cgiHandler()以變更流程,強制GoAhead載入惡意程式並執行,儘管GoAhead 3.6.5以後無此風險,然大量舊型IoT設備仍啟動CGI,等待設備商更新又曠日廢時,恐怕將衍生新的Botnet威脅。
●編註:
(1)背景簡介
Embedthis開發Appweb、GoAhead二款軟體,GoAhead是個所佔空間不到150k的微型嵌入式Web server,專為無作業系統之小型設備而設計,當然各廠商會根據自身需求進行二度開發。
共通閘道介面CGI(Common Gateway Interface)係資料傳輸標準,因server負責接收資料,故CGI本身做溝通工作,讓用戶從瀏覽器向伺服器請求資料時,透過CGI程式動態產生網頁,使用者取回動態HTML資料流,CGI標準指出可藉由環境變數來進行溝通。
(2)漏洞原理
考量智財權且不鼓勵網路攻擊,本文僅片段引用相關函數,唯須注意只有CGI啟用及CGI程式被動態鏈結時,GoAhead server才產生弱點。
(2-1)注入惡意碼
使用launchCgi函數,內部指令dup2()處理stdin檔案描述器,指向一個包含了POST請求body內容的暫存檔,意味著硬碟中有某一檔案包含用戶寫入數據,可以使用類似LD_PRELOAD=/tmp/cgi-XXXXXX的手法來引用該數據。
Linux procfs檔案系統的符號鏈結功能可以讓駭客直接參照stdin檔案描述器,而它指向的就是暫存檔名稱。
(2-2)執行惡意碼
配置指標陣列給新CGI process的envp參數時,GoAhead啟動cgiHandler函數,接著cgiHandler以HTTP request內key-value成對資料進行初始化,最後CGI process呼叫launchCgi函數以執行CGI script。
cgiHandler()僅過濾REMOTE_HOST和HTTP_AUTHORIZATION,形成輸入驗證瑕疵,故駭客得以向新process注入特殊環境變數,讓動態鏈結器解析envp參數,只要找到特殊變數,便執行其對應之指令,藉以改變動態鏈結器控制流程。
Goahead中ELF動態鏈接器指向/lib64/ld-linux-x86-64.so.2,動態鏈結器負責鏈結和載入共享物件並解析符號。特殊環境變數LD_TRACE_LOADED_OBJECTS設為1,可印出所有goahead已加載的函式庫共享物件。
鏈接器對preloadlist初始化,若preloadlist非NULL,則呼叫handle_ld_preload(),handle_ld_preload()把preloadlist當成共享物件來載入,故駭客能指定載入具有攻擊性payload的暫存檔。
(3)風險評估
現在用Shodan搜尋GoAhead server,其結果高達70餘萬,這數字是所有線上可見數量,而非弱點設備數量,實際受影響規模尚曖昧難辨,鑒於CGI在舊型IoT設備上極為普遍,畢竟全球大廠如Comcast、IBM、波音、Oracle、D-Link、ZTE、HP、Siemens、Canon等,早已生產無數路由器、印表機、攝影機,縱然Embedthis已針對此漏洞進行修補,但下游業者也需要將其修補融合至自家產品之韌體更新,再部署至底層使用者,耗時粗估數月甚或數年,憶及今年3月GoAhead多個漏洞被公開,牽涉到超過1200種型號攝影機,事後證明其中某一漏洞是設備商二度開發所肇生,此例更說明全面修補該漏洞之難度,以史為鑑,任何漏洞公開後駭客總是躍躍欲試,雖然駭客組織未必能對幾十萬GoAhead設備鑽研透徹,但只要對特定主流型號攻擊,如同Satori創作者對華為HG532路由器瞭若指掌,恐怕能針對性地釀成新興殭屍網路。
