Go Daily Library 114: гоу-фузз
Go Daily Library 114: гоу-фузз

Рекомендуемый фон go-fuzz

В повседневной разработке мы часто пишем варианты использования, соответствующие тестиизтесту. Часто ли у вас возникают следующие сомнения:

  • Полностью ли существующие варианты использования охватывают различные периферийные сценарии? Будут ли сюрпризы? case?
  • кодтест Степень покрытия достигает 100% Ладно, почему ты все еще дрожишь, когда код выходит в сеть?
  • Написание сценариев использования тестов слишком трудоемко,Существует ли инструмент, который может автоматически генерировать сценарии использования для тестирования?

На этот раз всем рекомендую go-fuzz Возможно, это позволит поднять надежность вашего проекта на более высокий уровень и более или менее облегчить ваши проблемы. go-fuzzда Dmitry Vyukov Великий бог был там долгое время go1.5 Times с открытым исходным кодом (Apache License 2.0 лицензия с открытым исходным кодом) golang Инструменты нечеткого тестирования предоставляют мощные методы проверки надежности систем, которые анализируют сложные входные данные (текстовые или двоичные). Пока что, иди-фузз Уже для go Язык (вы правильно прочитали, это golang сам)и Некоторые сторонние библиотеки обнаружилисотни дефектов,Можно сказать, что он пользуется большим авторитетом!

go-fuzz и фазз-тестирование

Википедия объясняет нечеткое тестирование следующим образом:

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

go-fuzz Автоматически генерируемые тестовые случаи не просто случайны, они сильно зависят от afl(American Fuzzy Lop),Во время выполнения итеративные изменения будут производиться в соответствии с определенными правилами алгоритма, основанными на существующих вариантах использования и выполнении вариантов использования.,таким образом, бесконечный «Деление» Создавайте новые тесты. в настоящий момент gitlab.com и fuzzbuzz.io основаны на go-fuzz из ci интегрированный.

примеры приложений go-fuzz

Ниже мы будем использовать http://fuzzbuzz.io Давайте рассмотрим небольшой пример go-fuzz Как использовать. В следующем коде середина есть один довольно неясный момент. ошибка при наборе из Data Точно FUZ Доступ за пределы будет активирован, когда:

Язык кода:javascript
копировать
package tutorial

// BrokenMethod has a bug - it will try to read the 4th
// index of Data even when it only has a length of 3.
func BrokenMethod(Data string) bool {
    return len(Data) >= 3 &&
        Data[0] == 'F' &&
        Data[1] == 'U' &&
        Data[2] == 'Z' &&
        Data[3] == 'Z'
}

Далее мы пытаемся использовать go-fuzz для обнаружения уязвимости.

Step0: Установить go-fuzz-build и go-fuzz

Язык кода:javascript
копировать
go get -u github.com/dvyukov/go-fuzz/go-fuzz@latest github.com/dvyukov/go-fuzz/go-fuzz-build@latest

Не забудьте добавить $GOPATH/bin в PATH.

Step1: Написать тестовую функцию

добавить в код метод_fuzz.go,Внимание // +build gofuzz ​​дама должна добавить из,Следующий шаг сборки определит его.

Язык кода:javascript
копировать
// +build gofuzz
package tutorial

func Fuzz(data []byte) int {
  BrokenMethod(string(data))
  return 0
}

Fuzz код возврата функции настоящий моментиметь 3 необязательные значения: возврат 1 Указывает, что ток входного веса увеличивается и возвращается -1 Указывает, что текущий вход не добавляется в корпус, в противном случае возвращается 0。

Step2: Спроектировать несколько начальных корпусов

Мы добавляем F и FU как BrokenMethod из Два варианта использования. Конечно, если в вашем коде середина уже разработаны варианты использования, вы также можете копировать напрямую. workdir/corpus Вниз.

Язык кода:javascript
копировать
mkdir -p workdir/corpus
echo -n "F"  >workdir/corpus/1
echo -n "FU" >workdir/corpus/2

