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,如
float64、float32或int64,以降低复杂性。
在处理非平凡的、不受信任的数据时,建议对分析进行沙盒化,以防范潜在的权限升级。如果使用基于 NumPy 的其他库,则尤其建议这样做,因为这些库会增加额外的复杂性和潜在的安全问题。