NumPy 安全性#
安全性問題可以按照專案 README 中的描述私下回報,以及在問題追蹤器上開啟 新問題。Python 安全性報告指南 是一個很好的資源,其注意事項也適用於 NumPy。
NumPy 的維護者不是安全性專家。但是,我們對安全性以及 NumPy 程式碼庫及其使用方式的專家都非常盡責。在針對 NumPy 創建安全性公告之前,請務必通知我們,因為我們很樂意優先處理問題或協助評估錯誤的嚴重性。我們事先不知道的安全性公告可能會為所有相關方帶來大量工作。
關於在不受信任的資料上使用 NumPy 的建議#
可以自由執行 NumPy(或 Python)函數的使用者必須被視為與進程/Python 直譯器具有相同的權限。
話雖如此,NumPy 通常應該可以安全地用於非特權使用者提供的資料,並通過安全的 API 函數讀取(例如,從文字檔或不支援 pickle 的 .npy
檔載入)。惡意的值或資料大小絕不應導致權限提升。請注意,以上是指陣列資料。我們目前不認為例如 f2py
是安全的:它通常用於編譯然後運行的程式。因此,任何 f2py
調用都必須使用與稍後執行相同的權限。
當使用不受信任的資料時,以下幾點可能很有用或應該注意
耗盡記憶體可能導致記憶體不足終止,這是一種可能的阻斷服務攻擊。可能的原因可能是
讀取文字檔的函數,這可能需要比原始輸入檔案大小更多的記憶體。
如果使用者可以創建任意形狀的陣列,NumPy 的廣播機制意味著中間或結果陣列可能比輸入大得多。
NumPy 結構化 dtype 允許大量的複雜性。幸運的是,當意外提供結構化 dtype 時,大多數程式碼都能優雅地失敗。但是,程式碼應該禁止不受信任的使用者提供這些(例如,透過
.npy
檔),或者仔細檢查包含的巢狀結構化/子陣列 dtype 的欄位。傳遞使用者輸入通常應被視為不安全(除了正在讀取的資料)。一個例子是
np.dtype(user_string)
或dtype=user_string
。操作速度可能取決於值,記憶體順序可能導致更大的臨時記憶體使用和更慢的執行速度。這意味著與簡單的測試案例相比,操作可能會顯著變慢或使用更多記憶體。
讀取資料時,請考慮強制執行特定的形狀(例如一維)或 dtype,例如
float64
、float32
或int64
以降低複雜性。
當處理非平凡的不受信任的資料時,建議對分析進行沙箱化,以防止潛在的權限提升。如果使用基於 NumPy 的其他函式庫,則尤其建議這樣做,因為這些函式庫會增加額外的複雜性和潛在的安全性問題。