Перейти к содержанию

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

Ключевые рекомендации

  1. Обновить urllib3 до версии 2.6.3 (3 CVE)
  2. Исправить права .env файла (644 → 600)
  3. Добавить 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:

# В apps/api и apps/bot
uv add urllib3>=2.6.3

Priority: High (исправить в течение 24 часов)


[MED-002] Небезопасные права на .env файл

Severity: Medium Category: Infrastructure CWE: CWE-732 (Incorrect Permission Assignment)

Описание: Файл .env с credentials имеет права 644 (readable by all), что позволяет любому пользователю системы прочитать секреты.

Evidence:

$ ls -la /opt/trader-psy/infrastructure/.env
-rw-r--r-- 1 root root 1234 Jan 10 12:00 .env

Impact: Компрометация всех секретов (database password, API keys, Telegram token) при получении доступа к серверу под любым пользователем.

Recommendation:

chmod 600 /opt/trader-psy/infrastructure/.env

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:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

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:

# apps/api/app/routers/images.py:67,98
selected_image = random.choice(unused_images)

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:

# apps/bot/app/main.py:169
web.run_app(app, host="0.0.0.0", port=8080)

Impact: Нет реального риска — сервис работает в Docker контейнере, порт не экспортирован наружу напрямую. Traefik проксирует запросы.

Recommendation: Оставить как есть — это стандартная практика для контейнеризированных приложений.

Priority: None (ожидаемое поведение)


[INFO-001] Рекомендуется добавить Rate Limiting

Severity: Info Category: Application

Описание: API endpoints не имеют rate limiting, что может привести к abuse.

Recommendation: Добавить rate limiting в Traefik или на уровне приложения для защиты от брутфорса и DoS.

# Traefik middleware
http:
  middlewares:
    rate-limit:
      rateLimit:
        average: 100
        burst: 50

[INFO-002] Рекомендуется настроить Sentry

Severity: Info Category: Monitoring

Описание: Error tracking через Sentry не настроен. Это затрудняет обнаружение и анализ ошибок в production.

Recommendation: Интегрировать Sentry для мониторинга ошибок:

import sentry_sdk
sentry_sdk.init(dsn="...")


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

Security Options:
 apparmor
 seccomp
  Profile: builtin

Assessment: AppArmor и seccomp включены, обеспечивая дополнительный уровень изоляции контейнеров.


SSL/TLS

Status: ✅ PASS

Certificate: Let's Encrypt
Valid until: March 2026
Auto-renewal: Yes (Traefik ACME)

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"

Документ создан в рамках выполнения контракта order-001-phase1-ru