diff --git a/README.md b/README.md index 49ed94f..1c03519 100644 --- a/README.md +++ b/README.md @@ -176,3 +176,17 @@ bash scripts/run.sh 3.3. ./build_for_afl.sh 3.4. ./run_afl.sh + +### Черновики для go-fuzz + +На данный момент установка по официальной инструкции https://github.com/dvyukov/go-fuzz/blob/master/README.md не работает по причине golang.org/x/tools@v0.44.0 requires go >= 1.25.0 (running go 1.24.4) + +4. Запуск go-fuzz + +4.1. cd myfuzz + +4.2. ./install_go-fuzz.sh (тут возникают проблемы, поэтому следующие шаги проверить не удалось) + +4.3. ./build_for_go-fuzz.sh + +4.4. ./run_go-fuzz.sh diff --git a/myfuzz/auth_fuzz.go b/myfuzz/auth_fuzz.go new file mode 100644 index 0000000..a8c743a --- /dev/null +++ b/myfuzz/auth_fuzz.go @@ -0,0 +1,48 @@ +package myfuzz + +import ( + "bytes" + "fmt" + "linux-auth/internal/auth" + "linux-auth/internal/db" +) + +// Fuzz — это функция, которую будет вызывать go-fuzz. +// Принимает только []byte — все входные данные в одном байтовом потоке. +func Fuzz(data []byte) int { + // Инициализируем БД на каждом вызове — go-fuzz не имеет f.Cleanup() + if err := db.Init("test_data.db"); err != nil { + return -1 // ошибка инициализации — краш + } + defer db.Close() // закрываем после каждого вызова + + // Разделяем байты по нулевому байту (\x00) — это разделитель между username и password + parts := bytes.SplitN(data, []byte{0}, 2) + if len(parts) != 2 { + return 0 // недостаточно данных — пропускаем + } + + username := string(parts[0]) + password := string(parts[1]) + + ok, err := auth.Authenticate(username, password) + + // Если произошла ошибка — это баг + if err != nil { + return -1 // краш + } + + // Если аутентификация прошла успешно — проверяем, разрешён ли такой вход + if ok { + // Разрешённые пары (аналогично f.Add) + if (username == "admin" && password == "admin123") || + (username == "user1" && password == "password1") { + return 1 // норма — это ожидаемый результат + } + // Неожиданный успешный вход — это баг! + return -1 // краш + } + + // Неудачная аутентификация — это нормально + return 1 // норма +} diff --git a/myfuzz/build_for_go-fuzz.sh b/myfuzz/build_for_go-fuzz.sh new file mode 100755 index 0000000..405f5a5 --- /dev/null +++ b/myfuzz/build_for_go-fuzz.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +go-fuzz-build -libfuzzer ./myfuzz diff --git a/myfuzz/install_go-fuzz.sh b/myfuzz/install_go-fuzz.sh new file mode 100755 index 0000000..e9d0524 --- /dev/null +++ b/myfuzz/install_go-fuzz.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +go install github.com/dvyukov/go-fuzz/go-fuzz@latest github.com/dvyukov/go-fuzz/go-fuzz-build@latest diff --git a/myfuzz/run_go-fuzz.sh b/myfuzz/run_go-fuzz.sh new file mode 100755 index 0000000..ae4e419 --- /dev/null +++ b/myfuzz/run_go-fuzz.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cp ../data/users.db test_data.db + +go-fuzz -bin=myfuzz-fuzz.zip -workdir=work