Jump to content

Строка неконтролируемого формата

Строка неконтролируемого формата — это тип внедрения кода уязвимости , обнаруженной примерно в 1989 году и которую можно использовать для эксплойтов безопасности . [1] Первоначально считавшиеся безобидными, эксплойты форматной строки могут использоваться для сбоя программы или выполнения вредоносного кода. Проблема возникает из-за использования непроверяемого пользовательского ввода в качестве параметра строки формата в некоторых функциях C , выполняющих форматирование, таких как printf(). Злоумышленник может использовать %s и %x форматировать токены, среди прочего, для печати данных из стека вызовов или, возможно, из других мест в памяти. Можно также записать произвольные данные в произвольные места, используя %n токен формата, который командует printf() и подобные функции для записи количества байтов, отформатированных по адресу, хранящемуся в стеке.

Подробности

[ редактировать ]

Типичный эксплойт использует комбинацию этих методов для получения контроля над указателем инструкции (IP) процесса. [2] например, заставив программу перезаписать адрес библиотечной функции или адрес возврата в стеке указателем на какой-то вредоносный шеллкод . Параметры заполнения для спецификаторов формата используются для управления количеством выводимых байтов и %x токен используется для извлечения байтов из стека до тех пор, пока не будет достигнуто начало самой строки формата. Начало строки формата создается так, чтобы содержать адрес, который %n токен формата может затем перезаписаться адресом вредоносного кода для выполнения.

Это распространенная уязвимость, поскольку ранее ошибки формата считались безобидными и приводили к уязвимостям во многих распространенных инструментах. MITRE По состоянию на июнь 2007 года в проекте CVE насчитывается около 500 уязвимых программ, а анализ тенденций ставит его на 9-е место по количеству зарегистрированных типов уязвимостей в период с 2001 по 2006 год. [3]

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

Ошибки формата возникают из-за того, что соглашения о передаче аргументов в C не являются типобезопасными . В частности, varargs механизм позволяет функциям принимать любое количество аргументов (например, printf столько аргументов ), «извлекая» из стека вызовов , сколько пожелает, полагая, что ранние аргументы указывают, сколько дополнительных аргументов и каких типов необходимо извлечь.

Ошибки форматной строки могут возникать и в других языках программирования, помимо C, таких как Perl, хотя они появляются реже и обычно не могут быть использованы для выполнения кода по выбору злоумышленника. [4]

Ошибки формата были впервые отмечены в 1989 году в ходе нечеткого тестирования , проведенного в Университете Висконсина, в результате которого был обнаружен «эффект взаимодействия» в оболочке C (csh) между ее механизмом истории команд и процедурой обработки ошибок, которая предполагала безопасный ввод строки. [5]

Использование ошибок форматной строки в качестве атаки было обнаружено в сентябре 1999 года Тиммом Твиллманом во время аудита безопасности демона ProFTPD вектора . [6] В ходе проверки была выявлена snprintf которые напрямую передавали сгенерированные пользователем данные без строки формата. Обширные тесты с надуманными аргументами для функций в стиле printf показали, что использование этого для повышения привилегий возможно. появилось первое сообщение Это привело к тому, что в сентябре 1999 года в списке рассылки Bugtraq об этом классе уязвимостей, включая базовый эксплойт. [6] Однако прошло еще несколько месяцев, прежде чем сообщество безопасности осознало всю опасность уязвимостей форматной строки, поскольку начали появляться эксплойты для другого программного обеспечения, использующего этот метод. Первые эксплойты, которые привлекли внимание общественности к этой проблеме (путем предоставления удаленного root-доступа посредством выполнения кода), были одновременно опубликованы в списке Bugtraq в июне 2000 года Пшемыславом Фрасунеком. [7] и человек под ником tf8 . [8] Вскоре за ними последовало объяснение, опубликованное человеком под ником Lamagra . [9] «Ошибки формата» были опубликованы в списке Bugtraq Паскалем Бушареном в июле 2000 года. [10] Основополагающая статья «Атака на строку формата» [11] Тимом Ньюшамом, был опубликован в сентябре 2000 года, а другие подробные технические пояснения были опубликованы в сентябре 2001 года, например, «Использование уязвимостей форматных строк » ​​команды Teso . [2]

