Американский пушистый вислоухий
May. 19th, 2017 12:38 amЭто с одной стороны кролик, а с другой - утилита для случайного тестирования.

Программа afl-fuzz, с помощью которой были найдены ошибки и уязвимости во многих популярных библиотеках и программах, позволяет находить наборы входных данных для тестируемой программы, приводящие к как можно более разнообразным путям исполнения линейных участков. Тестируемая программа инструментируется путем перехвата ассемблерного кода внутри компилятора: к началу каждого линейного участка добавляется код, вычисляющий хэш из уникальных номеров предыдушего и текущего участков, и инкременту элемента массива (размером 64 кб) по полученному хэш-индексу.
Массив находится в общей памяти, разделяемой между сервером и анализируемой программой, поэтому по ее завершении сервер тут же видит всю статистику путей выполнения, оценивает новизну, решает, как изменить входные данные для максимизации вероятности получить новый путь, и повторяет процедуру, обычно со скоростью от нескольких тысяч до нескольких сотен раз в секунду, в зависимости от длины входных данных и сложности анализируемой программы. Для нахождения скрытых ошибок в нетривиальных программах, тем не менее, могут потребоваться дни или даже недели непрерывной работы.
Входные данные, приводящие к зависанию или аварийному завершению, запоминаются отдельно.
Разумеется, можно не полагаться на автоматическую инструментовку, а написать работу с массивом самостоятельно. При этом можно выбирать по вкусу, что считать "линейным участком", что - путём между ними, и т.п. Таким образом можно тестировать программы на многих разных языках, от Python до JS, а также программы в кодах на эмулируемых процессорах.
На картинке выше, как нетрудно видеть, программа работает с массивом самостоятельно, поэтому за считаные минуты обнаружилось бешеное количество "путей выполнения" и вся хэш-таблица оказалась забита под завязку (показатель заполнения становится тревожно-красного цвета, если таблица заполнена более чем на 70%).

Программа afl-fuzz, с помощью которой были найдены ошибки и уязвимости во многих популярных библиотеках и программах, позволяет находить наборы входных данных для тестируемой программы, приводящие к как можно более разнообразным путям исполнения линейных участков. Тестируемая программа инструментируется путем перехвата ассемблерного кода внутри компилятора: к началу каждого линейного участка добавляется код, вычисляющий хэш из уникальных номеров предыдушего и текущего участков, и инкременту элемента массива (размером 64 кб) по полученному хэш-индексу.
Массив находится в общей памяти, разделяемой между сервером и анализируемой программой, поэтому по ее завершении сервер тут же видит всю статистику путей выполнения, оценивает новизну, решает, как изменить входные данные для максимизации вероятности получить новый путь, и повторяет процедуру, обычно со скоростью от нескольких тысяч до нескольких сотен раз в секунду, в зависимости от длины входных данных и сложности анализируемой программы. Для нахождения скрытых ошибок в нетривиальных программах, тем не менее, могут потребоваться дни или даже недели непрерывной работы.
Входные данные, приводящие к зависанию или аварийному завершению, запоминаются отдельно.
Разумеется, можно не полагаться на автоматическую инструментовку, а написать работу с массивом самостоятельно. При этом можно выбирать по вкусу, что считать "линейным участком", что - путём между ними, и т.п. Таким образом можно тестировать программы на многих разных языках, от Python до JS, а также программы в кодах на эмулируемых процессорах.
На картинке выше, как нетрудно видеть, программа работает с массивом самостоятельно, поэтому за считаные минуты обнаружилось бешеное количество "путей выполнения" и вся хэш-таблица оказалась забита под завязку (показатель заполнения становится тревожно-красного цвета, если таблица заполнена более чем на 70%).