Распространенные уязвимости приложений на Python и их предотвращение

Авторка: Kateryna Ivanenko Invicti & Mend.io Brand Manager

Python сегодня широко используется для веб-приложений, однако он не защищен от проблем безопасности. В этой статье перечислены распространенные уязвимости этого языка программирования и основные методы их предотвращения, чтобы вы могли взять под контроль безопасность своих приложений.

Инъекции

Инъекция – это уязвимость, из-за которой приложение ошибочно обрабатывает потенциально опасные данные пользователя так, будто они являются командами или кодом.

Примеры: SQL-инъекция, инъекция кода, инъекция команд, межсайтовый скриптинг (XSS).

Инъекция указана в текущей редакции OWASP Top 10 (2025) как один из весомых рисков.

Надежный способ предотвращения таких уязвимостей заключается в обеспечении разделения данных от команд и запросов.

Рекомендуемый подход – использовать безопасный API, который избегает прямого взаимодействия с интерпретатором, или поддерживает параметризированные запросы, или же опирается на инструменты объектно-реляционной проекции (Object Relational Mapping, ORM).

Однако одна лишь параметризация не устраняет риск полностью.

Сохраненные процедуры все еще могут приводить к SQL-инъекциям, если PL/SQL или T-SQL объединяет запросы и данные или выполняет опасные данные с помощью EXECUTE IMMEDIATE или exec().

Когда полное разделение данных и команд невозможно, риск можно уменьшить с помощью дополнительных мер:

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

Небезопасная десериализация

Это уязвимость, которая возникает, когда приложение получает данные и реконструирует (десериализирует) их в объект без надлежащей проверки. Этот недостаток относится к A08:2025 – Нарушение целостности ПО или данных в OWASP Top 10.

Механизм pickle в Python является классическим примером небезопасного механизма десериализации, если он используется с недоверенными данными.

Это может привести к выполнению вредоносного кода, манипуляций с объектами, инъекций или обхода контроля доступа.

Самый безопасный подход – избегать приема сериализированных объектов из недоверенных источников или использовать форматы сериализации, которые принимают только примитивные типы данных.

Когда это невозможно, OWASP рекомендует следующие меры контроля:

  • Применение проверок целостности, например, цифровых подписей, для сериализированных объектов.
  • Принудительное применение строгих ограничений типов при десериализации перед созданием объектов.
  • Изоляция и запуск кода, выполняющего десериализацию, в средах с низкими привилегиями, если это возможно.
  • Логирование ошибок и исключений десериализации.
  • Ограничение или мониторинг входящих и исходящих сетевых соединений из контейнеров или серверов, выполняющих десериализацию.
  • Мониторинг десериализации и оповещения, если пользователь постоянно выполняет десериализацию.

Обход каталога

Обход каталога, также известный как directory traversal или path traversal, является уязвимостью, позволяющей злоумышленникам получать доступ и просматривать файлы из ограниченных областей сервера.

Она принадлежит к самой опасной категории OWASP Top 10 – Нарушенный контроль доступа.

Их рекомендации по предотвращению содержат следующие меры:

  • Не полагаться на данные, предоставленные пользователем при использовании вызовов файловой системы.
  • Применять индексы вместо реальных фрагментов названий файлов при работе с шаблонами или файлами языков.
  • Формировать путь в коде приложения и вставлять только строго контролируемые значения от пользователей там, где это необходимо.
  • Проверять входящие данные пользователя с помощью списков разрешенных значений.
  • Использовать chroot jail среды (механизм изоляции процесса в Unix/Linux-системах, когда для программы искусственно меняется корневой каталог) и политики доступа кода, чтобы ограничить места, из которых файлы могут быть получены или куда они могут быть сохранены.
  • Проводить нормализацию данных, предоставленных пользователем, если их необходимо использовать в операциях с файлами.

Уязвимые и устаревшие зависимости

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

Для снижения риска рекомендуется применять следующие шаги:

  • Поддержание инвентаризации библиотек, то есть SBOM (Software Bill of Materials).
  • Уменьшение поверхности атаки путём удаления ненужных зависимостей.
  • Использование надежных источников при поиске новых пакетов.

Как обнаружить эти уязвимости

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

Для этой цели обычно используют следующие автотоматизированные инструменты:

  • SAST – поиск уязвимостей в исходном коде.
  • DAST – безопасная имитация действий злоумышленника во время выполнения приложения.
  • SCA – проверка безопасности библиотек.

Лучший вариант – использовать все эти инструменты, поскольку SAST может выявлять проблемы на ранних этапах разработки, DAST может проверять их в среде выполнения и находить более сложные уязвимости, а SCA обеспечивает покрытие компонентов.

Если вы хотите бесплатно протестировать такие инструменты, оставьте свои контактные данные ниже и мы свяжемся с вами.

Запрос на бесплатную пробную версию Invicti (DAST) / Mend.io (SAST, SCA)

Подписаться на новости