Введение

Эксплойт компьютерной ошибки, вызванный недопустимыми данными

Внедрение кода — это эксплуатация компьютерной ошибки, вызванной обработкой недопустимых данных. Внедрение используется злоумышленником для введения (или "инъекции") кода в уязвимую компьютерную программу и изменения хода её выполнения. Результат успешного внедрения кода может быть катастрофическим, например, позволяя компьютерным вирусам или червям распространяться. Уязвимости внедрения кода возникают, когда приложение передает ненадежные данные интерпретатору. Наиболее часто уязвимости внедрения встречаются в SQL, LDAP, XPath, NoSQL запросах, командах операционной системы, XML-парсерах, SMTP-заголовках, аргументах программ и т. д. Уязвимости внедрения, как правило, легче обнаружить при анализе исходного кода, чем посредством тестирования. Сканеры и фаззеры могут помочь в обнаружении уязвимостей внедрения. Внедрение может привести к потере или повреждению данных, отсутствию отслеживаемости или отказу в доступе. В некоторых случаях внедрение может привести к полному захвату системы. Определенные типы внедрения кода являются ошибками интерпретации, придающими особый смысл пользовательскому вводу. Подобные ошибки интерпретации существуют и за пределами компьютерных наук, например, в комедийном скетче "Кто на первой базе?". В нем происходит путаница между именами собственными и обычными словами. Аналогично, в некоторых типах внедрения кода происходит путаница между пользовательским вводом и системными командами. Методы внедрения кода популярны при взломе или компрометации систем для получения информации, повышения привилегий или несанкционированного доступа к системе. Внедрение кода может использоваться злонамеренно для различных целей, в том числе:
Произвольное изменение значений в базе данных посредством SQL-инъекций. Это может привести к дефейсу веб-сайта или серьезному компрометированию конфиденциальных данных. Установка вредоносного ПО или выполнение злонамеренного кода на сервере путем внедрения серверных скриптов (например, PHP или ASP). Повышение привилегий до прав root путем эксплуатации уязвимостей внедрения команд в двоичном файле setuid root в UNIX или до прав Local System путем эксплуатации службы в Microsoft Windows. Атака на пользователей веб-сайтов с помощью инъекции HTML/скриптов (межсайтовый скриптинг). Атаки внедрения кода в Интернете вещей также могут привести к серьезным последствиям, таким как утечки данных и нарушение обслуживания. В 2008 году 5,66% всех зарегистрированных уязвимостей были классифицированы как внедрение кода, что является самым высоким показателем за всю историю наблюдений. В 2015 году этот показатель снизился до 0,77%.

Доброкачественное и непреднамеренное использование

Код инъекции может использоваться с благими намерениями; например, изменение или корректировка поведения программы или системы посредством инъекции кода может заставить систему вести себя определенным образом без каких-либо злонамеренных целей. Инъекция кода может, например:
Добавить полезный новый столбец, который изначально не был предусмотрен в дизайне страницы результатов поиска. Предоставить новый способ фильтрации, сортировки или группировки данных с использованием поля, не доступного в стандартных функциях исходного дизайна. В случае программ, таких как Dropbox, добавить специальные компоненты, которые можно использовать для подключения к онлайн-ресурсам в автономной программе. Использовать динамический компоновщик Linux для определения функции с тем же именем, что и определенные функции libc, связать эту функцию как библиотеку и переопределить использование функции libc. Некоторые пользователи могут непреднамеренно выполнить инъекцию кода, поскольку входные данные, которые они предоставляют программе, не были учтены разработчиками системы. Например:
Ввод, который пользователь может считать допустимым, может содержать специальные символы или строки, зарезервированные разработчиком для особых целей (например, символ "&" в имени "Shannon & Jason" или кавычки, как в "Bub 'Slugger' McCracken"). Пользователь может отправить в качестве входных данных поврежденный файл, который корректно обрабатывается одним приложением, но является вредоносным для принимающей системы. Другим безобидным применением инъекции кода может быть обнаружение уязвимостей к инъекциям с целью их устранения. Это известно как тест на проникновение "белой шляпы".

Инъекция шаблонов на стороне сервера

Моторы шаблонов часто используются в современных веб-приложениях для отображения динамических данных. Однако, доверие к непроверенным пользовательским данным часто может приводить к критическим уязвимостям, таким как инъекции шаблонов на стороне сервера (SSTI). Хотя эта уязвимость схожа с межсайтовым скриптингом (XSS), инъекция шаблонов может быть использована для выполнения кода на веб-сервере, а не в браузере посетителя. Она эксплуатирует распространенный процесс работы веб-приложений, которые часто используют пользовательский ввод и шаблоны для отрисовки веб-страницы. Приведенный ниже пример демонстрирует эту концепцию. Здесь переменная имени посетителя в шаблоне заменяется данными в процессе отрисовки. Привет, имя посетителя! Злоумышленник может использовать этот процесс для внедрения кода в конвейер отрисовки, предоставив вредоносное имя посетителя. В зависимости от реализации веб-приложения, он может выбрать внедрение `7*'7'`, которое отрисовщик может интерпретировать как `Hello 7777777`. Важно отметить, что в этом случае веб-сервер фактически выполнил вредоносный код и, следовательно, может быть уязвим для удаленного выполнения кода.

Инъекция объекта

PHP позволяет сериализацию и десериализацию целых объектов. Если ненадежные данные передаются в функцию десериализации, это может привести к перезаписи существующих классов в программе и выполнению вредоносных действий. Атака такого рода на Joomla была обнаружена в 2013 году.