Проверка
Слушает loopback, пока вы явно не скажете иначе
Аудио и текст могут содержать персональные данные и коммерческую тайну, поэтому дефолты закрытые: 127.0.0.1:9876, пустой список Origin, офлайн-режим serve. Ключи, CORS и лимиты администратор включает сам.
Модель угроз
Угроза, контроль и значение по умолчанию
| Угроза | Контроль | По умолчанию |
|---|---|---|
| Доступ к API извне | Bind только loopback | Слушает 127.0.0.1:9876. Наружу — --bind-all вместе с ключами API или осознанный --allow-insecure-bind. |
| Перехват на сети | TLS на proxy | Бинарник TLS не терминирует. Снаружи ставят Nginx, Caddy или тот прокси, что уже есть в контуре. |
| Исчерпание пула | Лимиты и 503 | Ключи rate_limit_* в конфиге, в поставке выключены. Переполненный пул отвечает 503 с Retry-After. |
| Утечка через логи | Текст не пишется | По умолчанию в лог идут длительность и число слов, не текст. При RUST_LOG=debug транскрипт попасть может, поэтому в контуре debug не включают. |
| Лишние права на хосте | user gigastt | Unit идёт с NoNewPrivileges, ProtectSystem=strict и LimitCORE=0. |
| Исходящий канал | serve по умолчанию offline | Без весов serve падает с ошибкой и ничего не скачивает. Webhook включается только через --jobs-webhook-url и принимает адреса RFC1918, loopback или *.local. |
Доступ
Ключи и Origin — по явному списку
Ключи опциональны, в памяти только SHA-256
Включаются файлом --auth-api-keys-file. Клиент передаёт ключ в заголовке X-API-Key; query-параметр api_key — запасной путь для WebSocket-клиентов без заголовков, но query может осесть в access-логе proxy, поэтому предпочтителен заголовок. После 10 неудачных попыток с одного IP за 60 секунд адрес блокируется до конца окна. Ответы 401 на промах и на блок байт-в-байт одинаковы.
Пер-IP блокировка — best-effort, а основная защита — стойкий ключ. Атакующий за общим NAT может на время окна посадить в блок легитимных пользователей. При доверии к X-Forwarded-For на неверно настроенном proxy атакующий обойдёт окно ротацией адресов. Ключ короче 16 символов сервер отклоняет при старте; берите 128 бит энтропии, это 32+ символа. События auth_success, auth_fail и request пишутся в аудит-лог --audit-log-path, query-строка туда не попадает.
Чужой Origin получает 403
Принимаются запросы без заголовка Origin и с loopback-Origin — этого хватает CLI и серверным клиентам. Браузерный портал из корпоративного домена добавляется флагом --allow-origin, по одному домену за раз. Флаг --cors-allow-any существует для отладки и в production не предназначен.
Лимиты
Лимитер выключен, потому что сервер на loopback
В поставке rate limit отключён: на 127.0.0.1:9876 ему некого ограничивать. Перед выводом за reverse proxy задайте профиль в config.toml.
rate_limit_per_minute = 120
rate_limit_burst = 20
max_session_secs = 3600
idle_timeout_secs = 300/health под лимит не попадает, превышение возвращает 429 с Retry-After. Когда заняты все сессии пула, REST отвечает 503 с Retry-After, а WebSocket — ошибкой с retry_after_ms. От клиентов, которые держат сокет открытым бесконечно, спасают max_session_secs и idle_timeout_secs.
Персональные данные
--redact маскирует часть ПДн в тексте ответа
Режим mask заменяет совпадения на [PHONE], [EMAIL], [CARD] и [SNILS]; режим hash подставляет первые 8 hex-символов SHA-256. Детекторы локальные, облачного NER нет: телефоны РФ, email, банковские карты с проверкой по Луну, СНИЛС с контрольной суммой. По умолчанию выключено.
Детекторы v1 не покрывают ФИО, адреса и паспортные данные, и полноценной DLP такой фильтр не заменяет — в критичном контуре остаётся человеческий просмотр.
Цепочка поставки
rustls и ring, OpenSSL в дереве нет
cargo audit и cargo deny гоняются в CI на каждом пайплайне. Веса при каждой загрузке сверяются с манифестом integrity.json; несовпадение хеша останавливает старт. Манифест при этом не подписан и лежит рядом с весами. Он ловит битый диск и обрыв копирования, но не атакующего с правом записи в каталог модели. Права gigastt:gigastt 750 на каталог — часть механизма защиты.
Опциональная офлайн-лицензия — TOML с подписью ed25519 — проверяется локально, ограничивает concurrency и наружу не обращается. На исходники по-прежнему действует MIT.
Уязвимости
Сообщить об уязвимости
Публичный issue для уязвимостей не заводите. Пишите на m1ndcoderr@gmail.com с темой [gigastt] Security vulnerability report: версия движка, описание и влияние, шаги воспроизведения. Сроки зафиксированы в SECURITY.md репозитория.
- Подтверждение получения
- до 72 часов
- Первичная оценка
- до 7 дней
- Исправление или mitigation
- до 90 дней
- Публичное раскрытие
- после исправления, по согласованию с вами
Если исправление не уложится в 90 дней, вы вправе раскрыть детали после уведомления мейнтейнера.
Документация
Чек-лист вывода в production — в документации
Firewall, systemd-hardening, аудит и целостность модели разобраны в docs. Доступ к исходникам и весам выдаём по письму.