6.9 KiB
6.9 KiB
Отчёт об аудите (07.06.2026)
Найдено
🔴 Критичные
-
Краш при отсутствии Bluetooth
- Файл: android/app/src/main/java/ru/elmer/client/ui/MainActivity.kt
- Строки: 155, 230, 310
- Описание: Используется оператор
!!дляbtAdapter. На устройствах без Bluetooth (или в эмуляторе) приложение упадёт при попытке проверить прибор или запустить сканирование. - Как исправить: Добавить проверку
if (btAdapter == null)перед использованием и выводить сообщение об ошибке.
-
Отсутствие аутентификации на сервере
- Файл: api/routes.py
- Описание: Эндпоинты
/api/v1/session/upload,/api/v1/chatи/api/v1/ping-llmпринимают запросы без проверки API-ключа. Клиент передаётX-Api-Key, но сервер его игнорирует. Любой может отправлять запросы и тратить токены LLM. - Как исправить: Добавить декоратор
@api_key_requiredили проверку заголовка вbefore_request.
-
Состязание потоков (Race Condition) в ScriptRunnerService
- Файл: android/app/src/main/java/ru/elmer/client/script/ScriptRunnerService.kt
- Описание:
onStartCommandне проверяет, запущен ли уже процесс. Если дважды вызватьstartForegroundService(нажав кнопку несколько раз), создадутся два конкурирующих потокаScriptRunner, которые будут одновременно работать с одним и тем же Bluetooth-сокетом. - Как исправить: В
startRunпроверять флагrunningи игнорировать повторные запуски.
-
Логическая ошибка в выборе Bluetooth-устройства
- Файл: android/app/src/main/java/ru/elmer/client/ui/MainActivity.kt
- Описание: Функция
findElmDevice()при наличии двух и более устройств показывает диалог, но возвращаетnullнемедленно. Стейт-машина (checkElm,scanDtc) видитnullи прерывает работу с ошибкой «ELM не найден». - Как исправить: Перестроить логику: диалог выбора должен вызываться отдельно, сохранять
elmDevice, и только потом запускать операции.
🟡 Средние
-
Утечка памяти в ElmChecker
- Файл: android/app/src/main/java/ru/elmer/client/elm/ElmChecker.kt
- Описание: Список
logLinesявляется членом класса. ВMainActivityэкземплярelmCheckerпереиспользуется. Приложение копит логи всех операций в памяти до своей гибели. - Как исправить: Очищать
logLinesв начале каждой операции или переносить лог в локальную переменную методаrun().
-
Утечка курсоров в БД
- Файл: android/app/src/main/java/ru/elmer/client/db/SessionDb.kt
- Описание: Методы
getResponses,getSessions,getPendingSessionsвызываютcursor.close()в конце цикла, но не вfinally. При ошибке чтения курсор останется открытым. - Как исправить: Использовать конструкцию
.use { ... }(в Kotlin дляCursorдоступно начиная с определенных версий) илиtry { ... } finally { cursor.close() }.
-
Не включены Foreign Keys
- Файл: android/app/src/main/java/ru/elmer/client/db/SessionDb.kt
- Описание: Несмотря на наличие
REFERENCES sessions(id), SQLite в Android по умолчанию не проверяет целостность связей. - Как исправить: Добавить
db.setForeignKeyConstraintsEnabled(true)вonConfigure.
-
Слепой выбор устройства в сервисе
- Файл: android/app/src/main/java/ru/elmer/client/script/ScriptRunnerService.kt
- Описание: Сервис берёт
bonded[0]— первое попавшееся сопряжённое устройство. Это могут быть наушники или магнитола. - Как исправить: Передавать MAC-адрес выбранного ELM через
Intent.
-
Отсутствие лимита на размер запроса
- Файл: api/routes.py
- Описание: Сервер принимает список
responsesлюбого размера. Злоумышленник может отправить миллион строк, вызвав OOM или переполнение диска логами. - Как исправить: Проверять
len(responses)перед обработкой.
🟢 Косметика
-
Неиспользуемые переменные
- В
ElmProtocol.ktконстантаINIT_TIMEOUTи другие не используются. - В
MainActivity.ktсписокchatHistoryхранится в памяти, но не восстанавливается послеonSaveInstanceState.
- В
-
Устаревший API
BluetoothAdapter.getDefaultAdapter()помечен как Deprecated. В современных Android рекомендуется использоватьBluetoothManager.
-
Бесполезный пинг LLM
- Эндпоинт
/api/v1/ping-llmделает реальныйdiagnose, что стоит денег (токенов). Кэш есть, но при перезапуске сервера или по таймауту он всё равно будет жечь токены на "пустые" проверки.
- Эндпоинт