- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Защита от хакеров корпоративных сетей - Коллектив авторов
Шрифт:
Интервал:
Закладка:
Далее этот способ атаки рассматриваться не будет. Хотя подобные атаки, используя спецификации формата, позволяют перезаписать содержимое памяти, тем не менее они используются только для увеличения размера строк до длины, достаточной для переполнения стека. А эта глава посвящена атакам, основанным исключительно на применении спецификаций формата без использования уязвимостей, основанных на ошибках программирования, например таких как переполнение буфера. Более того, описанная ситуация может быть вызвана присущими форматирующей строке уязвимостями при использовании спецификаций записи в память.
Отказ в обслуживании
Простейший способ воспользоваться уязвимостью форматирующей строки – добиться отказа в обслуживании в результате аварийного завершения атакованной программы. Аварийно завершить программу легко, если использовать для этого спецификации формата.
Для некоторых спецификаций преобразования требуется задать указатели на правильные адреса памяти. Одной из них является спецификация преобразования %n, которая чуть позже будет детально рассмотрена. Другая – спецификация вывода строки %s, для правильной работы которой нужен указатель на строку, завершающуюся нулевым байтом. Если злоумышленник воспользуется форматирующей строкой с одной из рассмотренных спецификаций преобразования, но указанные адреса памяти окажутся недействительными, то программа аварийно завершится при попытке разыменования указателя. Это зачастую приводит к отказу в обслуживании, не требуя применения каких-либо сложных методов.
Было известно немного проблем с использованием форматирующей строки до тех пор, пока кто-то не понял, как с помощью форматирующих строк можно проводить атаки. Например, было известно, что клиент BitchX IRC может аварийно завершиться при передаче ему строки %s%s%s%s в качестве одного из параметров команды IRC (Internet Relay Chat – Интернетовские посиделки). (IRC – глобальная система, посредством которой пользователи могут общаться друг с другом в реальном масштабе времени.) Но насколько известно, никто не догадывался, что эту идею можно использовать для взлома, пока не стало известно об атаке на FTP-демон Вашингтонского университета.
На самом деле в применении форматирующей строки для аварийного завершения программы нет ничего особенного. Используя уязвимости форматирующей строки, можно реализовать гораздо более интересные и полезные вещи.
Чтение памяти
Если результат работы функции, использующей форматирующую строку, общедоступен, то злоумышленник может воспользоваться уязвимостью форматирующей строки для чтения памяти программы. Это является серьезной проблемой и может привести к раскрытию важной информации. Например, если программа получает от клиентов данные аутентификации и сразу же после получения не уничтожает их, то для ознакомления с ними можно воспользоваться уязвимостью форматирующей строки. Для злоумышленника наиболее простой способ прочесть содержимое памяти, воспользовавшись уязвимостью форматирующей строки, заключается в использовании переменных памяти. Переменные памяти – это переменные, которым присвоены адреса интересующих злоумышленника областей памяти и которые соответствуют заданным им спецификациям формата. Функция семейства printf, обрабатывая переданную ей форматирующую строку и обнаружив в ней очередную спецификацию преобразования, читает из стека значение следующей переменной. Например, для каждой спецификации вывода шестнадцатеричного целого числа без знака %x можно извлечь из памяти одно четырехбайтовое слово. Недостатком данного способа является то, что могут быть извлечены только данные из стека.
Но, используя спецификацию вывода строки %s, злоумышленник сможет прочитать данные из произвольной области памяти. Как уже говорилось ранее, спецификации формата %s соответствует строка, оканчивающаяся нулевым байтом. Эта строка передается функции по ссылке. Злоумышленник может прочитать содержимое любых участков памяти, добавляя в форматирующую строку спецификации вывода строки %s и указывая соответствующие им указатели на интересующие его участки памяти. Адрес начала интересующей злоумышленника области данных должен быть помещен в стек в том же формате, что и адрес памяти, соответствующей спецификации преобразования %n. При наличии в форматирующей строке спецификации вывода строки %s будет выведено содержимое области памяти, адрес начала которой указан злоумышленником, а адрес конца определяется по первому нулевому байту, встретившемуся при выводе.
Для злоумышленника возможность читать содержимое памяти очень полезна и может использоваться в сочетании с другими способами атак. В конце главы об этом как рассказано, так и показано на примере программы атаки с использованием ошибок форматирующей строки.
Запись в память
В предыдущих разделах уже затрагивалась спецификация формата %n. Эта некогда малопонятная спецификация позволяет определить текущий размер формируемой строки. Значением переменной, соответствующей спецификации преобразования %n, является адрес памяти. Если во время выполнения функции printf() в форматирующей строке встречается спецификация преобразования %n, то в память по адресу, указанному этой переменной, записывается количество символов сформированной строки в формате целого числа.
Существование подобной спецификации преобразования имеет большое значение с точки зрения безопасности, поскольку с ее помощью можно осуществлять запись в память. А это, в свою очередь, является ключом к использованию уязвимости форматирующей строки для достижения таких целей, как, например, выполнение управляющего программного кода.
Способ однократной записи. Обсуждаемый способ позволяет увеличить права доступа, используя форматирующую строку с единственной спецификацией преобразования %n.
В некоторых программах такие критические значения, как идентификатор пользователя или идентификатор группы, хранятся в памяти программы для реализации механизма понижения прав. Злоумышленник может воспользоваться уязвимостью форматирующей строки для перезаписи этих значений.
Утилита Screen является примером программы, которая может быть атакована таким образом. Эта популярная утилита в системе UNIX позволяет многочисленным процессам использовать один и тот же псевдотерминал. При установленных правах суперпользователя утилита сохраняет права доступа вызвавшего ее пользователя в памяти. При создании окна родительский процесс утилиты Screen понижает права доступа процессов потомков до значения прав, сохраненных в памяти, например до уровня прав оболочки пользовательского интерфейса и т. д.
В версиях утилиты Screen до 3.9.5 включительно содержится уязвимость форматирующей строки, которая проявляется при выводе строки визуализации звукового сигнала (visual bell). Эта строка определяется данными файла конфигурации пользователя с расширением . screenrc. Строка визуализации звукового сигнала выводится на терминал пользователя и интерпретирует символ звукового сигнала в кодировке ASCII. При выводе на терминал определяемые пользователем данные из конфигурационного файла передаются функции printf() как часть форматирующей строки – первого параметра функции.
Благодаря алгоритму работы утилиты Screen злоумышленник может воспользоваться обсуждаемой уязвимостью форматирующей строки при помощи способа однократной записи по спецификации преобразования %n. Для атаки ему не потребуется ни управляющего кода, ни задания адресов памяти. В основе идеи использования уязвимости форматирующей строки лежит подмена сохраненного идентификатора пользователя userid на другой, выбранный злоумышленником, например 0 – идентификатор суперпользователя.
Для того чтобы воспользоваться уязвимостью форматирующей строки, злоумышленник должен сделать следующее. Во-первых, присвоить одному из параметров небезопасной функции printf() адрес области сохранения идентификатора пользователя в памяти. Во-вторых, создать форматирующую строку со спецификацией преобразования %n, которая соответствует параметру, передающему адрес области сохранения идентификатора пользователя. Выбрав правильное смещение от начала области сохранения идентификатора пользователя, для обнуления идентификатора пользователя злоумышленнику достаточно записать старшие разряды величины, соответствующей спецификации %n. В результате идентификатор пользователя будет заменен идентификатором суперпользователя. Теперь, когда атакующий создаст новое окно, родительский процесс утилиты Screen, прочитав из памяти нулевое значение, установит права доступа процессам потомкам равными правам суперпользователя.