Безопасность NumPy#

Проблемы безопасности могут быть сообщены приватно, как описано в README проекта, и при открытии новый вопрос в трекере проблем. Рекомендации по сообщению об уязвимостях безопасности в Python являются хорошим ресурсом, и его примечания также применимы к NumPy.

Сопровождающие NumPy не являются экспертами по безопасности. Однако мы сознательно относимся к безопасности и являемся экспертами как в кодовой базе NumPy, так и в её использовании. Пожалуйста, уведомляйте нас перед созданием консультаций по безопасности для NumPy, так как мы готовы расставить приоритеты проблем или помочь с оценкой серьёзности ошибки. Консультация по безопасности, о которой мы не знаем заранее, может привести к большой работе для всех вовлечённых сторон.

Рекомендации по использованию NumPy с ненадёжными данными#

Пользователь, который может свободно выполнять функции NumPy (или Python), должен считаться имеющим те же привилегии, что и процесс/интерпретатор Python.

Тем не менее, NumPy обычно безопасно использовать на данные предоставленные непривилегированными пользователями и прочитанные через безопасные API-функции (например, загруженные из текстового файла или .npy файл без поддержки pickle). Вредоносный values или размеры данных никогда не должен приводить к повышению привилегий. Обратите внимание, что вышесказанное относится к данным массива. Мы в настоящее время не рассматриваем, например, f2py для безопасности: обычно используется для компиляции программы, которая затем запускается. Любой f2py вызов должен использовать те же привилегии, что и последующее выполнение.

Следующие моменты могут быть полезны или должны быть учтены при работе с ненадежными данными:

  • Исчерпание памяти может привести к завершению процесса из-за нехватки памяти, что является возможной атакой типа "отказ в обслуживании". Возможные причины могут быть:

    • Функции, читающие текстовые файлы, которые могут требовать значительно больше памяти, чем исходный размер входного файла.

    • Если пользователи могут создавать массивы произвольной формы, то механизм трансляции (broadcasting) NumPy означает, что промежуточные или результирующие массивы могут быть значительно больше входных.

  • Структурированные типы данных NumPy допускают большую сложность. К счастью, большинство кода корректно обрабатывает ситуации, когда структурированный тип данных предоставляется неожиданно. Однако код должен либо запрещать ненадёжным пользователям предоставлять их (например, через .npy файлы) или тщательно проверьте поля, включённые для вложенных структурированных/подмассивных типов данных.

  • Передача пользовательского ввода обычно должна считаться небезопасной (за исключением считываемых данных). Примером может быть np.dtype(user_string) или dtype=user_string.

  • Скорость операций может зависеть от значений, а порядок памяти может привести к большему использованию временной памяти и более медленному выполнению. Это означает, что операции могут быть значительно медленнее или использовать больше памяти по сравнению с простыми тестовыми случаями.

  • При чтении данных рассмотрите возможность принудительного задания конкретной формы (например, одномерной) или dtype, такого как float64, float32, или int64 для уменьшения сложности.

При работе с нетривиальными ненадёжными данными рекомендуется изолировать анализ для защиты от потенциального повышения привилегий. Это особенно рекомендуется, если используются дополнительные библиотеки на основе NumPy, поскольку они добавляют дополнительную сложность и потенциальные проблемы безопасности.