NumPy 安全性#
安全问题可以按照项目自述文件中所述的私下报告,以及在问题跟踪器上创建新问题时报告。Python 安全报告指南是一个很好的资源,其说明也适用于 NumPy。
NumPy 的维护者并非安全专家。但是,我们认真对待安全性,并且了解 NumPy 代码库及其使用方法的专家。请务必在针对 NumPy 创建安全建议之前通知我们,因为我们很乐意优先处理问题或帮助评估错误的严重性。我们事先不知道的安全建议会导致所有相关方付出大量工作。
在不受信任的数据上使用 NumPy 的建议#
能够自由执行 NumPy(或 Python)函数的用户必须被视为拥有与进程/Python 解释器相同的权限。
也就是说,NumPy 通常在由非特权用户提供并通过安全 API 函数读取的数据上使用是安全的(例如,从文本文件或.npy
文件加载,不支持 pickle)。恶意值或数据大小绝不应该导致权限升级。请注意,以上指的是数组数据。我们目前不认为例如f2py
是安全的:它通常用于编译一个程序,然后运行该程序。因此,任何f2py
调用都必须使用与之后执行相同的权限。
处理不受信任的数据时,以下几点可能会有用或需要注意
耗尽内存会导致内存不足终止,这是一种可能的拒绝服务攻击。可能的原因包括:
读取文本文件的函数,这可能比原始输入文件大小需要更多内存。
如果用户可以创建任意形状的数组,则 NumPy 的广播意味着中间数组或结果数组可能比输入大得多。
NumPy 结构化 dtype 允许大量的复杂性。幸运的是,当意外提供结构化 dtype 时,大多数代码都能正常失败。但是,代码应该禁止不受信任的用户提供这些(例如,通过
.npy
文件)或仔细检查包含的字段以进行嵌套结构化/子数组 dtype。通常应认为传递用户输入是不安全的(除非读取数据)。一个例子是
np.dtype(user_string)
或dtype=user_string
。操作速度可能取决于值,内存顺序可能导致更大的临时内存使用和更慢的执行。这意味着与简单的测试用例相比,操作可能明显更慢或使用更多内存。
读取数据时,请考虑强制执行特定形状(例如一维)或 dtype,例如
float64
、float32
或int64
,以降低复杂性。
处理非平凡的不可信数据时,建议对分析进行沙箱处理,以防止潜在的权限提升。如果使用基于 NumPy 的其他库,则尤其建议这样做,因为这些库会增加额外的复杂性和潜在的安全问题。