stringtranslate.com

Дифференциальное тестирование

Дифференциальное тестирование [1] , также известное как дифференциальный фаззинг , представляет собой метод тестирования программного обеспечения , который обнаруживает ошибки , предоставляя одинаковые входные данные для ряда похожих приложений (или для различных реализаций одного и того же приложения) и наблюдая различия в их выполнении. Дифференциальное тестирование дополняет традиционное тестирование программного обеспечения, поскольку оно хорошо подходит для поиска семантических или логических ошибок , которые не демонстрируют явного ошибочного поведения, такого как сбои или сбои утверждений. Дифференциальное тестирование также называется тестированием back-to-back.

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

Домены приложений

Дифференциальное тестирование использовалось для успешного поиска семантических ошибок в различных областях, таких как реализации SSL/TLS , [2] [3] [4] [5] компиляторы C , [6] реализации JVM , [7] брандмауэры веб-приложений , [8] политики безопасности для API , [9] антивирусное программное обеспечение , [4] [10] и файловые системы . [11] Дифференциальное тестирование также использовалось для автоматизированной генерации отпечатков пальцев из различных реализаций сетевых протоколов . [12]

Генерация входных данных

Неуправляемый

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

Примером системы дифференциального тестирования, которая выполняет неуправляемую генерацию входных данных, является «Frankencerts». [2] Эта работа синтезирует Frankencerts путем случайного объединения частей реальных сертификатов. Она использует синтаксически действительные сертификаты для проверки семантических нарушений проверки сертификатов SSL/TLS в нескольких реализациях. Однако, поскольку создание и выбор Frankencerts полностью неуправляемы, она значительно неэффективна по сравнению с управляемыми инструментами.

Руководствуясь

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

Доменно-специфическое эволюционное руководство

Примером системы дифференциального тестирования, которая выполняет генерацию входных данных, ориентированную на покрытие конкретной области, является Mucerts. [3] Mucerts опирается на знание частичной грамматики формата сертификата X.509 и использует алгоритм стохастической выборки для управления генерацией входных данных, отслеживая при этом покрытие программы.

Другое направление исследований основано на наблюдении, что проблема генерации новых входных данных из существующих входных данных может быть смоделирована как стохастический процесс. Примером инструмента дифференциального тестирования, который использует такое моделирование стохастического процесса для генерации входных данных, является инструмент Чена и др. [7]. Он выполняет дифференциальное тестирование виртуальных машин Java (JVM) с использованием выборки Монте-Карло с цепями Маркова (MCMC) для генерации входных данных. Он использует пользовательские мутации, специфичные для домена, используя подробные знания о формате файла класса Java.

Доменонезависимое эволюционное руководство

NEZHA [4] является примером инструмента дифференциального тестирования, который имеет механизм выбора пути, ориентированный на доменно-независимое дифференциальное тестирование. Он использует определенные метрики (называемые дельта-разнообразием), которые суммируют и количественно определяют наблюдаемые асимметрии между поведением нескольких тестовых приложений. Такие метрики, которые способствуют относительному разнообразию наблюдаемого поведения программы, показали свою эффективность в применении дифференциального тестирования доменно-независимым и черным ящиком способом.

Руководство на основе автоматического обучения

Для таких приложений, как фильтры межсайтового скриптинга (XSS) и проверка имени хоста сертификата X.509, которые можно точно смоделировать с помощью конечных автоматов (FSA), можно использовать методы обучения FSA на основе контрпримеров для генерации входных данных, которые с большей вероятностью найдут ошибки. [8] [5]

Руководство на основе символического исполнения

Символическое выполнение [13] — это метод «белого ящика» , который выполняет программу символически, вычисляет ограничения по разным путям и использует решатель ограничений для генерации входных данных, которые удовлетворяют собранным ограничениям по каждому пути. Символическое выполнение также может использоваться для генерации входных данных для дифференциального тестирования. [12] [14]

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

Смотрите также

