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