NumPy 安全性#

安全问题可以按照项目README中的描述私下报告,并在 问题跟踪器上打开一个新问题 时报告.`Python 安全报告指南 <https://www.python.org/dev/security/>`_ 是一个很好的资源,其注意事项也适用于NumPy.

NumPy 的维护者不是安全专家.然而,我们非常注重安全性,并且是 NumPy 代码库及其使用方式的专家.请在针对 NumPy 创建安全公告之前通知我们,因为我们乐于优先处理问题或帮助评估漏洞的严重性.我们事先不知道的安全公告可能会给所有相关方带来大量工作.

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

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

也就是说,NumPy 在通过安全的 API 函数(例如从文本文件或不支持 pickle 的 .npy 文件加载)处理非特权用户提供的数据时,通常应该是安全的.恶意 数据大小 不应导致权限提升.请注意,上述内容指的是数组数据.我们目前不认为例如 f2py 是安全的:它通常用于编译随后运行的程序.因此,任何 f2py 调用必须使用与后续执行相同的权限.

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

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

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

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

  • NumPy 结构化数据类型允许有很大的复杂性.幸运的是,大多数代码在意外提供结构化数据类型时会优雅地失败.然而,代码应该禁止不受信任的用户提供这些(例如通过 .npy 文件),或者仔细检查包含的字段以确保嵌套的结构化/子数组数据类型.

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

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

  • 在读取数据时,考虑强制执行特定的形状(例如一维)或数据类型,如 float64float32int64,以减少复杂性.

在处理非平凡的不可信数据时,建议将分析沙盒化以防止潜在的权限提升.如果使用基于NumPy的进一步库,这一点尤其建议,因为这些库会增加额外的复杂性和潜在的安全问题.