Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Программирование и алгоритмические языки в Linux

Fuzz-тестирование с помощью zzuf

Оригинал: Fuzz testing with zzuf
Автор: Joe Barr
Дата: 26 июля 2007
Перевод А.Тарасова, дата перевода: 29 июля 2007

Не так давно в области IT-безопасности появились случайные методы тестирования (fuzz-тестирование), когда поиск ошибок осуществляется с помощью случайных входных данных. Теперь вы можете быстро и легко использовать эти методы с помощью классной программы под названием zzuf.

Мы должны быть благодарны глупым пользователям в том смысле, что они вводят дату там, где должны быть денежные значения; цифры вместо своего имени, либо почтовый индекс, хотя ожидался номер соцобеспечения. Такое поведение пользователей часто приводит к неверной работе программ - ошибки сегментации, нарушение границ массивов и любые другие типы критических ошибок. Многие из них являются лазейками для злобных хакеров, дающими доступ к данным либо вообще к самой системе - к примеру, уязвимости в Wi-Fi были обнаружены на BlackHat с помощью методов случайного fuzz-тестирования драйверов Wi-Fi.

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

Как написано на домашней странице проекта, zzuf начинался как инструмент для отладки VLC Media Player, но с тех пор сфера его применения расширилась.

Установка zzuf прямолинейна. После загрузки zzuf-0.9.tar.gz с сайта проекта и распаковки tar-архива, войдите в каталог zzuf-0.9 и запустите скрипт ./bootstrap, затем стандартную последовательность ./configure, make и sudo make install. Я устанавливал zzuf на Ubuntu Feisty Fawn.

Результатом процесса сборки будет выполняемый файл zzuf, другая программа zzcat и скрипт под названием testsuite.sh. Я запустил этот скрипт, и передо мной пробежало более 200 различных тестов. Автор программы, лидер проекта Debian Сэм Хосевар поясняет:

Скрипт testsuite играет роль тестового набора, проверяющего, может ли zzuf должным образом работать в данной операционной системе. В скрипте выполняется несколько известных программ (cat, sed, grep) и zzcat (собственная программа, которая выполняет различные операции с файловыми дескрипторами, к примеру, чтение случайных байтов, поиск в неправильных смещениях, отображение в память файлов с помощью вызовов mmap() и т.д.), с их помощью проводится несколько проверок с участием тестовых файлов и zzuf. Если все программы дают одинаковый ответ, значит, zzuf успешно перехватил все важные библиотечные вызовы.

Проверим это

Приведу пример использования zzuf на самом простом уровне. Пример взят из презентации по zzuf, выложенной Хосеваром. Чтобы увидеть его в работе, мы будем случайно изменять входные данные программы cat, которая, как известно, выводит содержимое файла в терминал.

Предположим, что у нас есть текстовый файл test.txt, содержащий следующие данные:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Если вы введете команду cat test.txt, в консоли отобразится в точности вышеприведенные строки. Но посмотрите что случится, если мы пропустим ввод cat через zzuf, введя zzuf cat test.txt:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXZXXXXXXXXXXXXXZYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Повторите команду несколько раз и вы увидите, что вывод все время в точности повторяется. Это важный аспект zzuf - способность воспроизводить точные тесты, которые дают определенные выходные данные. Неважно насколько сложен ваш тест, в любом случае вы сможете его повторить, таким образом выявляя ошибки, которые раньше постоянно ускользали.

Конечно, zzuf способен проводить более сложное тестирование, чем в приведенном примере с cat. Man-страница, созданная в процессе установки, напичкана сведениями, как можно использовать zzuf. Запуск zzuf с ключом -h предоставляет вам справку с короткими пояснениями его функций.

Когда я впервые попробовал использовать zzuf для тестирования Xine, я не мог победить следующее сообщение об ошибке:

	Xlib: connection to ":0.0" refused by server
	Xlib: No protocol specified
Google привел меня к решению этой проблемы. Все, что нужно было сделать - перед запуском zzuf-теста командовать xhost local:root, что волшебным образом позволило zzuf соединиться с X-сервером на моей Ubuntu-системе.

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