Формат строки проблем


  Share  
|


Формат строки проблемы являются одной из немногих действительно новые нападения на поверхность в последние годы. Одно из первых упоминаний о форматирования строки ошибки была 23 июня 2000 года, в должность Ламагра Argamal (www.securityfocus.com/archive/1/66842); Паскаль Bouchareine более четко объяснил им почти месяц спустя (www.securityfocus . com/archive/1/70552). Предыдущий пост Марк Слемко (www.securityfocus.com/archive/1/10383) отметил основные проблемы, но упущенные возможности форматирования строки ошибки написать памяти.

Как и многие проблемы безопасности, причиной ошибки форматирования строки является доверие пользователей поставляется материалы без проверки. В C / C + +, форматирования строки ошибки может быть использован для записи произвольных местах памяти, и наиболее опасным аспектом является то, что это может произойти без повреждения соседних блоков памяти. Это мелкозернистых потенциал позволяет злоумышленнику обойти защиту стека, и даже изменять очень небольшой части памяти. Эта проблема может также возникать, когда формат строки читаются из ненадежного места атакующего контроля. Этот последний аспект проблемы, как правило, более распространенным по UNIX и Linux систем. На Windows системах, применение строки таблицы обычно хранятся в программе исполняемый, или ресурсов Динамические ссылки библиотек (DLLs). Если злоумышленник может переписать основные исполняемые или ресурсов DLLs, злоумышленник может выполнять гораздо больше, чем нападения простых форматирования строки ошибки.

Даже если дело не с C / C + +, форматирования строки нападения все еще может привести к существенным проблемам. Наиболее очевидным является то, что пользователи могут быть введены в заблуждение, но при определенных условиях, злоумышленник также может начать межсайтовый скриптинг SQL инъекции или атаки. Они могут использоваться для коррупции или трансформировать данные, а.

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

Наиболее сильное влияние языка C / C + +. Успешное нападение может привести сразу к исполнению произвольного кода и раскрытие информации. Другие языки, как правило, не позволяет выполнить произвольный код, но и другие виды нападений можно, как мы ранее записке. Perl непосредственно не подвержены спецификаторы, которую, вводимого пользователем, но он может быть уязвимым, если формат строки читаются в манипуляции с данными.

Грех пояснил

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

Разработка C / C + + делает это особенно опасно: C / C + + "ы дизайн затрудняет выявление проблем форматирования строки, и формат символов, некоторые особо опасных команд (в частности,% н), которые не существуют в некоторых других языки "Строка формата языках.

В C / C + +, функция может быть объявлена принимать переменная количество аргументов, указывая один многоточие (…), как в прошлом (или только) аргумент. Проблема в том, что функции вызова не имеет возможности знать, насколько много аргументов в настоящее время принят дюйма Наиболее распространенным набором функций принять разной длины - это аргументы printf семьи: printf, sprintf, snprintf, fprintf, vprintf и т.п. о. Широкий характер функций, которые выполняют ту же функцию имеют те же проблемы. Давайте взглянем на пример:

# включить <stdio.h>

int основных (int argc, символ * argv [])
(
если (argc> 1)
printf (argv [1]);

возвращение 0;
)

Достаточно простые вещи. Теперь давайте посмотрим что может пойти неправильно. В программист ожидает пользователя ввести что-то доброкачественных, таких, как Всемирный Здравствуйте. Если его попробовать, Вы получите Появление на свет. Теперь изменения входного немного - попробуйте х%% х В Windows XP с использованием системы по умолчанию в командной строке (cmd.exe), вы сейчас получаете следующее:

E: \ проекты \ 19_sins \ format_bug> format_bug.exe "% х% х"
12 ffc0 4011e5

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

