又是一個影響範圍極大的嚴重漏洞,讓HP、Amazon、Apache和Pivotal等知名企業的數千專案全中鏢,JavaScript、Ruby、.NET與Go等開發語言生態系也都有該漏洞的足跡,開源雲端監控服務Snyk的資安團隊揭露了Zip Slip漏洞,這是一個任意文件覆寫的臭蟲,可能導致遠端程式碼執行攻擊,Snyk提到,由於Java缺乏中央函式庫提供高階的歸檔(Archive)處理功能,因此最容易受到攻擊。
目錄走訪攻擊目的就是要存取根目錄之外的檔案以及資料夾,Snyk的漏洞白皮書提到,駭客要使用這個漏洞,有兩個動作要進行,首先是惡意的歸檔行為,再來是路徑未經驗證檢查的檔案解壓縮(Extract)。惡意的壓縮檔案需要包含一個或多個檔案,透過在這些檔案名稱加入../或是絕對路徑等操作變數,駭客能夠存取系統中任意資料夾的任意檔案,而這些檔案可能包含原始程式碼或是敏感資訊。
Snyk舉例,假設壓縮檔存在兩個檔案,其中一個為good.sh,這個檔案解壓縮後會被提取到正常的目標資料夾,而另一個evil.sh檔案前面加了許多../前綴,便是駭客試圖要走訪系統根目錄,並新增檔案進暫存目錄的惡意行為。當使用者在根目錄使用指令cd ..,則仍然會在根目錄中,也就是說當惡意檔案名稱添加許多../,駭客便更有機會存取到根目錄,以進行下一步偷取敏感資料的動作。
惡意壓縮檔範例:
5 Tue Jun 5 11:04:29 BST 2018 good.sh
20 Tue Jun 5 11:04:42 BST 2018 ../../../../../../../../tmp/evil.sh
Snyk提到,這樣的zip壓縮檔必須要手動製作,因為儘管zip規範允許,但一般的壓縮軟體不會讓使用者輸入這樣的路徑,當然駭客也可以使用特別的工具,輕易的大量製作這樣的檔案。
利用Zip Slip漏洞的第二步,需要使用程式碼或是函式庫的功能,來解壓縮壓縮檔中的檔案,而當這些具解壓縮功能的程式碼沒有對檔案路徑進行驗證時,漏洞便出現了。
Snyk以Java的片段程式碼當作範例解釋:
Enumeration<ZipEntry> entries = zip.getEntries();
while (entries.hasMoreElements()) {
ZipEntry e = entries.nextElement();
File f = new File(destinationDir, e.getName());
InputStream input = zip.getInputStream(e);
IOUtils.copy(input, write(f));
}
範例中的e.getName()取得了未經驗證的目標目錄,配合上面壓縮檔的案例,這個被抽取出來的evil.sh檔案前會附加許多../,因此evil.sh便會被寫入在目標目錄之外。
Snyk表示,Zip Slip影響多種檔案格式,包括tar、jar、war、cpio、apk、rar和7z。他們在GitHub中建立了存在漏洞的專案列表,其中不乏知名公司的專案,包括AWS Toolkit for Eclipse、Spring Integration,LinkedIn的Pinot OLAP資料庫、Apache/Twitter Heron、阿里巴巴JStorm、Jenkins和Gradle等,但影響遠不只如此,官方提到連Google也中標。
根據漏洞通報程序,在Snyk對外揭露這個漏洞前,就已經對受影響組織發出警告,多數受影響的專案也已經修復,Python在這次漏洞風暴中全身而退,Go語言只有一個函式庫受到影響,在收到通知後的兩天內就修復了,Ruby少數函式庫存在漏洞危機,JavaScript由於有許多中央函式庫,這個問題在公開揭露前,就已經全數被修復完畢,而.Net同樣也有中央函式庫提供抽取功能,因此目前也安全無虞。
而最嚴重的就屬Java,再來就是Groove,這兩個語言缺乏中央函式庫,即使熱門的甲骨文與Apache的一般壓縮API也沒有對公開完整的解壓縮功能,因此許多檔案處理程式碼都是在像是Stack Overflow這樣的社群間分享,Snyk提到,他們發現有漏洞的Java專案比起其他語言還要多出許多。
Snyk建議,除了開發者需要檢查解壓縮程式碼外,也可以在應用程式建置工作管線中,加入Zip Slip漏洞安全檢測。