Добавление начального корпуса не обязательно, но go-fuzz Автор рекомендует чем богаче исходный корпус, тем лучше, что очень полезно для последующего нечеткого исполнения!

Step3: go-fuzz-build Создать тестовый проект

Язык кода:javascript
копировать
go get -d github.com/dvyukov/go-fuzz-corpus
go-fuzz-build

Этот шаг может занять некоторое время,Это связано со сложностью проекта. После успешного выполнения,будет внутри Посмотреть в текущем каталоге tutorial-fuzz.zip из Сжатый пакет.

go-fuzz да go1.5 Я сейчас старый парень, прямо сейчас go module поддержка все еще находится на ранней стадии. Выполнить перед созданием теста go get -d http://github.com/dvyukov/go-fuzz-corpus будет внутри go.mod Добавление строки не требует наличия зависимостей. После выполнения нечеткого теста используйте. go mod tidy можно восстановить.

Step4: go-fuzz Выполните фазз-тестирование

Язык кода:javascript
копировать
go-fuzz -bin=tutorial-fuzz.zip -workdir=workdir

В это время мы видим следующий вывод на консоли:

Язык кода:javascript
копировать
2021/05/16 13:56:45 workers: 4, corpus: 4 (2s ago), crashers: 1, restarts: 1/0, execs: 0 (0/sec), cover: 0, uptime: 3s
2021/05/16 13:56:48 workers: 4, corpus: 4 (5s ago), crashers: 1, restarts: 1/0, execs: 0 (0/sec), cover: 6, uptime: 6s
2021/05/16 13:56:51 workers: 4, corpus: 4 (8s ago), crashers: 1, restarts: 1/408, execs: 48969 (5440/sec), cover: 6, uptime: 9s
...

go-fuzz Выполнение тестов не прекращается автоматически, когда мы обнаруживаем crashers Поле значения не является 0 (когда вариант использования запускает программируемый), вы можете завершить тест и просмотреть результаты теста, в результате чего программируемый вариант использования будет сохранен в workdir/crashers/ в каталоге

Step5: Анализируйте результаты испытаний

Язык кода:javascript
копировать
$ tree workdir/crashers/
workdir/crashers
├── 0eb8e4ed029b774d80f2b66408203801cb982a60
├── 0eb8e4ed029b774d80f2b66408203801cb982a60.output
└── 0eb8e4ed029b774d80f2b66408203801cb982a60.quoted

Видимый, рабочий каталог/крашеры Слишком 3 файлы, их имена файлов являются вариантами использования входных данных. sha1sum ценить.

  • Вариант использования без суффикса хранения файлов из исходного ввода
  • суффикс .quoted из файла хранит формат строки из ввода варианта использования (удобно вставлять в код для непосредственной отладки, дизайн слишком дружелюбный)
  • суффиксдля .output из вывода ошибки при сохранении аномального
Язык кода:javascript
копировать
$ cat workdir/crashers/0eb8e4ed029b774d80f2b66408203801cb982a60.quoted
  "FUZ"
$ cat workdir/crashers/0eb8e4ed029b774d80f2b66408203801cb982a60.output
panic: runtime error: index out of range [3] with length 3

goroutine 1 [running]:
demo.BrokenMethod.func4(...)
  /Users/blanet/repos/tmp/tutorial-go/method.go:9
demo.BrokenMethod(0xc000092e80, 0x3, 0x3)
  /Users/blanet/repos/tmp/tutorial-go/method.go:10 +0x11d
demo.Fuzz(0x4810000, 0x3, 0x3, 0x3)
  /Users/blanet/repos/tmp/tutorial-go/fuzz.go:5 +0x6f
go-fuzz-dep.Main(0xc000092f70, 0x1, 0x1)
  go-fuzz-dep/main.go:36 +0x1b8
main.main()
  demo/go.fuzz.main/main.go:15 +0x52
exit status 2

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

Подвести итог

использовать go-fuzz В программу можно интегрировать нечеткий тест, который полезен для определения надежности сложных систем ввода и проверки различных глубоководных участков. panic из сцены очень полезно. Давайте попробуем это сейчас!

Ссылки

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода