近日,Python的Tarfile模組中發現一個存在長達15年之久的漏洞,引起了大家的關注,一是存在時間比較久,最早在2007年就被披露並記錄為CVE-2007-4559;二是可能影響超過35萬個開源儲存庫。
一、Tarfile漏洞始末
2007年8月24日,某安全研究員上報了Tarfile的目錄遍歷漏洞[1]。在漏洞上報6天后,元件的作者Lars認為不需要修復該漏洞,是否信任來源包來提取其中內容是使用者應該關注的,並做了文件方面的警告更新[2]。
2014年3月,作者Lars再次收到Tarfile的遍歷攻擊漏洞的反饋。Lars指出,Tarfile容易受到所有已知針對tar程式的攻擊,並列舉出9大攻擊可能,包括路徑遍歷、符號連結檔案攻擊、許可權操作、記憶體洩露等,並強調Tarfile 只是是一個庫,不能替代 GNU tar。在一個月後,Lars提議用一個新類SafeTarFile,它是 Tarfile 類的子類和替代品,來解決安全問題,不過截止到2021年2月,SafeTarFile 沒有透過現有的測試[3]。
二、漏洞利用原理
Tarfiles 是多個不同檔案和後設資料的集合,其中Tarfile用於解壓縮時,會對檔名、檔案大小、校驗資訊記錄在tarinfo中。而Tarfile在呼叫extract或extractall函式時,可以在檔名中新增作業系統分隔符(“/”或“\”)以及“..”來進行目錄遍歷攻擊。以下是一個典型的6行程式碼做的一個攻擊示範。
最近重新發現了該漏洞的某安全研究員在部落格中演示了,在 Windows 上的 Spyder IDE中利用 Tarfile的攻擊過程。Spyder IDE 使用副檔名為 .spydata 的檔案型別,該資料用於填充變數資源管理器,由於 .spydata 檔案實際上是一個 tar 檔案,因此程式使用 Tarfile 來提取 .spydata 檔案中的所有檔案。演示影片中展示瞭如何利用Tarfile來覆蓋程式原始碼,甚至嘗試獲得了管理員訪問許可權[4]。
三、解決方案
截止到2022年9月,針對此漏洞的相關 PR 仍然沒有被合併修復,所以當前幾乎所有正在維護的 Python 版本均受影響。在Python官方沒有合併修復方案之前,需要謹慎使用Tarfile。對於來歷不清楚的包,使用Tarfile解包會存在被攻擊的風險。此外,在程式碼中也要防止類似於上文中,利用Tarfile構造的惡意攻擊。
1、透過安全產品檢查是否使用Tarfile元件
綠盟程式碼安全審計系統SDA,擁有靜態程式碼審計和開源元件分析等多項能力。目前透過升級最新的規則包,支援查詢程式碼中是否存在Tarfile檔案的使用,然後根據程式碼上下文,判斷是否存在目錄遍歷漏洞。最新規則升級包,請聯絡綠盟科技售後人員或從官方升級網站下載。
透過從github上取python-scratchbox專案作為示例程式碼[5],經過綠盟程式碼安全審計系統SDA產品檢測效果如下:
2、透過程式碼加固來規避Tarfile風險
對於必須要使用Tarfile的情況下,這裡建議做一下函式加固,增加路徑檢測check_path操作,確保Tarfile執行時不會出現路徑穿越操作,具體程式碼示例如下:
參考文獻
[1]. https://mail.python.org/pipermail/python-dev/2007-August/074290.html
[2]. https://bugs.python.org/issue1044#msg55464
[3]. https://bugs.python.org/issue21109
[4]. https://www.trellix.com/en-us/about/newsroom/stories/threat-labs/tarfile-exploiting-the-world.html
https://players.brightcove.net/21712694001/default_default/index.html?videoId=6312605223112
[5]. https://github.com/kad/python-scratchbox