NumPy 安全性#

安全问题可以按照项目 README 中的说明私下报告,并在打开 问题跟踪器上的新问题 时报告。 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,例如 float64float32int64,以降低复杂性。

在处理非平凡的不受信任数据时,建议对分析进行沙箱处理,以防范潜在的权限提升。如果使用基于 NumPy 的其他库,这一点尤其重要,因为这些库会增加额外的复杂性和潜在的安全问题。