Security Audit Report v1.0¶
Версия: 1.0 Дата: 13.01.2026 Контракт: order-001-phase1-ru Задача: 2.2.5 Security Audit (A4A-23)
Executive Summary¶
Общая оценка безопасности: GOOD¶
Система CalmTrader демонстрирует хороший уровень безопасности с правильно настроенной инфраструктурой. Выявлено несколько замечаний, требующих внимания, но критических уязвимостей не обнаружено.
Статистика находок¶
| Severity | Количество | Статус |
|---|---|---|
| Critical | 0 | — |
| High | 0 | — |
| Medium | 3 | Требуют исправления |
| Low | 3 | Рекомендуется исправить |
| Info | 2 | Best practice |
Ключевые рекомендации¶
- Обновить urllib3 до версии 2.6.3 (3 CVE)
- Исправить права .env файла (644 → 600)
- Добавить HTTP security headers в Traefik
Scope аудита¶
| Область | Статус | Комментарий |
|---|---|---|
| Code Analysis | ✅ Выполнено | bandit, pip-audit |
| Infrastructure | ✅ Выполнено | SSH, UFW, Docker |
| Network | ✅ Выполнено | Ports, SSL/TLS |
| Dependencies | ✅ Выполнено | CVE scanning |
| Configuration | ✅ Выполнено | Docker, Traefik |
Findings¶
[MED-001] Уязвимости в urllib3¶
Severity: Medium Category: Dependencies CWE: Multiple CVEs
Описание: В зависимости urllib3 версии 2.5.0 обнаружено 3 уязвимости:
| CVE | Severity | Описание |
|---|---|---|
| CVE-2025-66418 | Medium | Request smuggling vulnerability |
| CVE-2025-66471 | Medium | Header injection |
| CVE-2026-21441 | Medium | Proxy authentication leak |
Evidence:
$ pip-audit
Found 3 known vulnerabilities in 1 package
Name Version ID Fix Versions
urllib3 2.5.0 CVE-2025-66418 2.6.3
urllib3 2.5.0 CVE-2025-66471 2.6.3
urllib3 2.5.0 CVE-2026-21441 2.6.3
Impact: Потенциальная возможность HTTP request smuggling и утечки credentials при использовании прокси.
Recommendation:
Priority: High (исправить в течение 24 часов)
[MED-002] Небезопасные права на .env файл¶
Severity: Medium Category: Infrastructure CWE: CWE-732 (Incorrect Permission Assignment)
Описание:
Файл .env с credentials имеет права 644 (readable by all), что позволяет любому пользователю системы прочитать секреты.
Evidence:
Impact: Компрометация всех секретов (database password, API keys, Telegram token) при получении доступа к серверу под любым пользователем.
Recommendation:
Priority: High (исправить немедленно)
[MED-003] Отсутствуют HTTP Security Headers¶
Severity: Medium Category: Network CWE: CWE-693 (Protection Mechanism Failure)
Описание: HTTP responses не содержат стандартных security headers.
Отсутствующие headers:
- Strict-Transport-Security (HSTS)
- X-Content-Type-Options
- X-Frame-Options
- Referrer-Policy
Impact: Уязвимость к clickjacking, MIME-type sniffing, downgrade attacks.
Recommendation:
Добавить в infrastructure/traefik/dynamic/headers.yml:
http:
middlewares:
security-headers:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
frameDeny: true
contentTypeNosniff: true
referrerPolicy: "strict-origin-when-cross-origin"
Priority: Medium (исправить в течение 1 недели)
[LOW-001] SSH использует настройки по умолчанию¶
Severity: Low Category: Infrastructure CWE: CWE-16 (Configuration)
Описание: SSH конфигурация использует дефолтные значения. Рекомендуется явно отключить password authentication.
Evidence:
$ grep -E 'PermitRoot|Password|PubkeyAuth' /etc/ssh/sshd_config
# Все значения закомментированы (defaults)
Current defaults (безопасны): - PermitRootLogin: prohibit-password - PasswordAuthentication: yes (но ключи работают) - PubkeyAuthentication: yes
Recommendation:
Явно указать в /etc/ssh/sshd_config:
Priority: Low (рекомендуется при следующем обслуживании)
[LOW-002] Использование random.choice для выбора изображений¶
Severity: Low Category: Application CWE: CWE-330 (Insufficient Random Values) Bandit: B311
Описание:
В apps/api/app/routers/images.py используется random.choice() для выбора случайного изображения. Это не криптографический random.
Evidence:
Impact: Минимальный. Используется для выбора изображения, не для security-critical операций.
Recommendation: Оставить как есть — для данного use case криптографический random не требуется.
Priority: None (информационно)
[LOW-003] Binding на 0.0.0.0 в Bot¶
Severity: Low Category: Application CWE: CWE-200 (Information Exposure) Bandit: B104
Описание:
Bot webhook сервер биндится на 0.0.0.0:8080.
Evidence:
Impact: Нет реального риска — сервис работает в Docker контейнере, порт не экспортирован наружу напрямую. Traefik проксирует запросы.
Recommendation: Оставить как есть — это стандартная практика для контейнеризированных приложений.
Priority: None (ожидаемое поведение)
[INFO-001] Рекомендуется добавить Rate Limiting¶
Severity: Info Category: Application
Описание: API endpoints не имеют rate limiting, что может привести к abuse.
Recommendation: Добавить rate limiting в Traefik или на уровне приложения для защиты от брутфорса и DoS.
[INFO-002] Рекомендуется настроить Sentry¶
Severity: Info Category: Monitoring
Описание: Error tracking через Sentry не настроен. Это затрудняет обнаружение и анализ ошибок в production.
Recommendation: Интегрировать Sentry для мониторинга ошибок:
Infrastructure Assessment¶
Firewall (UFW)¶
Status: ✅ PASS
Status: active
Logging: on (low)
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
Assessment: Правильно настроен — только необходимые порты открыты.
Open Ports¶
Status: ✅ PASS
LISTEN 0 4096 0.0.0.0:443 * traefik
LISTEN 0 4096 0.0.0.0:80 * traefik
LISTEN 0 128 0.0.0.0:22 * sshd
Assessment: Только Traefik (80/443) и SSH (22) слушают на внешних интерфейсах. PostgreSQL, Redis, MinIO доступны только во внутренней Docker сети.
Docker Security¶
Status: ✅ PASS
Assessment: AppArmor и seccomp включены, обеспечивая дополнительный уровень изоляции контейнеров.
SSL/TLS¶
Status: ✅ PASS
Assessment: Валидный сертификат с автоматическим обновлением.
Container Health¶
Status: ✅ PASS
| Container | Status |
|---|---|
| traefik | healthy |
| trader-psy-db | healthy |
| trader-psy-redis | healthy |
| trader-psy-minio | healthy |
| trader-psy-api | healthy |
| trader-psy-bot | healthy |
| trader-psy-agent | healthy |
| trader-psy-mini-app | healthy |
| trader-psy-admin | healthy |
| trader-psy-docs | healthy |
OWASP Top 10 Assessment¶
| # | Vulnerability | Status | Notes |
|---|---|---|---|
| A01 | Broken Access Control | ✅ PASS | is_admin flag, role checks |
| A02 | Cryptographic Failures | ✅ PASS | TLS enabled, no plaintext secrets |
| A03 | Injection | ✅ PASS | SQLAlchemy ORM, no raw SQL |
| A04 | Insecure Design | ✅ PASS | Input validation present |
| A05 | Security Misconfiguration | ⚠️ PARTIAL | Missing headers (MED-003) |
| A06 | Vulnerable Components | ⚠️ PARTIAL | urllib3 CVEs (MED-001) |
| A07 | Auth Failures | ✅ PASS | Telegram auth validated |
| A08 | Software/Data Integrity | ✅ PASS | Lock files, CI/CD |
| A09 | Logging Failures | ✅ PASS | Structured logging |
| A10 | SSRF | ✅ PASS | No user-controlled URLs |
Remediation Plan¶
Immediate (24 часа)¶
| ID | Action | Owner | Status |
|---|---|---|---|
| MED-002 | Исправить права .env (chmod 600) | DevOps | 📋 Todo |
| MED-001 | Обновить urllib3 до 2.6.3 | Developer | 📋 Todo |
Short-term (1 неделя)¶
| ID | Action | Owner | Status |
|---|---|---|---|
| MED-003 | Добавить HTTP security headers | DevOps | 📋 Todo |
| LOW-001 | Hardening SSH config | DevOps | 📋 Todo |
Long-term (1 месяц)¶
| ID | Action | Owner | Status |
|---|---|---|---|
| INFO-001 | Настроить rate limiting | Developer | 📋 Todo |
| INFO-002 | Интегрировать Sentry | Developer | 📋 Todo |
Conclusion¶
Система CalmTrader имеет хорошую базовую безопасность:
Сильные стороны: - Правильно настроенный firewall - Изоляция внутренних сервисов в Docker network - AppArmor/seccomp для контейнеров - Валидный SSL с автообновлением - ORM для защиты от SQL injection
Требуют внимания: - Обновление зависимостей (urllib3) - Права доступа к файлам конфигурации - HTTP security headers
Рекомендуется для следующего аудита: - Penetration testing - Load testing - Full GDPR compliance review
Приложения¶
A. Инструменты аудита¶
| Tool | Version | Purpose |
|---|---|---|
| bandit | 1.8.3 | Python security linter |
| pip-audit | 2.10.0 | CVE scanning |
| nmap | 7.94 | Port scanning |
| ssh-audit | 3.3.0 | SSH configuration |
B. Команды аудита¶
# Code analysis
cd apps/api && uv run bandit -r app/ -f txt
cd apps/bot && uv run bandit -r app/ -f txt
# Dependency scan
cd apps/api && uv run pip-audit
cd apps/bot && uv run pip-audit
# Infrastructure
ssh trader-psy "ufw status verbose"
ssh trader-psy "ss -tlnp"
ssh trader-psy "docker info | grep Security"
C. Related Documents¶
- SOPs — Standard Operating Procedures
- Security Methodology — Audit Methodology
Документ создан в рамках выполнения контракта order-001-phase1-ru