Skip to content

Security: ReNothingg/ReMind

SECURITY.md

Security Policy

Supported Versions

Version Supported
main Yes
Older snapshots / forks No

Reporting a Vulnerability

Если вы нашли уязвимость, пожалуйста, не публикуйте ее в открытом issue.

Используйте ответственный процесс раскрытия:

  1. Откройте приватный vulnerability report через GitHub Security Advisories (если доступно в репозитории).
  2. Если это недоступно, создайте issue с минимальной публичной информацией и пометкой security, без proof-of-concept и exploit-деталей.
  3. Дождитесь подтверждения от мейнтейнеров перед любым публичным раскрытием.

Что включить в отчет:

  • тип и краткое описание уязвимости;
  • затронутые файлы/эндпоинты;
  • шаги воспроизведения;
  • оценка потенциального ущерба;
  • возможный вариант исправления (если есть).

Response Targets

  • Первичное подтверждение получения: до 72 часов.
  • Предварительная оценка и triage: до 7 календарных дней.
  • План исправления: по результатам severity-оценки.

Срок фактического исправления зависит от критичности и сложности изменений.

Severity Priorities

Наивысший приоритет:

  • обход аутентификации/авторизации;
  • RCE, SSRF, path traversal, SQL injection;
  • утечка персональных данных или секретов;
  • CSRF/XSS уязвимости с реальной эксплуатацией.

Security Best Practices for Contributors

  • Не коммитьте секреты (.env, ключи, сертификаты).
  • Не ослабляйте существующие проверки валидации/CSRF/rate-limit без обоснования.
  • Обязательно описывайте security-риск в PR при изменении auth/session/upload logic.

Interactive Visualization Boundary

Интерактивные визуализации из ответов модели считаются недоверенным кодом. Они должны выполняться только в iframe с opaque origin и sandbox="allow-scripts"; allow-same-origin, формы, popups, top navigation и доступ к устройствам запрещены.

Runtime использует deny-by-default CSP: сетевые API и вложенные frame запрещены, а статические скрипты и шрифты ограничены явным allowlist CDN. В iframe передаются только визуальные настройки ReMind; история чата, профиль, персонализация, cookies, storage, credentials и DOM приложения не передаются.

Сообщение из визуализации не может автоматически запустить новый запрос к модели. Host проверяет event.source и уникальный для экземпляра channel id, ограничивает длину данных и показывает пользователю подтверждение перед отправкой follow-up сообщения.

Python Runner Boundary

Canvas запускает Python только через авторизованный POST /api/python/execute с общей CSRF-защитой. Эндпоинт принимает исключительно строку кода до 24 000 символов, не принимает пути к файлам Canvas и не сохраняет артефакты из этого режима; все ограничения изолированного runner-а и пользовательский rate limit остаются обязательными.

Код, сгенерированный моделью, считается полностью недоверенным и никогда не запускается процессом Flask/Celery. Приложение передаёт job через отдельный volume в python-runner; runner не подключён ни к одной Docker network, не получает .env, database/Redis credentials, Docker socket, host paths или пользовательское хранилище. Root filesystem read-only, /tmp одноразовый, /dev/shm закрыт, package manager удалён из runtime image.

Trusted supervisor работает отдельно от job UID и перед запуском оставляет дочернему процессу UID/GID 65532, пустой supplemental-groups list, нулевые effective capabilities и минимальный allowlist environment. Для job применяются wall/CPU/RAM/file/PID/FD/output limits; после каждого запуска supervisor убивает все процессы sandbox UID, включая fork/setsid descendants, и удаляет рабочую директорию. Контейнер дополнительно использует no-new-privileges, cap_drop: ALL, read-only rootfs, pids_limit, memory/CPU quotas и только минимальные capabilities supervisor (SETUID, SETGID, KILL, CHOWN, DAC_OVERRIDE).

