Python 中允許從沙盒腳本調用系統命令的漏洞

基於 Python 2.7 中出現的一個眾所周知的錯誤發布了 Python 代碼執行系統的變通方法,該錯誤於 2012 年被發現並且尚未在 Python 3 中修復。該錯誤允許使用特殊鏈接的 Python 代碼啟動對已釋放的調用Python 中的內存(釋放後使用)。 最初,假設該錯誤不會構成安全威脅,並且只有在極少數情況下(通常是人為造成的)才會導致腳本異常終止。

化名 kn32 的安全研究人員對這個問題產生了興趣,並設法準備了一個有效的漏洞利用程序,使調用任何系統命令成為可能,而無需直接訪問 os.system 等方法。 該漏洞是用純 Python 實現的,無需導入外部庫,也無需安裝“code.__new__”處理程序。 在鉤子中,只有“builtin.__id__”被使用,這通常是不被禁止的。 在實踐方面,建議的代碼可用於繞過各種服務和環境(例如,學習環境、在線 shell、內置處理程序等)中允許執行 Python 代碼但限制可用調用的隔離機制並且不允許訪問方法,例如 os.system。

提議的代碼類似於 os.system 調用,它通過利用 CPython 中的漏洞來工作。 該漏洞適用於 x3-86 系統上所有版本的 Python 64,並且在 Ubuntu 22.04 上穩定,即使啟用了 PIE、RELRO 和 CET 安全模式。 工作簡化為從 Python 代碼中獲取有關可執行 CPython 代碼中函數地址的信息。 根據這個地址,計算出CPython在內存中的基地址和libc加載實例中system()函數的地址。 最後,通過將第一個參數指針替換為字符串“/bin/sh”來啟動到某個系統地址的直接跳轉。

Python 中允許從沙盒腳本調用系統命令的漏洞


來源: opennet.ru

添加評論