NumPy 安全#

安全问题可以按照项目 README 中的描述私下报告,并在问题跟踪器上打开一个 new issue on the issue tracker . Python security reporting guidelines 是一个很好的资源,它的注意事项也适用于 NumPy.

NumPy 的维护者不是安全专家.但是,我们对安全问题以及 NumPy 代码库及其使用方式都非常重视.请在创建针对 NumPy 的安全建议之前通知我们,因为我们很乐意优先处理问题或帮助评估错误的严重性.我们事先不知道的安全建议可能会导致所有相关方的大量工作.

关于在不受信任的数据上使用 NumPy 的建议#

可以自由执行 NumPy(或 Python)函数的用户必须被视为与进程/Python 解释器具有相同的权限.

也就是说,通常应该可以在由非特权用户提供并通过安全 API 函数读取的数据上安全地使用 NumPy(例如,从没有 pickle 支持的文本文件或 .npy 文件加载).恶意值或数据大小不应导致权限提升.请注意,上面指的是数组数据.我们目前不认为例如 f2py 是安全的:它通常用于编译然后运行的程序.因此,任何 f2py 调用都必须使用与稍后执行相同的权限.

以下几点可能有用或在使用不受信任的数据时应注意:

  • 耗尽内存可能导致内存不足而被终止,这可能是一种拒绝服务攻击.可能的原因包括:

    • 读取文本文件的函数,这可能需要比原始输入文件大小大得多的内存.

    • 如果用户可以创建任意形状的数组,则 NumPy 的广播意味着中间数组或结果数组可能比输入数组大得多.

  • NumPy 结构化 dtype 允许大量的复杂性.幸运的是,当意外提供结构化 dtype 时,大多数代码都能正常失败.但是,代码应该禁止不受信任的用户提供这些(例如,通过 .npy 文件),或者仔细检查包含的嵌套结构化/子数组 dtype 的字段.

  • 传递用户输入通常应被认为是不安全的(除了正在读取的数据).一个例子是 np.dtype(user_string)dtype=user_string .

  • 操作的速度可能取决于值,并且内存顺序可能导致更大的临时内存使用和更慢的执行. 这意味着与简单的测试用例相比,操作可能会明显变慢或使用更多内存.

  • 读取数据时,请考虑强制执行特定的形状(例如,一维)或 dtype,例如 float64 , float32int64 ,以降低复杂性.

当处理重要的不受信任数据时,建议对分析进行沙盒化,以防止潜在的权限提升.如果使用基于 NumPy 的其他库,则尤其建议这样做,因为这些库增加了额外的复杂性和潜在的安全问题.