Дифференциальное тестирование - Differential testing
Эта статья может быть слишком техническим для большинства читателей, чтобы понять.Август 2017 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Дифференциальное тестирование,[1] также известен как дифференциальный фаззинг, популярный тестирование программного обеспечения техника, которая пытается обнаружить ошибки, предоставляя одинаковые входные данные ряду аналогичных приложений (или различным реализациям одного и того же приложения) и наблюдая различия в их выполнении. Дифференциальное тестирование дополняет традиционное тестирование программного обеспечения, поскольку оно хорошо подходит для поиска семантический или же логические ошибки которые не демонстрируют явного ошибочного поведения, такого как сбои или сбои утверждений. Дифференциальное тестирование иногда называют последовательным тестированием.
Дифференциальное тестирование обнаруживает семантические ошибки, используя различные реализации той же функциональности, что и перекрестные ссылки. оракулы, выявляя различия в их выходных данных на многих входах: любое несоответствие между поведением программы на одном и том же входе отмечается как потенциальная ошибка.
Домены приложений
Дифференциальное тестирование использовалось для успешного обнаружения семантических ошибок в различных областях, таких как SSL / TLS реализации,[2][3][4][5] C компиляторы,[6] Декомпиляторы Java,[7] JVM реализации,[8] Брандмауэры веб-приложений,[9] политики безопасности для API,[10] и антивирусное программное обеспечение.[4][11] Дифференциальное тестирование также использовалось для автоматического создания отпечатков пальцев из разных сетевой протокол реализации.[12]
Генерация ввода
Неуправляемый
Инструменты неуправляемого дифференциального тестирования генерируют тестовые входные данные независимо от итераций, не учитывая поведение тестовой программы на прошлых входных данных. Такой процесс генерации входных данных не использует никакой информации из прошлых входных данных и по существу создает новые входные данные случайным образом из чрезмерно большого входного пространства. Это может сделать процесс тестирования крайне неэффективным, поскольку для обнаружения единственной ошибки необходимо сгенерировать большое количество входных данных.
Примером системы дифференциального тестирования, которая выполняет неуправляемую генерацию входных данных, является «Frankencerts».[2] В этой работе франкенцерты синтезируются путем случайного объединения частей реальных сертификатов. Он использует синтаксически допустимые сертификаты для проверки семантических нарушений при проверке сертификатов SSL / TLS в нескольких реализациях. Однако, поскольку создание и выбор франкенцертов полностью не ведется, это значительно неэффективно по сравнению с управляемыми инструментами.
Управляемый
Процесс создания управляемых входных данных направлен на минимизацию количества входных данных, необходимых для обнаружения каждой ошибки, путем учета информации о поведении программы для прошлых входных данных.
Руководство по эволюции в конкретных областях
Пример системы дифференциального тестирования, которая выполняет специализированные покрытие - управляемая генерация ввода - Mucerts.[3] Mucerts полагается на знание частичной грамматики X.509 сертификат формата и использует алгоритм стохастической выборки для управления генерацией входных данных при отслеживании покрытия программы.
Другое направление исследований основано на наблюдении, что проблема создания новых входных данных из существующих входов может быть смоделирована как случайный процесс. Примером инструмента дифференциального тестирования, который использует такое моделирование стохастических процессов для генерации входных данных, является инструмент Чена и др.[8] Выполняет дифференциальное тестирование Виртуальные машины Java (JVM) с использованием Цепь Маркова Монте-Карло (MCMC) выборка для генерации входных данных. Он использует пользовательские доменные мутации, используя подробные знания формата файлов классов Java.
Независимое от предметной области эволюционное руководство
НЕЖА[4] представляет собой пример инструмента дифференциального тестирования, который имеет механизм выбора пути, ориентированный на независимое от предметной области дифференциальное тестирование. Он использует определенные показатели (называемые дельта-разнообразием), которые суммируют и количественно определяют наблюдаемую асимметрию между поведением нескольких тестовых приложений. Такие показатели, которые способствуют относительному разнообразию наблюдаемого поведения программы, показали свою эффективность при применении дифференциального тестирования вне зависимости от предметной области и методом черного ящика.
Руководство на основе автоматизированного обучения
Для приложений, таких как межсайтовый скриптинг (XSS) фильтры и проверка имени хоста сертификата X.509, которые можно точно смоделировать с помощью конечные автоматы (FSA), методы обучения FSA на основе контрпримеров могут использоваться для генерации входных данных, которые с большей вероятностью обнаружат ошибки.[9][5]
Руководство на основе символического исполнения
Символическое исполнение[13] это белая коробка метод, который выполняет программу символически, вычисляет ограничения по различным путям и использует решатель ограничений для генерации входных данных, которые удовлетворяют собранным ограничениям по каждому пути. Символьное выполнение также может использоваться для генерации входных данных для дифференциального тестирования.[12][14]
Неотъемлемое ограничение инструментов тестирования с символьным выполнением - взрывной путь и масштабируемость - усиливается, особенно в контексте дифференциального тестирования, когда используется несколько тестовых программ. Следовательно, очень сложно масштабировать методы символьного выполнения для выполнения дифференциального тестирования нескольких больших программ.
Смотрите также
Рекомендации
- ^ Уильям М. МакКиман, «Дифференциальное тестирование программного обеспечения», Цифровой технический журнал, вып. 10, вып. 1. С. 100–107, 1998.
- ^ а б К. Брубакер, С. Яна, Б. Рей, С. Хуршид и В. Шматиков, «Использование frankencerts для автоматического состязательного тестирования проверки сертификатов в реализациях SSL / TLS», в материалах симпозиума IEEE 2014 г. по безопасности и конфиденциальности ( S&P). IEEE Computer Society, 2014, стр. 114–129.
- ^ а б Ю. Чен и З. Су, «Управляемое дифференциальное тестирование проверки сертификатов в реализациях SSL / TLS», в материалах 10-го совместного заседания по основам программной инженерии (FSE). ACM, 2015. С. 793–804.
- ^ а б c Петсиос Т., Танг А., Стольфо С., Керомитис А. Д. и Яна С. (2017, май). NEZHA: Эффективное доменно-независимое дифференциальное тестирование. В материалах 38-го симпозиума IEEE по безопасности и конфиденциальности (Сан-Хосе, Калифорния).
- ^ а б С. Сивакорн, Г. Аргирос, К. Пей, А. Д. Керомитис и С. Яна, «HVLearn: Автоматический анализ черного ящика проверки имени хоста в реализациях SSL / TLS», Симпозиум IEEE по безопасности и конфиденциальности (S&P) 2017 г., Сан-Хосе , Калифорния, США, 2017 г., стр. 521–538.
- ^ X. Yang, Y. Chen, E. Eide и J. Regehr, «Поиск и понимание ошибок в компиляторах C», в материалах 32-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI). ACM, 2011, с. 283–294.
- ^ Харранд, Николас; Сото-Валеро, Сезар; Монперрус, Мартин; Бодри, Бенуа (2020). «Разнообразие декомпиляторов Java и их применение в мета-декомпиляции». Журнал систем и программного обеспечения. 168: 110645. arXiv:2005.11315. Дои:10.1016 / j.jss.2020.110645. S2CID 218870447.
- ^ а б Ю. Чен, Т. Су, К. Сан, З. Су и Дж. Чжао, «Дифференциальное тестирование реализаций JVM, направленное на покрытие», в материалах 37-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI). ACM, 2016, с. 85–99.
- ^ а б Г. Аргирос, И. Стаис, С. Яна, А. Д. Керомитис и А. Киайас, «SFADiff: автоматические атаки с уклонением и снятие отпечатков пальцев с использованием обучения дифференциальных автоматов черного ящика», в материалах конференции ACM SIGSAC 2016 по компьютерной и коммуникационной безопасности. (CCS). ACM, 2016, с. 1690–1701.
- ^ В. Сривастава, М. Д. Бонд, К. С. Мак-Кинли и В. Шматиков, «Оракул политики безопасности: обнаружение дыр в безопасности с использованием нескольких реализаций API», Уведомления ACM SIGPLAN, т. 46, нет. 6. С. 343–354, 2011.
- ^ С. Яна и В. Шматиков, «Злоупотребление обработкой файлов в детекторах вредоносных программ для развлечения и выгоды», в материалах симпозиума IEEE 2012 по безопасности и конфиденциальности (S&P). IEEE Computer Society, 2012, стр. 80–94.
- ^ а б Д. Брамли, Дж. Кабальеро, З. Лян, Дж. Ньюсом и Д. Сонг, «К автоматическому обнаружению отклонений в двоичных реализациях с приложениями для обнаружения ошибок и генерации отпечатков пальцев», на 16-м симпозиуме по безопасности USENIX (USENIX Security '07 ). Ассоциация USENIX, 2007 г.
- ^ Дж. К. Кинг, «Символьное выполнение и тестирование программ», «Коммуникации ACM», т. 19, нет. 7. С. 385–394, 1976.
- ^ Д. А. Рамос и Д. Р. Энглер, «Практическая проверка эквивалентности реального кода без особых усилий», в Международной конференции по компьютерной проверке. Springer, 2011, стр. 669–685.