5
/10
Прожарка: VoiceSummary
Оценка: 5/10
Критично
- [⚠ МНЕНИЕ] ai.py: строка 131 и 142 –
subprocess.run()вызывается с переменной, полученной из пользовательского ввода (audio_path). Отсутствует проверка/экранирование, что открывает путь к командному инжекшну. - [⚠ МНЕНИЕ] ai.py: строка 347 – запрос к внешнему API (
requests.post(...)) без параметраtimeout. При медленном ответе процесс зависнет, а в продакшн‑окружении это может привести к Denial‑of‑Service. - [⚠ МНЕНИЕ] main.py: строка 334, 397 – ещё один вызов
subprocess.Popenс аргументом, сформированным из строки, получаемой от Telegram‑бота. Нет валидации, значит возможен RCE. - [⚠ МНЕНИЕ] voice.py: строка 30 – запуск
ffmpegчерез частичный путь ("ffmpeg"). На системах безffmpegв$PATHпроцесс упадёт, а если в$PATHокажется вредоносный бинарник – приведёт к исполнению чужого кода.
Надо переделать
- [⚠ МНЕНИЕ] Объединить работу с
subprocessв один безопасный помощник, где каждый аргумент передаётся как отдельный элемент списка и где ввод проходит проверку (например, через whitelist расширений файлов). - [⚠ МНЕНИЕ] Добавить таймауты ко всем сетевым запросам (
requests.get/post(..., timeout=5)). - [⚠ МНЕНИЕ] Вынести строки‑сообщения и пути в отдельный конфигурационный файл (
config.yaml), а не «зашивать» их в код. Это упростит локализацию и тестирование. - [⚠ МНЕНИЕ] Переименовать функции в более описательные:
transcribe()→transcribe_audio_to_text(),summarize()→generate_summary(). Сейчас имена слишком короткие и не отражают бизнес‑логику. - [⚠ МНЕНИЕ] Убрать дублирование кода: в
ai.pyиvoice.pyпочти одинаковые блоки запускаffmpeg. Выделить их в модульutils/ffmpeg.py.
Мелочи
- [⚠ МНЕНИЕ] PEP 8: в некоторых файлах отсутствуют две пустые строки перед классом/функцией, а в остальных — лишние пробелы перед запятыми.
- [⚠ МНЕНИЕ] Импортировать только нужное:
import os, sys, subprocessвmain.py, хотяosиsysне используются. - [⚠ МНЕНИЕ] Логирование: в проекте используется
print()вместоlogging. При работе в продакшн‑режиме это затрудняет отладку и сбор метрик. - [⚠ МНЕНИЕ] Докстринги: почти нет ни одной строки‑описания функций; автодокументация будет пустой.
Что хорошо
- [⚠ МНЕНИЕ] Разделение ответственности: есть отдельные модули —
ai.py(работа с моделями),voice.py(обработка аудио),main.py(взаимодействие с Telegram). Это упрощает навигацию. - [⚠ МНЕНИЕ] Явные типы: в большинстве функций присутствуют аннотации (
def transcribe(audio_path: str) -> str:), что повышает читаемость и облегчает статический анализ. - [⚠ МНЕНИЕ] Обработчики ошибок: в
ai.pyобёрнуты вызовы к внешним сервисам вtry/except, и при падении возвращается пользовательское сообщение вместо трассировки. - [⚠ МНЕНИЕ] README: содержит инструкцию по запуску, список зависимостей и пример использования бота, что облегчает старт для новых разработчиков.
- [⚠ МНЕНИЕ] Лицензия MIT: открытая, без конфликтов с авторством.
Вердикт
Добротный прототип, но без надёжных барьеров – в бою может превратиться в «токен‑поток» уязвимостей.
Анализ выполнен автоматически методами статического анализа (SAST) публично доступного репозитория. Активное сканирование и тестирование на проникновение не проводились. Значения обнаруженных секретов, персональные данные и пути эксплуатации уязвимостей не раскрываются. Цитирование кода — в соответствии со ст. 1274 ГК РФ. Результат является оценочным суждением и не заменяет профессиональный аудит безопасности. Пункты помечены: ✓ факт (линтер), ⚠ мнение (AI), ✗ неверно (опровергнуто).