NumPy 安全#

安全问题可以按照项目自述文件中的描述以及在问题跟踪器上打开新问题时私下报告。Python 安全报告指南是 一个很好的资源,其注释也适用于 NumPy。

NumPy 的维护者不是安全专家。然而,我们对 NumPy 代码库及其使用方式的安全性和专家非常认真。请在针对 NumPy 创建安全建议之前通知我们,因为我们很乐意确定问题的优先级或帮助评估错误的严重性。我们事先不知道的安全建议可能会给所有相关方带来大量工作。

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

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

也就是说,NumPy 通常应该可以安全地用于非特权用户提供的数据,并通过安全的 API 函数读取(例如,从文本文件或.npy不带 pickle 支持的文件加载)。恶意数据大小永远不应导致权限升级。

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

  • 耗尽内存可能会导致内存不足杀死,这可能是拒绝服务攻击。可能的原因可能是:

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

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

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

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

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

  • 读取数据时,请考虑强制使用特定形状(例如一维)或数据类型(例如float64float32、 或 )int64以降低复杂性。

在处理重要的不可信数据时,建议对分析进行沙箱处理,以防止潜在的权限升级。如果使用更多基于 NumPy 的库,这是特别可取的,因为这些库会增加额外的复杂性和潜在的安全问题。