CVE-2018-9206分析
https://www.npmjs.com上有Node.js和許多相關的包。研究人員在Node.js npm上搜索了許多常見的包名和函式,包括file, backup, download, upload等。最後搜尋的upload的結果是Blueimp的軟體專案,名為jQuery file upload。
其描述為:
檔案上傳小工具,包含多個檔案選擇,拖放支援,進度條,驗證和預覽影象,jQuery的音訊和視訊。支援跨域、分塊和可恢復檔案上傳以及客戶端影象大小調整。適用於任何伺服器端平臺——支援標準HTML表單檔案上傳(PHP,Python,Ruby on Rails,Java,Node.js,Go等)。
分析
研究人員開始分析package原始碼,發現server/php目錄下的2個PHP檔案,upload.php和UploadHandler.php。upload.php檔案會呼叫所有檔案上傳程式碼所在的UploadHandler.php主檔案。所有上傳的檔案都回儲存在web伺服器的根目錄files/ directory下。研究人員用curl寫了點簡單的程式碼,並用一個簡單的PHP shell檔案來確認是否可以在伺服器上上傳web shell並執行命令。
$ curl -F "[email protected]" http://example.com/jQuery-File-Upload-9.22.0/server/php/index.php
shell.php檔案:
<?php $cmd=$_GET['cmd']; system ($cmd);?>
用cmd=id連線到測試web伺服器會返回web伺服器執行的程序的user id。
研究人員對fork原始碼的1000個專案進行了測試,發現只有36個專案不受該POC的影響。但只需對POC做一點修改就可以利用該漏洞。
POC參見:https://github.com/lcashdol/Exploits/tree/master/CVE-2018-9206
研究人員懷疑該漏洞應該也被其他人發現了,因此Google搜尋了一下,確認使用該程式碼的專案都容易被入侵,並且已經有許多Youtube視訊來證明類似的軟體package攻擊。
研究人員通知了jQuery File Upload的作者,並報告了該漏洞。作者回應了該漏洞稱並沒有在測試環境中復現該漏洞。研究人員與作者通過郵件比較了測試配置後發現,Apache的維護人員在Apache version 2.3.9後就不支援.htaccess了。也就是說為了改善效能,並不需要在每次訪問目錄時都檢查該檔案。這一變化可能會使使用者為伺服器配置的安全策略被繞過。
Apache也有理由關閉.htaccess,但這一改變會使許多開發者和專案受到攻擊,尤其是將.htaccess作為安全特徵的專案。在Blueimp的案例中,為了解決這一變化帶來的問題,並修復CVE-2018-9206檔案上傳漏洞,開發者需要修改其程式碼使其只允許內容型別的圖片檔案上傳。
並不是一個專案的問題
值得一提的是,因為Apache的這一改變大約有7800個專案受到檔案上傳問題的影響。
大多數的程式碼fork會使新程式碼也包含原始碼中的漏洞。這樣的話,即使專案作者修改了Blueimp的程式碼,該漏洞在fork這段程式碼的專案中還是會存在。如果這些專案在生產環境中,那麼易受到檔案上傳和程式碼執行漏洞的攻擊。打開了資料洩露的大門之後,惡意軟體感染、資料汙染和各種破壞也會接踵而至。
但沒有一種方式可以精確的計算fork jQuery File Upload的專案個數,當然也沒有辦法可以確定這些fork的專案是不是用在生產環境中。該專案的舊版本也存在檔案上傳的問題,時間可以追溯到2010年。
結論
Apache移除了一個安全控制措施,導致Blueimp的Jquery file upload軟體專案的安全措施也被移除,同時fork了Jquery file upload軟體專案的所有軟體專案都受到影響。該漏洞影響獨立的web應用、WordPress外掛和其他CMS。