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