Введение
Эксплойт компьютерной ошибки, вызванный недопустимыми данными
Внедрение кода — это эксплуатация компьютерной ошибки, вызванной обработкой недопустимых данных. Внедрение используется злоумышленником для введения (или "инъекции") кода в уязвимую компьютерную программу и изменения хода её выполнения. Результат успешного внедрения кода может быть катастрофическим, например, позволяя компьютерным вирусам или червям распространяться. Уязвимости внедрения кода возникают, когда приложение передает ненадежные данные интерпретатору. Наиболее часто уязвимости внедрения встречаются в SQL, LDAP, XPath, NoSQL запросах, командах операционной системы, XML-парсерах, SMTP-заголовках, аргументах программ и т. д. Уязвимости внедрения, как правило, легче обнаружить при анализе исходного кода, чем посредством тестирования. Сканеры и фаззеры могут помочь в обнаружении уязвимостей внедрения. Внедрение может привести к потере или повреждению данных, отсутствию отслеживаемости или отказу в доступе. В некоторых случаях внедрение может привести к полному захвату системы. Определенные типы внедрения кода являются ошибками интерпретации, придающими особый смысл пользовательскому вводу. Подобные ошибки интерпретации существуют и за пределами компьютерных наук, например, в комедийном скетче "Кто на первой базе?". В нем происходит путаница между именами собственными и обычными словами. Аналогично, в некоторых типах внедрения кода происходит путаница между пользовательским вводом и системными командами. Методы внедрения кода популярны при взломе или компрометации систем для получения информации, повышения привилегий или несанкционированного доступа к системе. Внедрение кода может использоваться злонамеренно для различных целей, в том числе:
Произвольное изменение значений в базе данных посредством SQL-инъекций. Это может привести к дефейсу веб-сайта или серьезному компрометированию конфиденциальных данных. Установка вредоносного ПО или выполнение злонамеренного кода на сервере путем внедрения серверных скриптов (например, PHP или ASP). Повышение привилегий до прав root путем эксплуатации уязвимостей внедрения команд в двоичном файле setuid root в UNIX или до прав Local System путем эксплуатации службы в Microsoft Windows. Атака на пользователей веб-сайтов с помощью инъекции HTML/скриптов (межсайтовый скриптинг). Атаки внедрения кода в Интернете вещей также могут привести к серьезным последствиям, таким как утечки данных и нарушение обслуживания. В 2008 году 5,66% всех зарегистрированных уязвимостей были классифицированы как внедрение кода, что является самым высоким показателем за всю историю наблюдений. В 2015 году этот показатель снизился до 0,77%.
Arbitrarily modifying values in a database through SQL injection. The impact of this can range from website defacement to serious compromise of sensitive data. Installing malware or executing malevolent code on a server by injecting server scripting code (such as PHP or ASP). Privilege escalation to root permissions by exploiting shell injection vulnerabilities in a setuid root binary on UNIX, or Local System by exploiting a service on Microsoft Windows. Attacking web users with HTML/script injection (Cross site scripting). Code injection attacks in Internet of Things could also lead to severe consequences like data breaches and service disruption. In 2008, 5.66% of all vulnerabilities reported that year were classified as code injection, the highest year on record. In 2015, this had decreased to 0.77%.
Доброкачественное и непреднамеренное использование
Код инъекции может использоваться с благими намерениями; например, изменение или корректировка поведения программы или системы посредством инъекции кода может заставить систему вести себя определенным образом без каких-либо злонамеренных целей. Инъекция кода может, например:
Добавить полезный новый столбец, который изначально не был предусмотрен в дизайне страницы результатов поиска. Предоставить новый способ фильтрации, сортировки или группировки данных с использованием поля, не доступного в стандартных функциях исходного дизайна. В случае программ, таких как Dropbox, добавить специальные компоненты, которые можно использовать для подключения к онлайн-ресурсам в автономной программе. Использовать динамический компоновщик Linux для определения функции с тем же именем, что и определенные функции libc, связать эту функцию как библиотеку и переопределить использование функции libc. Некоторые пользователи могут непреднамеренно выполнить инъекцию кода, поскольку входные данные, которые они предоставляют программе, не были учтены разработчиками системы. Например:
Ввод, который пользователь может считать допустимым, может содержать специальные символы или строки, зарезервированные разработчиком для особых целей (например, символ "&" в имени "Shannon & Jason" или кавычки, как в "Bub 'Slugger' McCracken"). Пользователь может отправить в качестве входных данных поврежденный файл, который корректно обрабатывается одним приложением, но является вредоносным для принимающей системы. Другим безобидным применением инъекции кода может быть обнаружение уязвимостей к инъекциям с целью их устранения. Это известно как тест на проникновение "белой шляпы".
Introduce a useful new column that did not appear in the original design of a search results page. Offer a new way to filter, order, or group data by using a field not exposed in the default functions of the original design. As regards programs like Dropbox, add special parts that could be used to connect to online resources in an offline program. Utilize the Linux Dynamic Linker to define a function with the same name as certain libc functions, link that function as a library, and override the use of the libc function. Some users may unsuspectingly perform code injection because input they provide to a program was not considered by those who originally developed the system. For example:
What the user may consider a valid input may contain token characters or character strings that have been reserved by the developer to have special meaning (perhaps the "&" in "Shannon & Jason," or quotation marks as in "Bub 'Slugger' McCracken"). The user may submit a malformed file as input that is handled gracefully in one application, but is toxic to the receiving system. Another benign use of code injection could be the discovery of injection flaws themselves, with the intention of fixing these flaws. This is known as a white hat penetration test.
Инъекция шаблонов на стороне сервера
Моторы шаблонов часто используются в современных веб-приложениях для отображения динамических данных. Однако, доверие к непроверенным пользовательским данным часто может приводить к критическим уязвимостям, таким как инъекции шаблонов на стороне сервера (SSTI). Хотя эта уязвимость схожа с межсайтовым скриптингом (XSS), инъекция шаблонов может быть использована для выполнения кода на веб-сервере, а не в браузере посетителя. Она эксплуатирует распространенный процесс работы веб-приложений, которые часто используют пользовательский ввод и шаблоны для отрисовки веб-страницы. Приведенный ниже пример демонстрирует эту концепцию. Здесь переменная имени посетителя в шаблоне заменяется данными в процессе отрисовки. Привет, имя посетителя! Злоумышленник может использовать этот процесс для внедрения кода в конвейер отрисовки, предоставив вредоносное имя посетителя. В зависимости от реализации веб-приложения, он может выбрать внедрение `7*'7'`, которое отрисовщик может интерпретировать как `Hello 7777777`. Важно отметить, что в этом случае веб-сервер фактически выполнил вредоносный код и, следовательно, может быть уязвим для удаленного выполнения кода.
Инъекция объекта
PHP позволяет сериализацию и десериализацию целых объектов. Если ненадежные данные передаются в функцию десериализации, это может привести к перезаписи существующих классов в программе и выполнению вредоносных действий. Атака такого рода на Joomla была обнаружена в 2013 году.