Mastodon Mastodon Mastodon Mastodon

Фаззинг

Обновлено: · CyberSecureFox Editorial Team

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

Как работает фаззинг

Фаззер многократно генерирует входные данные, запускает с ними целевую программу и следит за падениями, зависаниями и срабатыванием проверок (assertions). Интересные входные данные сохраняются, чтобы разработчики могли воспроизвести ошибку. Идея появилась в 1988 году, когда студенты Бартона Миллера из Висконсинского университета «роняли» множество утилит Unix случайным вводом. Основные подходы:

  • На основе мутаций — образцы файлов или сообщений изменяются: инвертируются биты, вставляются байты, склеиваются фрагменты разных входов.
  • На основе генерации — входные данные строятся по грамматике или спецификации протокола; это полезно для сложных форматов.
  • С обратной связью по покрытию — программа инструментируется, и сохраняются входы, которые открывают новые пути выполнения. Этот подход популяризировали American Fuzzy Lop (AFL, 2013) и libFuzzer из LLVM.

Фаззеры обычно сочетают с санитайзерами, например AddressSanitizer, которые превращают незаметное повреждение памяти в немедленный и понятный сбой.

Почему это важно

Фаззинг — один из самых эффективных способов найти переполнения буфера, ошибки use-after-free и дефекты парсеров в коде на C и C++. Сервис Google OSS-Fuzz, запущенный в 2016 году, непрерывно фаззит сотни проектов с открытым кодом и нашёл многие тысячи ошибок, значительная часть которых — уязвимости. Атакующие и брокеры эксплойтов тоже фаззят популярное ПО, а исследователи используют фаззинг в программах bug bounty, чтобы находить проблемы в браузерах, операционных системах и сетевых протоколах.

Как применяют фаззинг на практике

  • Встраивать фазз-цели в CI/CD, чтобы каждое изменение тестировалось непрерывно.
  • В первую очередь фаззить код, разбирающий недоверенные данные: форматы файлов, сетевые протоколы, библиотеки изображений и шрифтов.
  • Запускать фаззеры с санитайзерами и поддерживать корпус качественных начальных входов.
  • Сочетать фаззинг с ревью кода, статическим анализом и языками с безопасной работой с памятью.
Синонимы:
fuzzing, фаззинг-тестирование, fuzz-тестирование