UncategorizedгаджетыНовостиразработчиктехнология

Go получает поддержку тестирования Fuzz в бета-версии

Команда Go объявила, что поддержка фаззинга теперь доступна для бета-тестирования. Основная цель проекта – создание единого и сквозного интерфейса для разработчиков и пользователей языка, включая надежную поддержку модулей, интеграцию с go команда и новый инструментарий компилятора.

По словам инженера Google Кэти Хокман, автора черновика дизайна фаззинга, этот проект направлен на то, чтобы сделать фаззинг первоклассным вариантом для тестирования программ Go, так же легко, как и запускать модульные тесты.

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

Фаззинг был не новичком для сообщества Go, объясняет Хокман, с такими инструментами, как go-fuzz и его производным fzgo. Однако они возлагали на разработчиков некоторые ненужные накладные расходы из-за необходимости использования нестандартных инструментов, разделения тестовых файлов или тегов сборки, отсутствия надежной поддержки модулей и т. Д.

Ниже приведен предоставленный Google пример цели фаззинга, которая проверяет поведение пакета net / url:

// +build gofuzzbeta

package fuzz

import (
    "net/url"
    "reflect"
    "testing"
)

func FuzzParseQuery(f *testing.F) {

    f.Add("x=1&y=2")
    f.Fuzz(func(t *testing.T, queryStr string) {
        query, err := url.ParseQuery(queryStr)
        if err != nil {
            t.Skip()
        }
        queryStr2 := query.Encode()
        query2, err := url.ParseQuery(queryStr2)
        if err != nil {
            t.Fatalf("ParseQuery failed to decode a valid encoded query %s: %v", queryStr2, err)
        }
        if !reflect.DeepEqual(query, query2) {
            t.Errorf("ParseQuery gave different query after being encodednbefore: %vnafter: %v", query, query2)
        }
    })
}

Нечеткая цель предоставляется в виде FuzzXyz функция, которая получает *testing.F аргумент. В f.Add функцию можно использовать для заполнения корпус семян, который является заданным пользователем набором входных данных для цели фаззинга. В f.Fuzz функция выполняется для каждого элемента в корпусе. Помимо семенного тела, f.Fuzz также проверяет входные данные, представленные в testdata/corpus/FuzzTarget.

Когда разработчик использует -fuzz флаг go test, механизм фаззинга Go будет запускать функцию тестирования сгенерированного корпуса, в то время как мутатор будет генерировать новые входные данные в попытке обнаружить ошибку или разбойник.

Бета-версия фаззинга Go доступна в ветке разработки Go. К сожалению, пока нет графика, когда он будет включен в стабильный выпуск Go, и Хокман исключает, что он появится в Go 1.17.

Находясь в стадии бета-тестирования, фаззинг Go еще не завершен и может быть изменен. Есть также ряд дополнительных функций, которые уже находятся в разработке, говорит Хокман, например, тестирование нескольких целей одновременно, поддержка словарей, добавление пользовательских генераторов для мутатора и другие.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button