Что случилось? В функции printf приняли ввода строки, приводившая к ожидать два аргумента в перемещается на стек перед вызовом функции. В% х спецификаторы возможность ознакомиться штабеля, четыре байта одновременно, насколько вы хотите. Не трудно себе представить, что если у вас более сложная функция, которая хранится секрет в стек переменная, то злоумышленник сможет прочитать секретный. Вывод здесь адрес стека месте (0x12ffc0) с указанием кодов, что основные функции () будет возвращаться в. Как вы понимаете, оба эти чрезвычайно важные сведения, которые просочилась к злоумышленнику.

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

неподписанные int байтов;
printf ( "% ы% н \ н", argv [1], и байт);
printf ( "Ваш вклад был% г символов \ н, байт");

Результатом будет:

E: \ проекты \ 19_sins \ format_bug> format_bug2.exe "Некоторые случайные материалы"

Некоторые случайные материалы

Ваш вклад был 17 символов

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

А сейчас давайте просто предположим, что если позволить атакующему контролировать форматирования строки в C / C + + программа, это вопрос времени, прежде чем понять, как сделать их запуска кода. Особенно nasty аспект такого типа нападения состоит в том, что до начала нападения, они могут зонд стека и исправить нападение на лету. По сути, впервые автор продемонстрировал это нападение общественности, он использовал другое командной строки переводчика, чем бы он используется для создания демонстраций, и оно не сработало. Благодаря уникальной гибкости этого нападения, можно было устранить проблему и использовать пример приложения с аудиторией наблюдает.

Большинство других языков не поддерживают эквивалент в% н формата указатель, и они непосредственно не легко уязвимы для выполнения поставленных атакующий код, но вы можете столкнуться с проблемами. Существуют другие, более сложные варианты этого нападения, других языках подвержены. Если атакующие могут задать формат строки для вывода их в файл или базу данных, они могут вызвать неправильную или вводящую в заблуждение бревна. Кроме того, применение чтение журналов может рассмотреть вопрос ввода доверять им, и как только это предположение нарушается, недостатки в том, что приложения синтаксического анализатора может привести к выполнению произвольного кода. В связи с этим проблема контроля вставлять символы, файлы - backspaces можно стирать вещи; Линия терминаторы могут obfuscate или даже устранить следы злоумышленника.

Это должно говорить, но если злоумышленник может указать формат строки подается к scanf или аналогичные функции, катастрофы на пути.

Грешное C / C + +

В отличие от многих других недостатков мы будем изучать, это достаточно легко выявить как код дефекта. Это очень просто:

printf (user_input);
неправ, и

printf ( "% ы", user_input);
является правильным.

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

fprintf (STDOUT, err_msg);
Нападавший затем только выработать вклад тем, что формат спецификаторы являются побег, и в большинстве случаев, это намного легче использовать вариант, поскольку err_msg буфера часто будут распределяться на стек. Когда нападавшие смогли пройти резервную стопку, они будут в состоянии контролировать местоположение, что написано с использованием вводимого пользователем.

Похожие Sins

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

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

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

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

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

В C / C + +, искать функции printf из семьи. Проблемы для поиска являются

  printf (user_input); 
fprintf (STDOUT, user_input);

Если вы видите, что функция выглядит так:

  fprintf (STDOUT, msg_format, arg1, arg2); 

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

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

Многие исходный код сканеры, даже лексические них, как РАТС и flawfinder, могут обнаружить это. Там даже PScan (www.striker.ottawa.on.ca/ ~ aland / pscan /), которые были разработаны специально для этого.

Есть также противодействия средств, которые могут быть встроены в процессе компиляции. Например, есть Криспин Коуэн в FormatGuard: http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html

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

Пароль спецификаторы форматирования в применении ли шестнадцатеричные значения будут возвращены. Например, если у вас есть приложение, которое ожидает имя файла и возвращает сообщение об ошибке ввода, когда файл не может быть найдена, то попробуйте описать это имена файлов, как NotLikely% х% x.txt. Если вы получили сообщение об ошибке следующего содержания: "NotLikely12fd234104587.txt не может быть найден", то вы только что обнаружили уязвимость форматирования строки.

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

