Это собственная модель угроз Omniflow, написанная мейнтейнерами. Она не
заменяет независимую проверку безопасности, которая отслеживается отдельно в
ROADMAP.md — см.
примечание в конце страницы.
Идентичность
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Credential stuffing / перебор пароля оператора | Ответы, устойчивые к перечислению, decoy-хеш для неизвестных аккаунтов, удваивающаяся блокировка и лимиты частоты на аккаунт и на IP — Безопасность | Не выявлено |
| Кража или повтор сессионного cookie | 256-битные токены, хранящиеся только как SHA-256-дайджест, двойной срок действия (простой и абсолютный), ротация и повышение уровня аутентификации для четырёх разрушительных действий клиента — Безопасность | Истёкшие строки admin_sessions/customer_sessions/customer_magic_links/customer_security_events сегодня никакой задачей не удаляются — проблема хранения и гигиены, а не доступа, поскольку истёкшие сессии не аутентифицируют независимо от наличия строки |
| Межсайтовая подделка запроса | HMAC-токен на сессию, обязательный для каждого небезопасного метода, проверяемый на сервере, а не только политикой cookie — Безопасность | Не выявлено |
| Двухфакторная аутентификация не обязательна | TOTP (RFC 6238) с кодами восстановления, обязателен для отключения | Двухфакторная аутентификация добровольна для каждого аккаунта в этой сборке; принуждение — эксплуатационная проверка на /admin/operators, а не то, что может потребовать API — Безопасность |
Похищенный APP_OPERATOR_TOKEN | Обязателен при старте; принцип «только на запись» для учётных данных применяется повсюду в API | Сам токен не несёт ролей и CSRF, а его изменения пишутся в аудит лишь как operator-token, а не как человек, — обращайтесь с ним как с root и ротируйте при любом подозрении на утечку — Безопасность |
Telegram
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Подделанная полезная нагрузка виджета входа | Проверяется по токену бота с окном свежести в одну минуту, поскольку сам хеш никогда не истекает | Не выявлено |
| Повтор сессии Mini App | initData проверяется по собственному выводу ключа при каждом запросе | Не выявлено |
| Подделанная доставка webhook | Режим webhook с проверкой секретного токена; long polling — явный резервный режим | Не выявлено |
| Повтор callback платежа или разрушительного действия | Механизм однократного использования Once (ниже) выдаёт токен единственного использования на callback | Не выявлено |
Платежи и вебхуки
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Подделанный webhook провайдера | Проверка подписи для каждого провайдера — например, crypto-pay-api-signature у CryptoBot, декодируется из hex и сравнивается за постоянное время с HMAC-SHA256(SHA256(apiToken), body) — Платёжные провайдеры | Адаптер без поддержки подписи документируется отдельно по провайдеру, а не предполагается по умолчанию |
| Повторная/дублированная доставка webhook | Каждая мутация платежа несёт ключ идемпотентности; шквал одновременных повторных доставок зачисляет ровно один раз, доказано под конкурентной нагрузкой в internal/integrationtest/load_test.go | Не выявлено |
| Слишком большое или искажённое тело webhook | Ограничение тела в 1 МиБ (413 payload_too_large), отклоняется с дайджестом тела и без утечки валидности подписи при искажённом вводе | Не выявлено |
| Утечка сохранённой полезной нагрузки webhook | Заголовки авторизации и подписи никогда не сохраняются; сырое тело хранится для сверки, но никогда не возвращается операторам через API, а строки событий удаляются через 30 дней после приёма — Платёжные провайдеры | Не выявлено |
RBAC администратора
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Учётные данные клиента, достигающие маршрута оператора | Три префикса API никогда не разделяют middleware — /v1/panel, /v1/admin, /v1/account — утверждается тестом, а не только соглашением — Безопасность | Не выявлено |
| Скрытый маршрут или состояние фронтенда как единственная проверка права доступа | Авторизация живёт в internal/rbac, вкомпилирована, применяется одинаково на границе Next.js-сервера и в Go API — AGENTS.md | Не выявлено |
| Повышение привилегий через самостоятельное присвоение роли | Только владелец может создать оператора или изменить назначения ролей | Скомпрометированная сессия владельца остаётся потолком — ни одна мера защиты по определению не рассчитана пережить это |
| Незамеченное злоупотребление | Каждое действие аутентификации, авторизации и настройки добавляется в журнал аудита в той же транзакции, что и изменение состояния, включая отказы в праве доступа | Поверхность bearer-токена /v1/admin пишет свои изменения в аудит под одним общим актором operator-token и не записывает чтения — см. «Идентичность» выше |
SSRF
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Сервер MCP, перенаправляющий запрос на metadata облака или внутренний хост | Исходящий трафик проверяется перед каждым запросом, а не только при регистрации; loopback, приватные и link-local адреса отклоняются, если явно не разрешена приватная сеть — Подключения MCP | Оператор, явно разрешивший доступ к приватной сети для самостоятельно размещённого сервера, принимает, что скомпрометированный сервер может просканировать порты этой сети |
| Незашифрованная конечная точка MCP | Отклоняется и валидацией на Go, и ограничением базы данных, поэтому ни один путь кода не может это обойти | Не выявлено |
| Исчерпание ресурсов через ответ | Таймаут 20 с, ограничение ответа 256 КБ, 8 вызовов на запрос, глубина рекурсии 3 — Подключения MCP | Не выявлено |
AI
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Данные клиента/платежей, попадающие к провайдеру AI без необходимости | Единый шлюз редактирования вырезает секреты, токены, ссылки на подписку, платёжные данные и лишние персональные данные до любого запроса к модели — Приватность AI | Условия хранения/обучения провайдера фиксируются на основании того, что заявляет сам провайдер; Omniflow не может независимо проверить соответствие провайдера — Управление AI |
| Функция AI, совершающая необратимое действие | Ни одна функция не может самостоятельно приостановить аккаунт, оформить возврат, скорректировать баланс кошелька или иначе изменить финансовое/неблагоприятное состояние; вывод анализа злоупотреблений требует проверки человеком — Приватность AI | Не выявлено |
| Неограниченные расходы | Потолки на оператора, роль, функцию и всю установку — Управление AI | У установки без настроенных лимитов потолка нет; это осознанное значение по умолчанию, а не недосмотр |
MCP
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Вызов инструмента MCP, выходящий за пределы того, что может вызывающий оператор | Каждый вызов авторизуется по собственному праву доступа RBAC вызывающего оператора, никогда по служебной идентичности — Подключения MCP | Не выявлено |
| Внешняя запись, на которую никто не соглашался | Инструмент, помеченный как изменяющий, требует явного подтверждения и причины при каждом вызове; флаг записи задаёт владелец, а не аннотация самого сервера | Не выявлено |
| Дублированная мутация из-за повторного вызова | Каждый изменяющий вызов инструмента требует ключ идемпотентности; повтор с тем же ключом возвращает первый результат, а не выполняется заново | Не выявлено |
| Вредоносный или скомпрометированный сервер, возвращающий результат, нарушающий схему | И аргументы, и результаты проверяются по объявленной JSON Schema; несовпадающий результат отклоняется, а не передаётся дальше | Не выявлено |
Инъекция промптов
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Результат инструмента MCP, обращение или вложение, несущее скрытые инструкции | Каждый внешний результат изолируется и представляется модели как цитата, а не инструкция; сканируется на паттерны переопределения, заявления роли, директив инструментов, эксфильтрации и скрытого текста; символы нулевой ширины вырезаются — Подключения MCP | Сканирование — вторичная защита поверх структурной изоляции; новая форма инъекции может не совпасть с известным паттерном до обновления сканирования |
Собственное поле instructions сервера, перехватывающее поведение ассистента | Фиксируется только для отображения, никогда не передаётся модели | Не выявлено |
Цепочка поставки
| Риск | Мера защиты | Остаточный риск |
|---|---|---|
| Скомпрометированный или подменённый образ релиза | Каждый образ подписывается бесключевым способом через cosign с использованием собственной OIDC-идентичности релизного workflow в GitHub, проверяемой по публичному журналу Rekor — Совместимость и обновления | Не выявлено |
| Уязвимая зависимость, секрет или несовместимая по лицензии зависимость, попадающая в релиз | govulncheck, Gitleaks и сканирование зависимостей/лицензий Trivy закрывают сам релизный workflow — неудачное сканирование останавливает сборку образов целиком | Не выявлено |
| Уязвимость на уровне логики, которую сканирование зависимостей не видит | Семантический анализ CodeQL (Go и JavaScript/TypeScript) закрывает релизный workflow | SAST находит классы ошибок, а не все ошибки; он дополняет остальные сканирования, а не заменяет ручную проверку |
| Уязвимость, внесённая слоем базового образа | Каждый опубликованный образ сканируется по digest сразу после публикации | Это происходит после того, как образ достиг реестра, а не до — по-настоящему предпубликационный гейт потребовал бы перестройки на сборку-затем-скан-затем-публикацию для мультиархитектурной сборки, чего пока не сделано. Неудачное сканирование всё равно проваливает релизный workflow и помечает digest для удаления |
| Непроверенное обновление зависимости | Renovate автоматизирует обновления с гейтом одобрения через дашборд для мажорных/платформенных зависимостей | Не выявлено |
Чего эта страница не покрывает
Независимая проверка безопасности ещё не проводилась. Всё на этой
странице — собственный анализ мейнтейнеров собственного кода. Его не
рецензировал никто без этого контекста, а именно такая рецензия скорее всего
найдёт то, что авторы меры защиты не могут увидеть в ней сами. Это
отслеживается как открытый пункт в разделе v1.0 «Безопасность и приватность»
файла
ROADMAP.md, а не подразумевается завершённым.Связанные страницы
Безопасность
Учётные данные, сессии, секреты, транспорт и заголовки в подробностях.
Приватность
Что хранит Omniflow, зачем и как долго.