В этой главе обсуждаются следующие темы:

• Уязвимость форматирующей строки

• Пример уязвимой программы

• Тестирование программ способом случайной форматирующей строки

• Программа атаки с использованием форматирующей строки

Резюме

Конспект

Часто задаваемые вопросы

Введение

В начале лета 2000 года специалистам в области защиты информации стало известно о новом типе уязвимости программного обеспечения. Речь идет о так называемых ошибках форматирующей строки. (Форматирующая строка - строка, используемая в операторах вывода, которая может содержать спецификации форматов и литералы.) Об ошибках форматирующей строки заговорили после 23 июня 2000 года, когда на Bugtraq была размещена программа, позволяющая атаковать FTP-демон Вашингтонского университета. При условии включения анонимного доступа к FTP, а по умолчанию в большинстве систем он включен, она позволяла удаленному злоумышленнику получить полный доступ к хостам с работающим FTP демоном Вашингтонского университета. Эта программа нанесла серьезный урон безопасности Интернет, потому что на тот момент времени FTP демон Вашингтонского университета широко использовался в сети.

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

Непосредственная передача входных данных программы функции printfQ или включение их в форматирующую строку функции printfQ приводит к ошибкам форматирующей строки. В случае с FTP демоном Вашингтонского университета функции printfQ передавался аргумент команды SITE ЕХЕС, который брался из входных данных программы демона.

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

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

Как упоминалось ранее, об уязвимости форматирующей строки стало известно в июне 2000 года. А атака на FTP-демон Вашингтонского университета была осуществлена злоумышленником, известным как tf8, 15 октября 1999 года. Если предположить что после этого преступникам стало известно, как ошибки форматирующей строки могут использоваться для проведения атак, то у них было более восьми месяцев для поиска и использования подобных ошибок в других программах. Эта догадка основана на предположении о том, что во время атаки на FTP-демон Вашингтонского университета впервые были использованы ошибки форматирующей строки. Хотя нет особых причин в это верить, поскольку комментарии в программе взлома не свидетельствуют о том, что их автор открыл какой-то новый способ атаки.

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

Что касается официальной классификации, ошибки форматирующей строки на самом деле нельзя выделить в отдельную категорию ошибок программного обеспечения, как, например, ошибка «состояние гонок» (race conditions) при конкуренции программ за ресурсы или переполнение буфера. Скорее, ошибки форматирующей строки относятся к категории ошибок проверки входных данных (input validation bugs). Основная причина их появления состоит в том, что программисты включают в форматирующую строку входные непроверенные данные программ.

Приоткрывая завесу

Сравнение ошибок форматирующей строки и переполнения буфера

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

В случае переполнения буфера отказ программного обеспечения наступает при выполнении таких ответственных операций, как, например, копирование памяти при условии, что размер входных данных не соответствует размеру принимающего буфера. Переполнение буфера часто происходит при копировании строк функциями языка С. В языке С строки являются массивами переменной длины с последним нулевым байтом. Функция копирования строки $&сру() библиотеки языка С ИЪс копирует байты из исходной строки в буфер до тех пор, пока в исходной строке не встретится нулевой байт. Если исходная строка, сформированная из входных данных программы, больше по размеру буфера, в который копируются данные, то функция $&сру() перезапишет данные смежных с буфером участков памяти. Программы переполнения буфера основаны на подмене критических данных на данные злоумышленника во время копирования строк.

Причина ошибок форматирующей строки состоит в том, что полученные извне данные включаются в форматирующую строку. Подобные ошибки можно рассматривать как сбой проверки входных данных. И по своей природе они не имеют ничего общего с ошибками определения размеров обрабатываемых данных. Злоумышленники используют ошибки форматирующей строки для записи нужных им данных в определенные области памяти. А при переполнении буфера атакующий лишен возможности выбора перезаписываемой области памяти. Другим источником путаницы является то, что использование функции $ргШ/() может привести как к переполнению буфера, так и к ошибкам форматирующей строки. Для того чтобы понять разницу между ними, нужно хорошо знать, что на самом деле делает функция $ргШ/(). Функция $ргШ/() позволяет программисту формировать строки с использованием стиля форматирования функции ргШ/() и записывать их в буфер памяти. Переполнение буфера возникает тогда, когда размер сформированной строки оказывается больше размера предназначенного для нее буфера. Часто это происходит при использовании спецификации вывода строки %о&, которая в формируемую строку вставляет строку переменной длины, завершающуюся нулевым байтом. Если переменная, соответствующая спецификации вывода строки %$, формируется из входных данных и ее размер не контролируется, то это может привести к переполнению буфера при записи в него отформатированной строки. Необходимо заметить, что возникшая из-за неправильного использования функции $ргШ/() ошибка форматирующей строки по своей сути ничем не отличается от других ошибок форматирующей строки, наступивших вследствие формирования строки из непроверенных входных данных программы.

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

Вложенный программный код полезной нагрузки | Защита от хакеров корпоративных сетей | Уязвимость форматирующей строки


Защита от хакеров корпоративных сетей



Новости за месяц

  • Июль
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс