4
/10
Прожарка: mlogtail
Оценка: 4/10
Критично
- [✓ ФАКТ: Код-Рентген] main.go:123 –
uint32‑приведение кintбез проверки знака (semgrep). При больших значениях может получиться отрицательное число и сбой подсчётов. - [⚠ МНЕНИЕ] main.go:71 –
fmt.Printf("Cannot open %s: %s\n", cfg.listen, err)– выводитcfg.listen, которое всегда пусто; реальный адрес хранится вcfg.lnAddress. Пользователь получит вводящий в заблуждение лог. - [⚠ МНЕНИЕ] main.go:84‑90 – парсинг
socketModeчерезfmt.Sprintf("0%d", cfg.socketMode)формирует строку вида0123, аParseIntинтерпретирует её как десятичную, а не как восьмеричную. В результате права сокета могут быть заданы неверно. - [⚠ МНЕНИЕ] main.go:27‑33 – импортированы
runtime,regexp,syscall, но нигде не используются → лишний код, мешает статическому анализу и увеличивает размер бинарника. - [⚠ МНЕНИЕ] main.go:44‑58 – блок с
pprofполностью закомментирован, но оставлен в репозитории. Если включить, то в продакшн‑бинарник попадёт отладочный код без защиты.
Надо переделать
- [⚠ МНЕНИЕ] Удалить неиспользуемые импорты и закомментированный
pprof‑блок; добавитьgo.modиgo.sumдля управления зависимостями. - [⚠ МНЕНИЕ] Переписать вывод ошибок в
createListenerтак, чтобы использоваласьcfg.lnAddress. Сейчас сообщение «Cannot open : …» не помогает. - [⚠ МНЕНИЕ] Заменить парсинг прав сокета на
mode, _ := strconv.ParseUint(fmt.Sprintf("%03o", cfg.socketMode), 8, 32)либо принять режим уже в восьмеричном виде. - [⚠ МНЕНИЕ] Добавить обработку сигналов (
os/signal.Notify) и корректное закрытие listener черезdefer closeListener(ln, cfg). - [⚠ МНЕНИЕ] Переместить парсинг флагов в отдельный файл (
flags.go) и вынести бизнес‑логику изmain.goв пакет (parser), чтобы тестировать её отдельно.
Мелочи
- [⚠ МНЕНИЕ] Имена полей
Config(например,lnNetworkType) используют «ln», а не «listener», что снижает читаемость. - [⚠ МНЕНИЕ] В строке
fmt.Printf("Canot open logfile: %s\n", err)опечатка «Canot». - [⚠ МНЕНИЕ] В
READMEиREADME_ruдублируется информация, аLICENSEсодержит текст FSF, не совпадающий с автором – подозрение на копипаст. - [⚠ МНЕНИЕ] Нет
go.mod,gitignoreи CI‑конфигураций – проект трудно собрать в чистой среде. - [⚠ МНЕНИЕ] Отсутствует тестовый пакет, хотя файл
postfix_test.goпустой.
Что хорошо
- [⚠ МНЕНИЕ] Приложение действительно умеет «tail‑ить» postfix‑лог и выдавать статистику через UNIX‑socket – полезно для мониторинга.
- [⚠ МНЕНИЕ] Используется проверенный пакет
github.com/hpcloud/tail, что упрощает работу с «живыми» файлами. - [⚠ МНЕНИЕ] В репозитории есть
mlogtail.service– готовый systemd‑юнит, позволяющий запускать демона как сервис. - [⚠ МНЕНИЕ] Версия хранится в отдельном файле
version.go, что упрощает bump‑версий. - [⚠ МНЕНИЕ] Присутствует конфигурация Zabbix‑шаблонов, что сразу делает интеграцию в систему мониторинга.
- [⚠ МНЕНИЕ] Код компилируется в один статический бинарник (
bin/mlogtail-linux_amd64), удобно развёртывать.
Вердикт
Рабочий, но копипаст‑потрошенный проект: без тестов, с «мусором» в коде и минимумом оригинальности.
Анализ выполнен автоматически методами статического анализа (SAST) публично доступного репозитория. Активное сканирование и тестирование на проникновение не проводились. Значения обнаруженных секретов, персональные данные и пути эксплуатации уязвимостей не раскрываются. Цитирование кода — в соответствии со ст. 1274 ГК РФ. Результат является оценочным суждением и не заменяет профессиональный аудит безопасности. Пункты помечены: ✓ факт (линтер), ⚠ мнение (AI), ✗ неверно (опровергнуто).