Очередь недоступна job UID. Входы копируются только из уже проверенных upload-файлов текущего запроса. Выходы принимаются только из top-level output directory по allowlist расширений и повторно проверяются приложением по размеру, MIME и структуре изображения/JSON/text перед сохранением. Артефакты становятся доступны только как вложения истории владельца; anonymous tool execution отключён. На пользователя действует отдельный rate limit, одновременно допускается один job, а Telegram и временные чаты не получают сохраняемые артефакты.

Журнал выполнения показывает владельцу чата ограниченные фрагменты скрипта и результата, включая ограниченный stdout/stderr; сокращение отмечается в интерфейсе. Environment, внутренние пути и данные supervisor не передаются. Payload имеет ограниченный размер, кодируется как структурированные данные, проверяется по типу/status/id на клиенте и выводится React только как текст внутри <pre>, без dangerouslySetInnerHTML. Поэтому содержимое скрипта не может стать HTML/JavaScript приложения; журнал сохраняется с теми же правилами доступа, что и ответ чата.

Эта граница реализует defence in depth, но не является доказательством абсолютной безопасности. Production deployment должен регулярно обновлять base image, прогонять vulnerability scans для образа и зависимостей и при повышенной модели угроз размещать runner на отдельном rootless container host или microVM runtime (например, gVisor/Firecracker/Kata), не разделяющем kernel с основным приложением.

Chat Tool Boundary

Вызовы инструментов проверяются по закрытым схемам аргументов и серверным правилам доступа. Видимость инструмента в промпте не заменяет проверку перед исполнением. Пакетные операции расходуют общий бюджет, одинаковые успешные записи не повторяются, одинаковые ошибки после двух попыток блокируются до изменения запроса. Через 180 секунд новые операции не запускаются; уже начатый синхронный обработчик завершает работу по собственным ограничениям.

Файловые инструменты работают только с серверным списком вложений и артефактов доступного чата. Клиент не может передавать метаданные вложения с произвольным путём. Запись создаёт новый случайный файл с правами 0600 через эксклюзивное создание; исходник не перезаписывается. Для редактирования нужны совпадающая версия и единственное буквальное совпадение. Гостям и временным чатам создание/экспорт артефактов запрещены. Скачивание использует существующую проверку владельца или явно опубликованного чата, Content-Disposition: attachment для исходников и nosniff.

Исходники Python/JavaScript/HTML и других разрешённых текстовых форматов принимаются как UTF-8 данные, а не исполняемые программы. Двоичные данные и NUL отклоняются. HTML-предпросмотр файла проходит DOMPurify, имеет пустой sandbox и CSP без сети, форм и сценариев. Интерактивный Canvas и визуализации сохраняют собственные отдельно описанные границы.

Веб-операции ограничены по аккаунту/адресу и запросу. Разрешение относится к точному URL из пользовательского сообщения, источника поиска или реально прочитанной ссылки; добавление параметров не наследует разрешение. Подключение закреплено за проверенным публичным IP с проверкой TLS hostname, каждый redirect проверяется заново. Ответы, страницы и DOM ограничены размером, число страниц — 12 на ответ. Известные формы ключей и bearer-токенов в URL/поисковых строках блокируются. Этот фильтр не распознаёт все виды персональных данных; модель также обязана соблюдать границу недоверенного содержимого.

CSV/JSON обрабатываются ограниченными декларативными операциями без SQL, eval и пользовательских регулярных выражений. CSV-артефакты защищены от запуска формул в электронных таблицах. GitHub-инструменты проверяют подключение текущего пользователя и запрещённые пути, не получают права записи.

Проверки этой границы включают подмену пути и метаданных вложений, доступ к артефакту другого пользователя, гостевой экспорт, бинарный файл с расширением исходника, устаревшую правку, формулу CSV, параметры URL с данными, ошибку части пакетного поиска и остановку по лимиту. Это локальные проверки и живые обращения к публичным источникам/модели на искусственных данных, а не аудит развёрнутого production-сервера.

There aren't any published security advisories