Some checks failed
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
Deploy Telegram Bot / Deploy Telegram Bot (push) Has been cancelled
This will show the exact reason for token verification failure
6.2 KiB
6.2 KiB
Анализ безопасности админских endpoints авторизации
Текущие публичные endpoints
POST /api/v2/admin/auth/request-code- генерация кодаPOST /api/v2/admin/auth/verify-code- верификация кода и получение токенаGET /api/v2/admin/auth/code-status/<code>- проверка статуса кода
Анализ безопасности
✅ Существующие защиты
-
Двухфакторная аутентификация через Telegram
- Код должен быть заявлен админом в Telegram боте
- Проверка, что
telegramUserIdнаходится в списке админов - Без доступа к Telegram аккаунту админа невозможно получить доступ
-
Ограничения кода
- Код одноразовый (
isUsed) - Срок действия 5 минут
- Код генерируется случайно (100000-999999)
- Код одноразовый (
-
Проверка прав доступа
- Даже если код заявлен, проверяется, что пользователь имеет
admin=trueв БД - Новые пользователи не получают админские права автоматически
- Даже если код заявлен, проверяется, что пользователь имеет
⚠️ Потенциальные уязвимости
-
Отсутствие rate limiting
- Можно генерировать неограниченное количество кодов
- Можно делать множество попыток верификации (брутфорс)
- Можно часто проверять статус кодов
-
Брутфорс кода
- 6-значный код = 900,000 возможных комбинаций
- Без rate limiting можно перебрать все коды за несколько часов
- НО: код должен быть заявлен админом, что защищает от брутфорса
-
Утечка информации через code-status
- Можно проверять статус любых кодов
- Раскрывает информацию о существовании кодов
- Может помочь в брутфорсе (если знать, что код существует)
-
Отсутствие защиты от перехвата
- Код передается открыто (но это необходимо для UX)
- HTTPS должен использоваться обязательно
Рекомендации по улучшению
1. Добавить Rate Limiting (КРИТИЧНО)
Создан файл admin_auth_rate_limiter.dart с реализацией:
- Генерация кодов: максимум 10 кодов в час с одного IP
- Верификация: максимум 20 попыток в час с одного IP
- Проверка статуса: максимум 30 запросов в минуту с одного IP
Как применить:
// В main.dart или где настраивается middleware
final rateLimiter = AdminAuthRateLimiter();
final app = Pipeline()
.addMiddleware(adminAuthRateLimit(rateLimiter))
.addMiddleware(/* другие middleware */)
.addHandler(router);
2. Усилить защиту от брутфорса
- Добавить задержку после неудачных попыток верификации
- Логировать все попытки верификации для мониторинга
- Блокировать IP после N неудачных попыток
3. Ограничить доступ к code-status
- Требовать минимальную авторизацию (например, по IP whitelist)
- Или использовать временный токен для проверки статуса
- Или ограничить проверку только для кодов, созданных с того же IP
4. Мониторинг и алертинг
- Логировать все попытки генерации кодов
- Логировать все попытки верификации (успешные и неуспешные)
- Отправлять алерты при подозрительной активности
5. Дополнительные меры
- Использовать CAPTCHA для генерации кодов (опционально)
- Добавить проверку User-Agent и других заголовков
- Использовать более длинные коды (8-10 цифр) для большей энтропии
Оценка текущего уровня безопасности
Текущий уровень: СРЕДНИЙ
Почему не КРИТИЧНО небезопасно:
- Основная защита работает: код должен быть заявлен админом в Telegram
- Брутфорс неэффективен: даже если перебрать все коды, они не будут заявлены админом
- Одноразовость: использованный код нельзя использовать повторно
Почему нужно улучшить:
- DoS атаки: можно перегрузить сервер запросами
- Информационная утечка: code-status раскрывает информацию
- Лучшие практики: rate limiting - стандартная практика безопасности
Вывод
Текущая реализация достаточно безопасна для production, но настоятельно рекомендуется добавить rate limiting для защиты от DoS атак и улучшения общей безопасности.
Основная защита (требование заявки кода админом) работает корректно и защищает от несанкционированного доступа даже без rate limiting.