The problems related to input datageneration for fuzz testing are discussed in the article. Existing fuzzers mainly realize thegenerators depending on target software. The creation of more universal generators requiresdata structures descriptive tools, which would have more expressive description possibilitiesfor data structures internal relations.
An approach to fuzz testing data generation for applied and system software.pdf Для тестирования надежности системного и прикладного программного обеспечения(ПО) часто применяют метод, получивший название фазинг (fuzzing). Фазингявляется одним из видов стрессового тестирования, потенциально позволяющий выявлятьошибки в процессе функционирования ПО [1]. Существует много различныхинструментальных средств тестирования методом фазинга, являющихся как коммерческимипродуктами, так и свободно распространяемыми. Интерес к тестированиюметодом фазинга обусловлен все возрастающими требованиями к надежности ПО.Привлекательность метода заключается в простоте реализации, возможности проведениятестирования в автоматическом режиме, проведении тестирования без исходныхкодов, а также в широкой применимости метода. Тестирование методом фазингаможно адаптировать ко многим видам ПО. Тестируемое ПО будем называть целевым,а входные данные, сгенерированные для целевого ПО , - тестами.Тестирование посредством фазинга заключается в передаче некорректных данныхцелевому ПО. Основная задача в том, как описать модель данных и на ее основе создатьнекорректные данные, т. е. тесты. Различают два типовых подхода к генерациитестов: мутационный и генерационный фазинг. Первый подход предполагает внесениеискажений в уже готовые корректные данные. Второй подход требует использованиягенератора данных заданного формата. Для мутационного фазинга требуется определения«места» внесения искажений, поскольку беспорядочное внесение искаженийприводит к тому, что целевое ПО игнорирует тесты. Для применения генерационногофазинга требуется формальное описание структур данных, которое не всегда возможновыполнить. Ряд исследователей отдают предпочтение генерационному фазингу.В работе [2] авторы приводят результаты исследований, которые показывают преимуществогенерационного фазинга перед мутационным. На примере формата файловpng показывается, что область покрытия тестируемого кода существенно больше прииспользовании генерационного фазинга, чем при мутационном. На практике применениегенерационного фазинга к сложноструктурированным данным является сложнойзадачей, поскольку требуется генерировать не только и даже не столько корректныеданные, а данные, которые «незначительно» отличаются от спецификации.Опыт применения тестирования посредством фазинга указывает на целесообразностькомбинирования генерационного и мутационного фазинга для целевого ПО, обрабатывающегосложноструктурированные данные. Для целевого ПО, обрабатывающегоотносительно простые данные (например, файлы медиа форматов), предпочтениедолжно отдаваться генерационному фазингу.Автором проводятся исследования, целью которых является создание метода формированиятестов, основанного на описании структур данных и процедур формированиявходных данных (ПФВД) с использованием скриптового языка. ПФВД обеспечиваютпроверку корректности структур данных на основе заданных ограничений. Дляописания структуры данных и ПФВД за основу был взят язык C. Подход, основанныйна применении скриптового языка, оказался удобным. Достигнута хорошая масштабируемостьсреды тестирования, независимость среды тестирования от методов генерациитестов. В листинге 1 приведен пример каркаса скрипта, обеспечивающий поискспецифической структуры во входных данных.1 / / з аг оло вки сре ды тестирования2 #include "main_environment.h"3 // г е нерируемая или искомая структура данных4 struc t struc t_a {5 struct software_dependence a;6 int v e r i f y ( RETVAL * r e t v a l , int cnt ) ;7 int modify( int cnt ) ;8 } ;9 // алгоритмы проверки корректности и искажения структуры10 int s t ru c t _ a : : v e r i f y ( RETVAL * r e t v a l , int cnt ) { . . . }11 int s t ru c t _ a : : modify( int cnt ) { . . . }Листинг 1. Пример каркаса скрипта для среды тестированияПри генерации тестов, имеющих сложную внутреннюю организацию, возникаютследующие трудности:- написание на скриптовом языке генератора тестов становится сложной задачей,сопоставимой с созданием парсера требуемого формата данных;- время проверки корректности самого генератора тестов резко возрастает;- нетривиальной задачей становится создание тестов, обеспечивающих максимальноепокрытие кода целевого ПО.Опыт применения генератора тестов на основе скриптового языка выявил недостаточнуювыразительность средств описания внутренней организации структур данных.В связи с этим предлагается для генерации тестов расширить возможности скриптовогоязыка, добавив дополнительную декларативную информацию. Например, приописании структур данных ввести атрибуты, в которых указывалась бы информацияо внутренних связях, ограничениях и зависимостях. Целью введения данного расширенияявляется возможность автоматической генерации входных данных, у которыхбыли бы частично нарушены ограничения, внутренние связи и т. д.В ряде языков существуют механизмы задания дополнительной декларативной информации(например, атрибуты в C#), но в контексте рассматриваемой задачи их возможности ограничены. В связи с этим автором ведутся исследования по адаптации иприменению специализированных языков (например, языка TreeDl [3]) для построениягенераторов тестов. Ожидаемый результат от внедрения этого подхода заключаетсяв появлении средства создания тестов, обладающего следующими свойствами:- максимально возможная независимость генератора тестов от целевого ПО;- минимальное время разработки тестов для нового целевого ПО;- обеспечение повышения объема покрытия кода целевого ПО.
Макаров Алексей Николаевич | ГНТЦ "Наука", г. Москва | научный сотрудник | byalex@mail.ru |
Макаров А. Н. Метод автоматизированного поиска программных ошибок в алгоритмах обработки сложноструктурированных данных / / Прикладная дискретная математика. 2009. №3(5). С. 117-127.
Miller С., Peterson Z. N. J. Analysis of Mutation and Generation-Based Fuzzing. www. securityevaluators.com. 2007.
treedl.org - сайт проекта TreeDl.