Предотвращение в компиляторах

[ редактировать ]

Многие компиляторы могут статически проверять строки формата и выдавать предупреждения об опасных или подозрительных форматах. В коллекции компиляторов GNU соответствующими флагами компилятора являются: -Wall, -Wformat, -Wno-format-extra-args, -Wformat-security, -Wformat-nonliteral, и -Wformat=2. [12]

Большинство из них полезны только для обнаружения строк неправильного формата, известных во время компиляции. Если строка формата может исходить от пользователя или из источника, внешнего по отношению к приложению, приложение должно проверить строку формата перед ее использованием. Также необходимо соблюдать осторожность, если приложение генерирует или выбирает строки формата на лету. Если используется библиотека GNU C, -D_FORTIFY_SOURCE=2 Параметр можно использовать для обнаружения определенных типов атак, происходящих во время выполнения. -Wformat-nonliteral проверка более строгая.

Обнаружение

[ редактировать ]

В отличие от многих других проблем безопасности, основную причину уязвимостей форматной строки относительно легко обнаружить в исполняемых файлах, скомпилированных под x86: printf-семейства функций, правильное использование подразумевает отдельный аргумент для строки формата и аргументов, подлежащих форматированию. Неправильное использование таких функций можно обнаружить, просто подсчитав количество аргументов, переданных функции; «недостаток аргументов» [2] тогда это сильный индикатор того, что функция использовалась неправильно.

Обнаружение в двоичных файлах, скомпилированных x86.

[ редактировать ]

Подсчет количества аргументов в x86 часто упрощается благодаря соглашению о вызовах, согласно которому вызывающая сторона удаляет аргументы, помещенные в стек, путем добавления к указателю стека после вызова, поэтому простое изучение исправления стека дает число аргументы, переданные printf- семейная функция». [2]

См. также

[ редактировать ]
  1. ^ «CWE-134: строка неконтролируемого формата» . Перечень распространенных слабостей . МИТРА . 13 декабря 2010 г. Проверено 5 марта 2011 г.
  2. ^ Перейти обратно: а б с д «Использование уязвимостей форматной строки» (PDF) . julianor.tripod.com . 01 сентября 2001 г.
  3. ^ Bugtraq: уязвимости форматной строки в программах Perl
  4. ^ Миллер, Бартон П.; Фредриксен, Ларс; Итак, Брайан (декабрь 1990 г.) [1989]. «Эмпирическое исследование надежности утилит UNIX» (PDF) . Коммуникации АКМ . 33 (12): 32–44. дои : 10.1145/96267.96279 . S2CID   14313707 . Архивировано из оригинала (PDF) 7 февраля 2018 г. Проверено 11 октября 2021 г.
  5. ^ Перейти обратно: а б Ошибка: эксплойт для proftpd 1.2.0pre6
  6. ^ «Эксплойт удаленного root-доступа WUFTPD 2.6.0» - MARC , июнь 2000 г., Пшемыслав Фрасунек
  7. ^ «WuFTPD: предоставление *удаленного* root-доступа как минимум с 1994 года» - MARC от tf8
  8. ^ Bugtraq: ошибки формата, в дополнение к ошибке wuftpd, июнь 2000 г., автор Lamagra Argamal.
  9. ^ Bugtraq: Ошибки формата Ошибки формата , июль 2000 г., Паскаль Бушарейн
  10. ^ Bugtraq: атаки на строку формата , Тим Ньюшам , сентябрь 2000 г.
  11. ^ Варианты предупреждений — использование коллекции компиляторов GNU (GCC)

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a8ade2f9432723fcb39c68b6f7356c12__1712144400
URL1:https://arc.ask3.ru/arc/aa/a8/12/a8ade2f9432723fcb39c68b6f7356c12.html
Заголовок, (Title) документа по адресу, URL1:
Uncontrolled format string - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)