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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose