Добро пожаловать обратно, мои начинающие кибервоины!
В мире кибербезопасности некоторые уязвимости сохраняются, несмотря на то, что известны уже десятилетиями. Уязвимости форматных строк относятся к числу таких проблем безопасности, которые продолжают преследовать программные системы. Несмотря на то, что уязвимости форматных строк существуют уже более двадцати лет, они по-прежнему ежегодно обнаруживаются в десятках реальных систем, что может привести к катастрофическим последствиям.
Уязвимость форматной строки возникает, когда злоумышленник может ввести текст, который впоследствии будет обработан программой иначе, чем изначально предполагалось. Эта уязвимость особенно распространена в программировании на C и C++, но может затронуть и другие языки, использующие аналогичные функции форматирования.
Строки форматирования — это особые типы строк, используемые функциями, такими как printf, для вывода форматированного текста. Неправильное использование этих функций может открыть путь для различных атак, от раскрытия информации до выполнения произвольного кода.
Функция форматирования
Это специальные типы функций ANSI C, принимающие переменное количество аргументов, один из которых называется строкой формата. К распространённым примерам относятся printf, fprintf, sprintf, snprintf и многие другие функции семейства printf. Среди других уязвимых функций — syslog, setproctitle и различные функции обработки ошибок.
Формат строки
Это строка, содержащая текст, смешанный с определителями формата. Это первый аргумент функции форматирования, определяющий форматирование выходных данных.
Параметры формата
Это специальные символы, которым предшествует символ %, определяющие способ вывода переменных. Некоторые распространённые параметры форматирования включают:
[td]Параметр[/td][td]Вход[/td][td]Выход[/td]
[td]%d[/td][td]Ценить[/td][td]Число[/td]
[td]%u[/td][td]Ценить[/td][td]Беззнаковое число[/td]
[td]%x[/td][td]Ценить[/td][td]Число в шестнадцатеричном формате[/td]
[td]%с[/td][td]Указатель[/td][td]Нить[/td]
[td]%n[/td][td]Указатель[/td][td]Количество уже записанных байтов[/td]Параметр %n особенно опасен, поскольку он записывает данные в переменную, а не считывает их.
Код безопасности:
kali > cat good.c
#include <stdio.h>
int main(int argc, char* argv[]){
char* var = argv[1];
printf("Имя: %s\n", var);
вернуть 0;
}
кали > ./хороший Джон
Имя: Джон
кали > ./хорошо %x
Имя: %x
Уязвимый код:
kali > cat bad.c
#include <stdio.h>
int main(int argc, char* argv[]){
char* var = argv[1];
printf("Имя: ");
printf(var); //уязвимость!
printf("\n");
вернуть 0;
}
кали > ./плохой Джон
Имя: Джон
кали > ./плохой %d
Имя: 32
Обратите внимание, как в уязвимом коде при вводе %d функция интерпретирует его как спецификатор формата и выводит значение из стека. В этом и заключается суть уязвимости строки формата.
кали > ./плохой %s%s%s%s%s%s%s
Это происходит потому, что параметр %s ожидает указатель на строку, и когда соответствующих аргументов нет, он считывает данные из произвольных областей памяти, которые могут быть недопустимыми.
кали > ./плохой %08x.%08x.%08x.%08x
Это открывает четыре значения из стека в шестнадцатеричном формате, потенциально раскрывая конфиденциальную информацию.
Понимая, как работают уязвимости форматной строки, вы сможете эффективно защищать системы от этих постоянных и опасных уязвимостей безопасности или использовать их в своих интересах.
В мире кибербезопасности некоторые уязвимости сохраняются, несмотря на то, что известны уже десятилетиями. Уязвимости форматных строк относятся к числу таких проблем безопасности, которые продолжают преследовать программные системы. Несмотря на то, что уязвимости форматных строк существуют уже более двадцати лет, они по-прежнему ежегодно обнаруживаются в десятках реальных систем, что может привести к катастрофическим последствиям.
Уязвимость форматной строки возникает, когда злоумышленник может ввести текст, который впоследствии будет обработан программой иначе, чем изначально предполагалось. Эта уязвимость особенно распространена в программировании на C и C++, но может затронуть и другие языки, использующие аналогичные функции форматирования.
Строки форматирования — это особые типы строк, используемые функциями, такими как printf, для вывода форматированного текста. Неправильное использование этих функций может открыть путь для различных атак, от раскрытия информации до выполнения произвольного кода.
Основы форматирования строк
Строки формата состоят из трех основных компонентов, которые нам необходимо понять:Функция форматирования
Это специальные типы функций ANSI C, принимающие переменное количество аргументов, один из которых называется строкой формата. К распространённым примерам относятся printf, fprintf, sprintf, snprintf и многие другие функции семейства printf. Среди других уязвимых функций — syslog, setproctitle и различные функции обработки ошибок.
Формат строки
Это строка, содержащая текст, смешанный с определителями формата. Это первый аргумент функции форматирования, определяющий форматирование выходных данных.
Параметры формата
Это специальные символы, которым предшествует символ %, определяющие способ вывода переменных. Некоторые распространённые параметры форматирования включают:
Шаг №1 : Понимание уязвимости
Уязвимость возникает, когда пользовательский ввод напрямую передаётся в качестве строки форматирования в функцию форматирования. Давайте рассмотрим два примера кода, чтобы понять разницу между безопасным и уязвимым кодом:Код безопасности:
kali > cat good.c
#include <stdio.h>
int main(int argc, char* argv[]){
char* var = argv[1];
printf("Имя: %s\n", var);
вернуть 0;
}
кали > ./хороший Джон
Имя: Джон
кали > ./хорошо %x
Имя: %x
kali > cat bad.c
#include <stdio.h>
int main(int argc, char* argv[]){
char* var = argv[1];
printf("Имя: ");
printf(var); //уязвимость!
printf("\n");
вернуть 0;
}
кали > ./плохой Джон
Имя: Джон
кали > ./плохой %d
Имя: 32
Шаг №2: Использование уязвимости
Уязвимости форматных строк могут эксплуатироваться несколькими способами. Рассмотрим наиболее распространённые векторы атак:Сбой программы
Самая простая атака — вызвать ошибку сегментации, указав спецификаторы формата, которые пытаются получить доступ к недействительным адресам памяти:кали > ./плохой %s%s%s%s%s%s%s
Чтение данных из стека
Злоумышленник может использовать спецификаторы формата для чтения значений из стека:кали > ./плохой %08x.%08x.%08x.%08x
Краткое содержание
Уязвимости форматных строк представляют собой серьёзную угрозу безопасности, сохраняющуюся уже несколько десятилетий. Несмотря на то, что они хорошо изучены, они продолжают проявляться в реальных системах, потенциально приводя к раскрытию информации, повреждению памяти и даже выполнению произвольного кода.Понимая, как работают уязвимости форматной строки, вы сможете эффективно защищать системы от этих постоянных и опасных уязвимостей безопасности или использовать их в своих интересах.