linux-auth/analysis_report.md
2026-05-14 15:48:19 +03:00

8 KiB
Raw Blame History

Комплексный отчёт об анализе безопасности приложения

Среда разработки

Go версии 1.23, Debian 12.

Среда анализа

Go версии 1.24, Debian 13.

Статический анализ (SAST)

  • Bearer - хорошо работает для анализа взаимодействия с ОС, подсветил возможную утечку информации в логах работы приложения и отсутствие проверки пути загрузки конфига.

  • Gosec - ориентирован на поиск проблем с безопасностью, нашёл (как и bearer) проблему с путём загрузки конфига и (в отличие от bearer) предложил способ исправления.

  • Golangci-lint - больше линтер, нежели статический анализатор, указал только на возможную замену if с условием, содержащем "ИЛИ", на switch (я считаю, что это false positive).

  • Svace (svacer) - проприетарный инструмент, который был развёрнут во внутренней сети компании и был также использован, но не был включён в итоги; было одно срабатывание на код самого приложения и достаточно много - на использованные модули; по моему мнению, все срабатывания - false positive.

Подробные результаты (кроме svace/svacer) см. в директории sast_results.

Фаззинг

  • Нативный фаззинг (доступен с версии Go 1.18 и считается стандартом, как дополнение нативного тестирования позволяет визуализировать покрытие кода) - объектом тестирования стала функция аутентификации, которая в том числе вызывала функции для доступа к БД и хеширования; цель фаззинга - проверка корректности работы функции аутентификации; входные данные - строки логина и пароля (начальные данные - правильные и неправильные пары логин-пароль для 2 тестовых пользователей, а также пустые строки в качестве логина и пароля); отслеживались ошибки, возвращаемые самой функцией аутентификации, а также неожиданная (не по 2 парам логин-пароль в тестовой базе) успешная аутентификация и аварийное завершение работы.

  • AFL++ в режиме QEMU (универсальный способ проверки готового бинарника, принимающего данные в stdin или из файла) - объектом тестирования стала скомпилированная программа; цель - проверка устойчивости итогового исполняемого файла к различным входным данным; начальные входные данные были как и в нативном фаззинге (корректные строки), но во время фаззинга они мутировали в том числе и в бинарные данные; отслеживалось аварийное завершение работы.

Длительность фаззинга - 6 часов. Ошибок не найдено.

Анализ сторонних зависимостей

Go хорош тем, что не даёт скомпилировать программу при наличии избыточных зависимостей (неиспользованные import считаются ошибкой). Скачать библиотеки можно как из официального репозитория пакетов, так и из пользовательских репозиториев (на github).

Также система модулей (см. файлы go.mod и go.sum) позволяет зафиксировать версии заимствованных библиотек с использованием хешей как исходного кода самих импортируемых модулей, так и хешей их зависимостей (их go.mod).

Таким образом, гарантируется автоматическое ведение списка зависимостей, повторяемость сборок и защита от возможных злоумышленных изменений кода сторонних библиотек. В файле go.mod в том числе указывается тип зависимости, а именно приписка indirect у транзитивной зависимости, требующейся для работы прямой зависимости.

Список зависимостей

  • github.com/mattn/go-sqlite3 - библиотека для работы с БД SQLite, в которой хранятся данные о пользователях; используется для SQL запросов

  • github.com/pelletier/go-toml/v2 - библиотека для работы с toml файлами, в таком формате хранится конфиг (настройки приложения)

  • golang.org/x/term - библиотека для функций работы с терминалом, используется для скрытия пароля при его вводе

  • golang.org/x/sys - зависимость golang.org/x/term для низкоуровневой работы с ОС

  • а также компоненты стандартной библиотеки Go

Итого: библиотека term (с зависимостью sys) используется в единственном месте для важной задачи (маскирование вводимого пароля), библиотека go-toml тоже используется для единственной функции (чтение параметров-настроек при запуске приложения для возможности гибкой настройки), библиотека go-sqlite3 используется для модификации поведения стандартной библиотеки database/sql (а именно регистрация драйвера SQLite) и затрагивает все 8 функций в internal/db/sqlite.go.

Безопасность зависимостей

Анализ зависимостей на известные уязвимости с помощью утилиты govulncheck (официальный инструмент, использующий официальную базу уязвимостей) дал такой результат (это именно вызовы уязвимых функций, подробные результаты см. в директории govulncheck):

Vulnerability #1: GO-2026-4341 Memory exhaustion in query parameter parsing in net/url (More info: https://pkg.go.dev/vuln/GO-2026-4341)

Vulnerability #2: GO-2025-3849 Incorrect results returned from Rows.Scan in database/sql (More info: https://pkg.go.dev/vuln/GO-2025-3849)

Your code is affected by 2 vulnerabilities from the Go standard library. This scan also found 4 vulnerabilities in packages you import and 29 vulnerabilities in modules you require, but your code doesn't appear to call these vulnerabilities.