Внедрение кода (code injection) — класс атак, при которых злоумышленник передаёт входные данные, ошибочно исполняемые приложением как программный код.
Как работает внедрение кода
Корень проблемы — смешивание данных и кода. Если приложение собирает код из пользовательского ввода — например, передаёт его в функцию eval() в PHP, JavaScript или Python или вставляет в шаблон, — атакующий может добавить собственные инструкции. Слабость описана как CWE-94. Родственные варианты:
- Внедрение команд ОС (CWE-78) — ввод попадает в команду системной оболочки.
- Инъекция в серверные шаблоны (SSTI) — ввод исполняется шаблонизаторами вроде Jinja2 или Twig.
- Инъекция в языки выражений — например, OGNL-инъекция в Apache Struts, из-за которой в 2017 году взломали Equifax.
- SQL-инъекция и межсайтовый скриптинг, где внедряется запрос к базе данных или скрипт для браузера.
Ошибка Shellshock в Bash (2014) показала масштаб проблемы: специально сформированные переменные окружения заставляли Bash выполнять команды на веб-серверах, роутерах и других устройствах.
Почему это важно
Успешное внедрение кода обычно означает удалённое выполнение кода с правами приложения: кражу данных, веб-шеллы, майнеры или плацдарм для шифровальщика. Инъекции входят в OWASP Top 10 с первого издания и остаются любимой целью автоматических сканеров. Близкий родственник — небезопасная десериализация, которая тоже превращает данные в исполняемый код.
Как предотвратить
- Никогда не передавать пользовательский ввод в функции типа eval и в оболочку; использовать безопасные API и параметризованные запросы.
- Проверять ввод по строгим белым спискам и экранировать вывод с учётом контекста.
- Запускать приложения с минимальными правами и изолировать шаблонизаторы.
- Использовать статический анализ и тестирование безопасности, чтобы находить точки внедрения заранее.