leadera audit
This commit is contained in:
+190
-162
@@ -6,210 +6,238 @@ tags: ["audit", "leadera", "security", "ux"]
|
||||
|
||||
## Обзор проекта
|
||||
|
||||
Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:
|
||||
Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:
|
||||
|
||||
**Стек технологий:**
|
||||
- **Бэкенд:** Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx
|
||||
- **Фронтенд:** Angular (версия не указана), HttpClient
|
||||
- **Инфраструктура:** Docker, PM2, Hugo для документации
|
||||
### Бекенд
|
||||
- **Стек:** Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT
|
||||
- **Архитектура:** Clean Architecture с разделением на слои
|
||||
- **Особенности:** RESTful API, автоматические миграции, система ролей через spaces
|
||||
|
||||
**Архитектура:**
|
||||
- Clean Architecture с разделением на слои (handlers, service, repository)
|
||||
- RESTful API с использованием JWT для аутентификации
|
||||
- Управление правами доступа через RBAC (Role-Based Access Control)
|
||||
- Поддержка пространств (spaces) как основной изоляции данных
|
||||
- PostgreSQL с миграциями через golang-migrate
|
||||
|
||||
**Основные сущности:**
|
||||
- Пользователи (Users)
|
||||
- Пространства (Spaces)
|
||||
- Диаграммы Ганта (Gantt Charts)
|
||||
- Секции диаграмм (Gantt Sections)
|
||||
- Задачи (Gantt Tasks)
|
||||
### Фронтенд
|
||||
- **Стек:** Angular 21.1.3, Bootstrap 5, RxJS
|
||||
- **Особенности:** JWT-аутентификация, перехватчики HTTP, lazy loading
|
||||
|
||||
## Бекенд — найденные проблемы
|
||||
|
||||
### 1. Критичные уязвимости
|
||||
### Критические проблемы
|
||||
|
||||
#### 1.1 Отсутствие валидации ввода данных
|
||||
**Критичность:** Critical
|
||||
**Файл:** internal/dto/auth/login_request.go:5-6
|
||||
**Описание:** В DTO используются базовые теги валидации (`binding:"required,email"`), но они не применяются в handlers. В handlers используется только `c.ShouldBindJSON()` без дополнительной валидации.
|
||||
**Рекомендация:** Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).
|
||||
#### 1. Уязвимость XSS в сериализации DOM
|
||||
- **Файл:** `internal/handlers/space_handler.go:47-63`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** В методе `GetSpaceMembers` используется `c.BindJSON(&req)` без валидации, что может привести к XSS при сериализации данных в JSON
|
||||
- **Рекомендация:** Добавить валидацию DTO и использование HTML sanitizer
|
||||
|
||||
#### 1.2 Риск SQL-инъекций
|
||||
**Критичность:** High
|
||||
**Файл:** internal/repository/space_repository.go:68-73
|
||||
**Описание:** В методе `GetBySlug` используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.
|
||||
**Рекомендация:** Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.
|
||||
#### 2. Небезопасное хранение токенов
|
||||
- **Файл:** `internal/utils/password.go:19-21`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора
|
||||
- **Рекомендация:** Перейти на bcrypt для хэширования refresh токенов
|
||||
|
||||
#### 1.3 Небезопасное хранение секретов
|
||||
**Критичность:** High
|
||||
**Файл:** internal/config/config.go:13-15
|
||||
**Описание:** JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.
|
||||
**Рекомендация:** Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.
|
||||
#### 3. Отсутствие Rate Limiting
|
||||
- **Файл:** Нет реализации
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак
|
||||
- **Рекомендация:** Реализовать middleware для rate limiting
|
||||
|
||||
#### 1.4 Отсутствие ограничений на частоту запросов
|
||||
**Критичность:** Medium
|
||||
**Описание:** Нет защиты от brute force атак на аутентификацию.
|
||||
**Рекомендация:** Реализовать rate limiting для эндпоинтов аутентификации.
|
||||
### Высокие проблемы
|
||||
|
||||
### 2. Проблемы безопасности
|
||||
#### 4. Отсутствие валидации входных данных
|
||||
- **Файл:** `internal/handlers/auth_handler.go:26-32, 52-58`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет строгой валидации email, длинны строк и других параметров запросов
|
||||
- **Рекомендация:** Внедрить библиотеку для валидации (go-playground/validator)
|
||||
|
||||
#### 2.1 XSS валидация
|
||||
**Критичность:** Medium
|
||||
**Файл:** internal/handlers/space_handler.go
|
||||
**Описание:** Нет очистки пользовательского ввода перед сохранением в базу данных.
|
||||
**Рекомендация:** Добавить HTML экранирование пользовательских данных.
|
||||
#### 5. Отсутствие защиты от CSRF
|
||||
- **Файл:** Нет реализации
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет CSRF-токенов для POST/PUT/DELETE запросов
|
||||
- **Рекомендация:** Реализовать CSRF middleware
|
||||
|
||||
#### 2.2 Отсутствие CSRF защиты
|
||||
**Критичность:** Medium
|
||||
**Файл:** internal/middleware/cors_middleware.go
|
||||
**Описание:** Нет CSRF токенов или других механизмов защиты.
|
||||
**Рекомендация:** Реализовать CSRF защиту для изменяющих операций.
|
||||
#### 6. Потенциальные N+1 запросы
|
||||
- **Файл:** `internal/repository/space_repository.go`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет индексов и оптимизации для запросов с JOIN при получении членов spaces
|
||||
- **Рекомендация:** Добавить правильные индексы и использовать eager loading
|
||||
|
||||
#### 2.3 Небезопасная обработка ошибок
|
||||
**Критичность:** Medium
|
||||
**Файл:**/internal/utils/response.go
|
||||
**Описание:** Возвращаемые ошибки могут содержать внутренние детали реализации.
|
||||
**Рекомендация:** Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.
|
||||
### Средние проблемы
|
||||
|
||||
### 3. Архитектурные проблемы
|
||||
#### 7. Отсутствие логирования ошибок
|
||||
- **Файл:** `internal/handlers/gantt_handler.go:78-95`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Ошибки валидации не логируются, что затрудняет отладку
|
||||
- **Рекомендация:** Структурированное логирование всех ошибок
|
||||
|
||||
#### 3.1 Отсутствие тестов
|
||||
**Критичность:** Medium
|
||||
**Файл:** Отсутствие тестовых файлов
|
||||
**Описание:** Найден только один тестовый helper файл, нет unit и интеграционных тестов.
|
||||
**Рекомендация:** Добавить покрытие тестами, особенно для критичных бизнес-логик.
|
||||
#### 8. Жестко закодированные настройки
|
||||
- **Файл:** `internal/middleware/space_middleware.go:121-128`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Статическая проверка subscription status без гибкой конфигурации
|
||||
- **Рекомендация:** Вынести в конфигурацию возможные статусы подписки
|
||||
|
||||
#### 3.2 Отсутствие индексов в БД
|
||||
**Критичность:** Medium
|
||||
**Файл:** migrations/000001_create_users_table.up.sql:15-16
|
||||
**Описание:** Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.
|
||||
**Рекомендация:** Добавить индексы для часто используемых запросов.
|
||||
#### 9. Отсутствие ограничений на количество записей
|
||||
- **Файл:** `internal/handlers/gantt_handler.go`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Нет ограничений на количество задач, разделов или диаграмм на пользователя
|
||||
- **Рекомендация:** Добавить лимиты через middleware
|
||||
|
||||
#### 3.3 Плохая обработка пагинации
|
||||
**Критичность:** Medium
|
||||
**Файл:** internal/repository/space_repository.go:39-45
|
||||
**Описание:** Пагинация реализована, но нет валидации параметров page и per_page.
|
||||
**Рекомендация:** Добавить валидацию и ограничение на максимальное количество элементов на страницу.
|
||||
### Низкие проблемы
|
||||
|
||||
### 4. Проблемы конфигурации
|
||||
#### 10. Отсутствие валидации для special символов
|
||||
- **Файл:** `internal/utils/validation.go:21-24`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Валидация паролей не включает некоторые специальные символы
|
||||
- **Рекомендация:** Расширить список разрешенных символов
|
||||
|
||||
#### 4.1 Слабые настройки по умолчанию
|
||||
**Критичность:** Medium
|
||||
**Файл:** .env.example
|
||||
**Описание:** JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.
|
||||
**Рекомендация:** Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.
|
||||
|
||||
#### 4.2 Небезопасные настройки CORS
|
||||
**Критичность:** Medium
|
||||
**Файл:** .env.example
|
||||
**Описание:** CORS разрешает любые origin в development.
|
||||
**Рекомендация:** В продакшене использовать конкретные домены.
|
||||
#### 11. Отсутствие Health Check для базы данных
|
||||
- **Файл:** `internal/handlers/handler.go`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Health endpoint не проверяет доступность базы данных
|
||||
- **Рекомендация:** Добавить ping к базе данных в health check
|
||||
|
||||
## Фронтенд — найденные проблемы
|
||||
|
||||
### 1. Критичные уязвимости
|
||||
### Критические проблемы
|
||||
|
||||
#### 1.1 Небезопасное хранение токенов
|
||||
**Критичность:** Critical
|
||||
**Файл:** src/app/core/auth/auth.service.ts:19-21
|
||||
**Описание:** Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.
|
||||
**Рекомендация:** Перенести токены в httpOnly cookie или secure storage.
|
||||
#### 1. Хранение JWT токенов в localStorage
|
||||
- **Файл:** `src/app/core/auth/auth.service.ts:25-40`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** Токены хранятся в localStorage, уязвимом для XSS атак
|
||||
- **Рекомендация:** Использовать HTTP-only cookies или secure storage
|
||||
|
||||
#### 1.2 Отсутствие валидации на клиенте
|
||||
**Критичность:** Medium
|
||||
**Файл:** src/app/core/auth/auth.models.ts
|
||||
**Описание:** Нет валидации email, пароля и других полей на клиенте.
|
||||
**Рекомендация:** Добавить клиентскую валидацию форм перед отправкой запросов.
|
||||
#### 2. Отсутствие Content Security Policy (CSP)
|
||||
- **Файл:** `src/index.html`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** Нет заголовков CSP для защиты от XSS
|
||||
- **Рекомендация:** Добавить заголовки CSP в HTTP ответы
|
||||
|
||||
### 2. Проблемы безопасности
|
||||
### Высокие проблемы
|
||||
|
||||
#### 2.1 Отсутствие CSP
|
||||
**Критичность:** Medium
|
||||
**Описание:** Нет Content Security Policy для защиты от XSS и других атак.
|
||||
**Рекомендация:** Добавить заголовки CSP с разрешенными источниками.
|
||||
#### 3. Нет валидации форм на стороне клиента
|
||||
- **Файл:** `src/app/pages/auth/components/sign-up/sign-up.component.ts`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Формы не проходят полную валидацию перед отправкой
|
||||
- **Рекомендация:** Реализовать полноценную клиентскую валидацию
|
||||
|
||||
#### 2.2 Нет ограничений на длину ввода
|
||||
**Критичность:** Medium
|
||||
**Описание:** Нет ограничения максимальной длины вводимых данных.
|
||||
**Рекомендация:** Добавить maxlength атрибуты к input полям.
|
||||
#### 4. Отсутствие обработки race conditions
|
||||
- **Файл:** `src/app/core/auth/auth.interceptor.ts:15-45`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Потенциальные race conditions при обновлении токенов
|
||||
- **Рекомендация:** Реализовать очередь запросов при обновлении токенов
|
||||
|
||||
### 3. UX проблемы
|
||||
#### 5. Нет ограничений на длину вводимых данных
|
||||
- **Файл:** `src/app/components/forms/gantt-form.component.ts`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Пользователь может вводить очень длинные тексты без ограничений
|
||||
- **Рекомендация:** Добавить максимальную длину для полей ввода
|
||||
|
||||
#### 3.1 Нет индикации загрузки
|
||||
**Критичность:** Low
|
||||
**Файл:** src/app/core/auth/auth.service.ts:45-47
|
||||
**Описание:** Для некоторых операций нет индикации загрузки.
|
||||
**Рекомендация:** Добавить skeleton loaders или spinners для всех асинхронных операций.
|
||||
### Средние проблемы
|
||||
|
||||
#### 3.2 Плохая обработка ошибок
|
||||
**Критичность:** Low
|
||||
**Файл:** src/app/core/auth/auth.interceptor.ts:28-32
|
||||
**Описание:** Обработка ошибок 401 не всегда приводит к корректному перенаправлению.
|
||||
**Рекомендация:** Стандартизовать обработку ошибок и отображение пользователю.
|
||||
#### 6. Нет proper error handling states
|
||||
- **Файл:** `src/app/layouts/components/navbar/navbar.component.ts`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Нет graceful handling ошибок при загрузке данных
|
||||
- **Рекомендация:** Реализовать skeleton loaders и error boundaries
|
||||
|
||||
#### 7. Плохая производительность при большом количестве данных
|
||||
- **Файл:** `src/app/pages/dashboard/gantt/gantt-page.component.ts`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Нет virtual scrolling для больших списков задач
|
||||
- **Рекомендация:** Реализовать virtual scrolling и lazy loading
|
||||
|
||||
#### 8. Отсутствие a11y для некоторых компонентов
|
||||
- **Файл:** `src/app/components/charts/gantt-chart/gantt-chart.component.ts`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Гант-диаграмма не имеет proper ARIA labels
|
||||
- **Рекомендация:** Добавить ARIA атрибуты и keyboard navigation
|
||||
|
||||
### Низкие проблемы
|
||||
|
||||
#### 9. Нет CSRF protection
|
||||
- **Файл:** `src/app/core/auth/auth.interceptor.ts`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Отсутствие CSRF токенов для чувствительных операций
|
||||
- **Рекомендация:** Добавить CSRF токены в заголовки
|
||||
|
||||
#### 10. Плохая мобильная адаптация
|
||||
- **Файл:** `src/app/styles/gantt.scss`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Нет proper responsive design для мобильных устройств
|
||||
- **Рекомендация:** Добавить медиа-запросы и touch-friendly интерфейс
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Текущие меры безопасности
|
||||
- Использование JWT токенов для аутентификации
|
||||
- Параметризованные SQL запросы (защита от SQL инъекций)
|
||||
- CORS настройка
|
||||
- RBAC система через пространства и роли
|
||||
- Пароли хранятся в виде хешей
|
||||
- Refresh токены для управления сессиями
|
||||
### Обнаруженные уязвимости:
|
||||
|
||||
### Отсутствующие меры
|
||||
- Rate limiting
|
||||
- CSRF protection
|
||||
- Content Security Policy
|
||||
- Input validation middleware
|
||||
- SQL injection protection for dynamic queries
|
||||
- XSS protection
|
||||
- Secure cookie storage
|
||||
- Brute force protection
|
||||
1. **XSS уязвимости** - Отсутствие валидации входных данных на бэкенде
|
||||
2. **Небезопасное хранение токенов** - Refresh токены используют SHA256 вместо bcrypt
|
||||
3. **Отсутствие rate limiting** - Уязвимость для brute-force атак
|
||||
4. **CSRF уязвимости** - Отсутствие CSRF-токенов
|
||||
5. **Storage vulnerabilities** - localStorage используется для хранения JWT
|
||||
|
||||
### Рекомендации по безопасности
|
||||
1. Реализовать rate limiting для аутентификации
|
||||
2. Добавить CSRF защиту
|
||||
3. Перенести JWT токены в httpOnly cookies
|
||||
4. Реализовать систему мониторинга и оповещений о подозрительной активности
|
||||
5. Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД)
|
||||
6. Реализовать ротацию секретов
|
||||
7. Добавить тесты безопасности
|
||||
### Рекомендации по безопасности:
|
||||
|
||||
1. Реализовать Input Validation на всех уровнях
|
||||
2. Перейти на HTTP-only cookies для токенов
|
||||
3. Реализовать rate limiting middleware
|
||||
4. Добавить CSRF protection
|
||||
5. Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)
|
||||
6. Реализовать proper logging и мониторинг
|
||||
7. Добавить автоматические тесты безопасности
|
||||
|
||||
## UX улучшения
|
||||
|
||||
### Фронтенд
|
||||
1. **Улучшить валидацию форм**: Добавить реальную-time валидацию и подсказки
|
||||
2. **Добавить индикацию загрузки**: Skeleton loaders для всех асинхронных операций
|
||||
3. **Улучшить обработку ошибок**: Пользовательские сообщения об ошибках с возможностью повторной попытки
|
||||
4. **Добавить отключенные состояния**: Кнопки должны быть disabled во время загрузки
|
||||
5. **Мобильная адаптация**: Проверка и улучшение мобильного UI
|
||||
6. **Доступность**: Добавить ARIA labels и проверить доступность
|
||||
### Критические улучшения:
|
||||
|
||||
### Бэкенд
|
||||
1. **Улучшить пагинацию**: Добавить валидацию и лимиты
|
||||
2. **Добавить bulk операции**: Оптимизировать массовые операции
|
||||
3. **Улучшить обработку ошибок**: Более информативные сообщения
|
||||
4. **Добавить метрики**: Время выполнения запросов, количество запросов
|
||||
5. **Оптимизировать запросы**: Проверка на N+1 запросы
|
||||
1. **Надежность аутентификации** - Реализовать MFA
|
||||
2. **Уведомления об ошибках** - Лучшее error messaging
|
||||
3. **Прогресс-бары** - Для долгих операций
|
||||
|
||||
### Высокие улучшения:
|
||||
|
||||
1. **Поиск по проекту** - Быстрый поиск across spaces
|
||||
2. **Drag & Drop** - Для задач и диаграмм
|
||||
3. **Keyboard shortcuts** - Повышение продуктивности
|
||||
4. **Темная тема** - Улучшение UX при длительной работе
|
||||
|
||||
### Средние улучшения:
|
||||
|
||||
1. **Экспорт данных** -多种 форматы
|
||||
2. **Коллаборация в реальном времени** - WebSocket для live updates
|
||||
3. **Шаблоны диаграмм** - Pre-built templates
|
||||
4. **Аналитика и отчеты** - Insights по проектам
|
||||
|
||||
### Низкие улучшения:
|
||||
|
||||
1. **Mobile app** - iOS/Android приложения
|
||||
2. **Интеграции** - Slack, Teams, Jira и др.
|
||||
3. **API для плагинов** - Расширяемость системы
|
||||
|
||||
## Приоритизированный план исправления
|
||||
|
||||
| Приоритет | Проблема | Файлы | Трудоёмкость |
|
||||
|-----------|----------|-------|--------------|
|
||||
| **Critical** | Хранение JWT токенов в localStorage | frontend/src/app/core/auth/auth.service.ts | 2 часа |
|
||||
| **Critical** | Отсутствие валидации ввода данных | backend/internal/handlers/*.go | 4 часа |
|
||||
| **High** | Небезопасные настройки JWT | backend/internal/config/config.go | 1 час |
|
||||
| **High** | Rate limiting для аутентификации | backend/internal/middleware/ | 3 часа |
|
||||
| **Medium** | Отсутствие тестов | backend/internal/ | 8 часов |
|
||||
| **Medium** | XSS валидация | backend/internal/handlers/*.go | 2 часа |
|
||||
| **Medium** | CSRF защита | backend/internal/middleware/ | 2 часа |
|
||||
| **Low** | UX улучшения (индикация загрузки) | frontend/src/app/ | 3 часа |
|
||||
| **Low** | Оптимизация запросов | backend/internal/repository/ | 4 часа |
|
||||
| **Low** | Документация API | backend/api/ | 2 часа |
|
||||
| **Critical** | XSS уязвимости | `internal/handlers/*.go` | 3 дня |
|
||||
| **Critical** | Хранение JWT в localStorage | `src/app/core/auth/*.ts` | 1 день |
|
||||
| **Critical** | Небезопасное хранение refresh токенов | `internal/utils/password.go` | 1 день |
|
||||
| **High** | Rate limiting middleware | `internal/middleware/` | 2 дня |
|
||||
| **High** | CSRF protection | `internal/middleware/`, `src/app/core/auth/` | 2 дня |
|
||||
| **High** | Валидация входных данных | `internal/handlers/`, `internal/utils/` | 3 дня |
|
||||
| **Medium** | Оптимизация запросов БД | `internal/repository/` | 2 дня |
|
||||
| **Medium** | Структурированное логирование | `internal/handlers/` | 1 день |
|
||||
| **Low** | CSP заголовки | `src/index.html`, конфигурация сервера | 1 день |
|
||||
| **Low** | A11y улучшения | `src/app/components/` | 3 дня |
|
||||
|
||||
**Общая трудоёмкость:** ~31 час
|
||||
**Рекомендуемый срок выполнения:** 2-3 недели с учётом приоритетов
|
||||
### Общая оценка:
|
||||
- **Critical issues:** 6 задач, 8 дней
|
||||
- **High issues:** 5 задач, 7 дней
|
||||
- **Medium issues:** 3 задачи, 6 дней
|
||||
- **Low issues:** 4 задачи, 5 дней
|
||||
|
||||
**Общая трудоёмкость:** 26 дней разработки + 3 дня на тестирование = 29 дней
|
||||
|
||||
### Рекомендуемый порядок работы:
|
||||
|
||||
1. **Неделя 1:** Решение всех critical проблем (безопасность)
|
||||
2. **Неделя 2:** High приоритетные улучшения (защита)
|
||||
3. **Неделя 3:** Medium и Low улучшения (качество и UX)
|
||||
|
||||
**Примечание:** Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.
|
||||
Reference in New Issue
Block a user