Заметим, что если заявка веб и отзвуки вашего вклада на Вас другая забота будет межсайтовый скриптинг

Пример Sins

Следующие позиции в общей уязвимости и воздействия (CVE) по адресу http:// cve.mitre.org примеры SQL инъекции. Из этих 188 CVE позиции, что касается формата строки, это только несколько примеров.

CVE - 2000 - 0573

С CVE описание: "В lreply функция wu - ftpd 2.6.0 и ранее не очищает один ненадежные форматирования строки, что позволяет удаленному атакующему выполнить произвольные команды через САЙТА EXEC команду."

Это первый общеизвестным использовать для форматирования строки ошибка. Название этого BUGTRAQ должность подчеркивает серьезность проблемы: "Обеспечение дистанционного * * корневой по крайней мере с 1994."

CVE - 2000 - 0844

С CVE описание: "Некоторые функции, которые осуществляют региональные подсистемы по UNIX не очищает пользователя вводится формат строки, которая позволяет локальным злоумышленникам выполнить произвольный код с помощью таких функций, как gettext и catopen."

Полный текст первоначального консультативных можно найти на www.securityfocus.com/archive/1/80154, и эта проблема особенно интересно, поскольку оно затрагивает ядро системы API, для большинства вариантов UNIX (включая Linux), BSD, за исключением варианта из-за тот факт, что NLSPATH переменная игнорируется для привилегированных suid применения в BSD. Эта консультативная, как и многие CORE ИПД информации, особенно хорошо написана и информативным и дает очень тщательное объяснение общей проблемы

Выкуп Шаги

Первый шаг никогда не пройти, вводимого пользователем непосредственно на функции форматирования, а также не забудьте сделать это на каждом уровне обработки форматированный вывод. В качестве дополнительной записке, форматирования функции значительные накладные расходы. Посмотрите на источник _output если Вас это интересует - это может быть удобно писать:

  fprintf (STDOUT, buf); 

Предыдущие строки кода - это не просто опасно, но потребляет много дополнительных циклов процессора.

Вторым шагом является обеспечение того, что формат строки ваше приложение использует только прочитать доверять места, и что пути строк не может быть под контролем злоумышленника. Если вы написания кода для UNIX и Linux, следуя примеру из вариантов BSD и игнорируя NLSPATH переменных, которые могут быть использованы для указания файла используются для локальных сообщений, может обеспечить определенную защиту в глубину.

C / C + + выкупе

Существует не намного больше, чем это:

  printf ( "% ы", user_input); 
Дополнительные защитные меры

Проверьте и ограничить локаль для допустимых значений. (Дополнительную информацию см. Дэвид Уилер в "Написать Он безопасности: Форма Строки и Язык фильтрацию", перечисленных в "Другие ресурсы" раздела ниже). Не используйте printf - семейство функций, если можно избежать этого. Например, если вы используете C + +, использовать вместо потока операторов:

  # включить <iostream> 
//...
std:: Суд <<user_input
//...
Другие ресурсы
  • "Формат ошибок, в дополнение к wuftpd ошибка" на Ламагра Agramal: www.securityfocus.com/archive/1/66842

  • Написание безопасных кодекса, второе издание Майкл Ховард и Дэвид С. Леблан (Microsoft Press, 2002), глава 5 ", общественной Враг # 1: буфер Перерасход"

  • "UNIX локаль уязвимость форматирования строки, CORE ИПД" на Арсе Иван: www.securityfocus.com/archive/1/80154

  • "Строка формата Нападения" Тима Невшам: www.securityfocus.com/archive/ 1 / 81565

  • "Windows 2000 Строка формата Уязвимости" Дэвид Литчфилд: www.nextgenss.com/papers/win32format.doc

  • "Написать Он безопасности: Форма Строки и Язык фильтрацию" Дэвид A. Wheeler: www.dwheeler.com/essays/write_it_secure_1.html

это статья добавлена Хендра Fang

Share  

© 2005-2010 E-articles.info All Rights Reserved - Terms and conditions