Ссылки

  1. ^ Уильям М. Маккиман, «Дифференциальное тестирование программного обеспечения», Digital Technical Journal, т. 10, № 1, стр. 100–107, 1998.
  2. ^ ab C. Brubaker, S. Jana, B. Ray, S. Khurshid и V. Shmatikov, «Использование frankencerts для автоматизированного состязательного тестирования проверки сертификатов в реализациях SSL/TLS», в Трудах симпозиума IEEE 2014 года по безопасности и конфиденциальности (S&P). IEEE Computer Society, 2014, стр. 114–129.
  3. ^ ab Y. Chen и Z. Su, «Управляемое дифференциальное тестирование проверки сертификатов в реализациях SSL/TLS», в Трудах 10-го совместного заседания по основам программной инженерии (FSE). ACM, 2015, стр. 793–804.
  4. ^ abc Petsios, T., Tang, A., Stolfo, S., Keromytis, AD, & Jana, S. (2017, май). NEZHA: Эффективное доменно-независимое дифференциальное тестирование. В трудах 38-го симпозиума IEEE по безопасности и конфиденциальности (Сан-Хосе, Калифорния).
  5. ^ ab S. Sivakorn, G. Argyros, K. Pei, AD Keromytis и S. Jana, «HVLearn: автоматизированный анализ черного ящика проверки имени хоста в реализациях SSL/TLS», симпозиум IEEE по безопасности и конфиденциальности (S&P) 2017 г., Сан-Хосе, Калифорния, США, 2017 г., стр. 521–538.
  6. ^ X. Yang, Y. Chen, E. Eide и J. Regehr, «Поиск и понимание ошибок в компиляторах C», в Трудах 32-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI). ACM, 2011, стр. 283–294.
  7. ^ ab Y. Chen, T. Su, C. Sun, Z. Su и J. Zhao, «Дифференциальное тестирование реализаций JVM, направленное на покрытие», в Трудах 37-й конференции ACM SIGPLAN по проектированию и реализации языков программирования (PLDI). ACM, 2016, стр. 85–99.
  8. ^ ab G. Argyros, I. Stais, S. Jana, AD Keromytis и A. Kiayias, «SFADiff: Автоматизированные атаки с обходом и снятие отпечатков пальцев с использованием обучения дифференциальных автоматов на основе черного ящика», в Трудах конференции ACM SIGSAC 2016 года по компьютерной и коммуникационной безопасности (CCS). ACM, 2016, стр. 1690–1701.
  9. ^ В. Шривастава, М. Д. Бонд, К. С. МакКинли и В. Шматиков, «Оракул политики безопасности: обнаружение уязвимостей с использованием нескольких реализаций API», ACM SIGPLAN Notices, т. 46, № 6, стр. 343–354, 2011.
  10. ^ С. Яна и В. Шматиков, «Злоупотребление обработкой файлов в детекторах вредоносных программ для развлечения и прибыли», в Трудах симпозиума IEEE 2012 года по безопасности и конфиденциальности (S&P). IEEE Computer Society, 2012, стр. 80–94.
  11. ^ Y. Liu, M. Adkar, G. Holzmann, G. Kuenning, P. Liu, SA Smolka, W. Su и E. Zadok, «Metis: проверка модели файловой системы с помощью универсального ввода и исследования состояния», в 22-й конференции USENIX по технологиям хранения файлов и данных (FAST '24). Ассоциация USENIX, 2024, стр. 123-140.
  12. ^ ab D. Brumley, J. Caballero, Z. Liang, J. Newsome и D. Song, «На пути к автоматическому обнаружению отклонений в двоичных реализациях с применением обнаружения ошибок и генерации отпечатков», на 16-м симпозиуме по безопасности USENIX (Безопасность USENIX '07). Ассоциация USENIX, 2007.
  13. ^ Дж. К. Кинг, «Символическое выполнение и тестирование программ», Communications of the ACM, т. 19, № 7, стр. 385–394, 1976.
  14. ^ DA Ramos и DR Engler, «Практическая, не требующая больших усилий проверка эквивалентности реального кода», в Международной конференции по компьютерной верификации. Springer, 2011, стр. 669–685.