Читаем Защита от хакеров корпоративных сетей полностью

При вызове функции print_error ей передается параметр argv[i], который является не чем иным, как форматирующей строкой. В конечном счете эта форматирующая строка будет передана функции vprintf для обработки, как об этом уже предварительно говорилось. Средствам контроля исходного текста программ это место должно показаться очень подозрительным и подходящим для организации атаки. Для безопасной передачи параметров следовало бы вызвать функцию print_error следующим способом:

print_error(INVALID_AUTH_AREA, «%s», argv[i]);

При этом способе вызова i-й аргумент программы argv[i] передается функции print_error как переменная, соответствующая спецификации преобразования %s. При этом исключается всякая возможность передачи функции print_error злонамеренной спецификации преобразования, которая могла бы непредусмотренным образом обработаться функцией vprintf, вызванной print_error. Строка argv[i] — это не что иное, как аргумент команды – soa, передаваемой клиентом серверу.

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

1. Сервер получает аргумент команды – soa и вызывает для ее обработки функцию soa_directive.

2. Функция soa_directive передает команду функции soa_parse_args для обработки.

3. При обнаружении ошибки функция soa_parse_args передает код ошибки и командную строку функции print_error в качестве аргументов форматирующей строки.

4. Функция print_error передает форматирующую строку с содержащимися в ней данными клиента функции vprintf, о которой уже говорилось, и вызывает ее.

Теперь ясно, что удаленные клиенты могут передать функции
vprintf форматирующую строку, которая является аргументом команды – soa. При подключении к серверу и передаче ему злонамеренной форматирующей строки злоумышленник может записать нужные ему данные в память программы сервера.

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

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

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

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

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

[dma@victim server]$ nc localhost 4321

%rwhois V-1.5:003fff:00 victim (by Network Solutions, Inc.

V-1.5.7.1)

-soa am_%i_vulnerable

%error 340 Invalid Authority Area: am_-1073743563_vulnerable

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже