Чтение онлайн

на главную

Жанры

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

авторов Коллектив

Шрифт:

На локальной машине злоумышленник, воспользовавшись уязвимостью форматирующей строки в утилите Screen, может повысить свои права доступа до уровня прав суперпользователя. Рассмотренная уязвимость утилиты Screen является хорошим примером использования злоумышленниками ошибок форматирующей строки для тривиального осуществления своих замыслов. Описанный способ применим для большинства известных платформ.

Способ многократной записи. Этот способ заключается в перезаписи сразу нескольких участков памяти. Он сложнее метода однократной записи, но зато дает лучшие результаты. Используя уязвимость форматирующей строки, злоумышленник часто имеет возможность заменить почти любое значение в памяти на значение, нужное ему. Для понимания способа многократной записи важно знать, как работает спецификация преобразования %n и что происходит во время записи.

Кратко

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

Принципы работы программ атаки, использующих ошибки форматирующих строк

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

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

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

Злоумышленник всегда сможет определить, откуда из стека функция printf считывает свой параметр, соответствующий спецификации преобразования %n. Используя такие спецификации формата, как, например, %x или %p, он может воспользоваться функцией printf для перемещения по стеку до адреса, помещенного злоумышленником в стек. Предполагая, что при записи в стек данные пользователя не обрезались, злоумышленник с помощью функции printf сможет считывать данные из стека до тех пор, пока не доберется до нужного ему адреса в стеке. После этого останется только разместить в форматирующей строке спецификацию преобразования %n для записи данных по адресу, заданному злоумышленником.

...

Примечание

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

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

Например, если злоумышленник захочет использовать адрес из стека, хранящийся в 32 байтах от первого параметра функции printf, то он должен определить в своей форматирующей строке 8 спецификаций преобразования %x. Спецификация преобразования %x – это спецификация вывода шестнадцатеричного целого числа без знака длиной в слово. На 32-разрядной платформе Intel длина слова равна 4 байтам. Каждый раз, встречая в форматирующей строке спецификацию преобразования %x, функция printf считывает из стека очередные четыре байта, в которых хранится переменная, соответствующая найденной спецификации. Кроме рассмотренной, для чтения данных из стека можно воспользоваться и другими спецификациями преобразования, а для записи данных в нужную область памяти существует спецификация преобразования %n.

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

Построение величин

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

int main

{

// test.c

printf(“start: %10i end\n”,10);

}

В предыдущем примере форматирующая строка содержит спецификацию преобразования %10i — спецификацию вывода десятичного числа со знаком с заданной шириной поля, равной 10. Ширина поля указывает функции printf использовать для вывода целого числа со знаком поле в отформатированной строке, достаточное для печати не менее 10 символов.

[dma@victim server]$ ./test start: 10 end

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

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

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

На некоторых платформах, например платформах с архитектурой RISK (архитектура RISK (Reduced Instruction Set Computer) – архитектура с сокращенным набором команд. Тип архитектуры микропроцессора, ориентированный на быстрое и эффективное выполнение относительно небольшого набора встроенных команд), запрещено при записи использовать адрес, не выровненный на границу двух байт. Во многих случаях это ограничение удается снять, используя запись коротких целых чисел при помощи спецификации преобразования %hn.

Рис. 9.1. Получение адреса с помощью четырех операций записи

Поделиться:
Популярные книги

Кодекс Крови. Книга VIII

Борзых М.
8. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VIII

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Партиец

Семин Никита
2. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Партиец

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Бестужев. Служба Государевой Безопасности

Измайлов Сергей
1. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности

Хозяйка брачного агентства или Попаданка в поисках любви

Максонова Мария
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка брачного агентства или Попаданка в поисках любви

Возрождение Феникса. Том 1

Володин Григорий Григорьевич
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Возрождение Феникса. Том 1

Релокант. Вестник

Ascold Flow
2. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. Вестник

Книга пяти колец. Том 3

Зайцев Константин
3. Книга пяти колец
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Книга пяти колец. Том 3

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Неудержимый. Книга XIX

Боярский Андрей
19. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIX