Перейти к содержимому
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Механизмы защиты, которые работают, и те, которых у нас ещё нет.

Через что проходит запрос, как разделены клиенты, какие ключи что защищают и что мы не сертифицировали. Страница описывает то, что работает в продакшене сегодня.

/.well-known/security.txt
Contact
mailto:[email protected]
Expires
2027-11-01T00:00:00.000Z
Preferred-Languages
en, pt, es
Canonical
https://notholy.com/.well-known/security.txt
Policy
https://notholy.com/en/security

Один запрос к API, шаг за шагом

Каждая сторона, через которую проходит запрос, и что она может прочитать. Выделенная часть — та, которой управляем мы.

  1. Ваш клиент

    Может прочитать

    Ваш промпт и API-ключ, отправленные по TLS.

    Хранит

    То, что сохраняют ваши собственные инструменты.

  2. Граница Cloudflare

    Может прочитать

    Весь запрос, расшифрованный при передаче, и ваш IP-адрес. Здесь завершается TLS для всех хостов, включая api.notholy.com, и новое TLS-соединение несёт запрос к нашему origin.

    Хранит

    Определяется собственными условиями Cloudflare.

  3. Шлюз NotHoly

    Может прочитать

    Запрос в памяти. Шлюз проверяет HMAC ключа, его бюджет и списки доступа, затем маршрутизирует вызов.

    Хранит

    Метаданные расхода: ID запроса, организация, ключ, модель, токены, стоимость, статус и тайминги. В этой записи нет промпта, ответа и IP-адреса. Ответ на вызов без стриминга с Idempotency-Key остаётся в памяти 24 часа.

  4. Партнёрский ИИ-дата-центр

    Может прочитать

    Сообщения, инструменты и параметры модели по HTTPS и под нашим ключом. Ваша организация, ID пользователя и IP-адрес не передаются. Партнёр находится в другой стране и может привлекать собственных субподрядчиков.

    Хранит

    Ничего. Партнёр подтвердил NotHoly, что не оставляет у себя, не хранит и не использует содержимое инференса, и NotHoly периодически это проверяет.

Изоляция клиентов

Организации разделены на уровне приложения: каждый запрос к данным фильтруется по org_id.

Ключи
У каждой организации свой ключ шифрования, поэтому ключ одного клиента не откроет зашифрованные данные другого.
Журнал баланса
Изменения баланса только добавляются, это обеспечивает триггер в базе. Вебхуки платежей должны нести валидную подпись.

Идентификация и доступ

У входа клиентов, API-ключей и доступа сотрудников свои механизмы контроля.

Пароли
От 12 до 256 символов, обязателен подтверждённый email.
Второй фактор
TOTP с резервными кодами и passkeys.
Новые устройства
Вход по паролю с недоверенного устройства требует одноразового кода из письма. Код хранится как хеш с секретом, действует 10 минут, срабатывает один раз и допускает 5 попыток.
Доверенные устройства
Запоминаются на 30 дней, хранятся в виде хеша, доверие можно отозвать.
Сессии
14 дней в cookie с флагами HttpOnly, Secure, SameSite=Lax. Сессии можно посмотреть и завершить.
Защита от ботов
Cloudflare Turnstile на входе, регистрации и сбросе пароля, с проверкой на сервере. В продакшене при сбое доступ закрывается.
API-ключи
Хранятся как HMAC-SHA-256 с серверным перцем и показываются один раз. У ключа могут быть списки разрешённых IP и моделей, бюджет и срок действия. Отзыв срабатывает мгновенно.

Доступ сотрудников

Вход в админку
Только passkey. Сессия длится 8 часов и завершается после 30 минут бездействия, доступен список разрешённых IP.
Изменения в админке
Записываются с исполнителем, действием, объектом и значениями до и после.
Корректировки баланса
Всё, что больше $100, требует подтверждения второго сотрудника.
Вход под клиентом
У сотрудников нет функции действовать от имени клиента.

Шифрование

Чаты, проекты и файлы шифруются на сервере ключами, которые хранятся у нас. Мы расшифровываем их, чтобы работал ваш чат, так что это серверное шифрование, а не сквозное.

Иерархия ключей для чатов и файлов
  1. Мастер-ключ

    Хранится в серверном окружении. Оборачивает все ключи организаций.

  2. Ключ организации

    Один на организацию. Оборачивает ключи данных этой организации.

  3. Ключ данных

    Один на переписку и один на файл.

  4. Зашифрованное содержимое

    AES-256-GCM с 12-байтовым nonce. Покрывает заголовки чатов, сообщения, рассуждения, проекты, имена файлов, байты файлов и извлечённый текст.

При передаче
TLS от браузера до Cloudflare, с HSTS на 2 года и preload, затем TLS от Cloudflare до нашего origin. Шлюз обращается к партнёрским ИИ-дата-центрам в других странах по HTTPS. Сервисы внутри нашей частной сети общаются открытым текстом.
Пароли
Пароли аккаунта, защиты чата и общих ссылок хешируются через scrypt. Токены общих ссылок хранятся как SHA-256.
Временные чаты
События выполнения шифруются случайным 32-байтовым ключом на каждый запуск, который хранится только в памяти процесса.
Без шифрования по столбцам
Имя, email, телефон, платёжный адрес, налоговый номер, IP-адрес и метаданные расхода — обычные столбцы в базе.

Что происходит с вашим содержимым

Содержимое инференса через API не пишется в базу, очередь, лог или трейс. Сохранённые чаты хранятся зашифрованными, пока вы их не удалите.

Инференс через API

Что мы храним
Ничего. Промпты и ответы существуют в памяти шлюза, пока идёт запрос.
Защита
TLS при передаче.
Когда удаляется
Когда запрос завершается, кроме кэша идемпотентности, описанного ниже.
Что остаётся
Метаданные расхода.

Сохранённый чат

Что мы храним
Заголовки, сообщения, рассуждения, ссылки и приложенные файлы.
Защита
AES-256-GCM, свой ключ на каждую переписку и каждый файл.
Когда удаляется
Когда вы удаляете переписку. Приложенные файлы вместе с ней не удаляются.
Что остаётся
Отметка об удалённой переписке, записи о выполнении, подписи шагов инструментов, приложенные файлы и метаданные расхода.

Временный чат

Что мы храним
Ни переписки, ни сообщений. Зашифрованные события выполнения и загруженные файлы.
Защита
События выполнения шифруются случайным ключом на каждый запуск, который хранится только в памяти процесса. Загруженные файлы шифруются ключом на файл, обёрнутым ключом организации.
Когда удаляется
События выполнения удаляются через 1 час после окончания запуска.
Что остаётся
Запись о выполнении, подписи шагов инструментов, загруженные файлы и метаданные расхода.
Кэш идемпотентности
Если вы отправили Idempotency-Key в вызове без стриминга, полный ответ 24 часа хранится в памяти процесса шлюза, чтобы повторный запрос получил тот же ответ. Он никогда не пишется на диск, воспроизвести его может только ваша организация, а перезапуск его стирает.
Подписи шагов инструментов
Запуски в чате записывают цель каждого вызова инструмента открытым текстом и без автоматического истечения: поисковый запрос в вебе, запрос поиска по файлам, запрос CVE, имя файла или хост для read_url. URL в ссылках тоже хранятся открытым текстом.
Обучение моделей
Мы не используем содержимое клиентов для обучения ИИ-моделей и для анализа моделей. Метаданные анализируются для оплаты, отслеживания злоупотреблений и эксплуатации.
Партнёрские ИИ-дата-центры
Каждый партнёр подтвердил NotHoly, что не оставляет у себя, не хранит и не использует содержимое инференса. NotHoly их проверяет и периодически перепроверяет.

Работа с файлами

Только статический анализ

Загрузки считаются враждебными, и ни один файл пользователя не запускается. Каждый файл разбирается статически в одноразовом контейнере gVisor. Это относится к загрузкам в чате, /v1/files и инструменту MCP analyze_file.

При хранении
Имена файлов, байты и извлечённый текст шифруются ключом на файл до сохранения. Анализ пишет расшифрованный файл во временную папку и удаляет его по окончании шага. В записи о файле открытым текстом хранятся только хеш, размер и MIME-тип, а имя файла может попасть в подпись шага инструмента.
Песочница
Изолированный запускатель создаёт для каждого файла новый контейнер gVisor: без сети, с корнем только для чтения, лимитами памяти, CPU и процессов, без capabilities, с непривилегированным пользователем и без секретов.
Если анализ не удался
Файл сверх лимитов или сбой парсера завершаются отклонением с указанием причины. Файл остаётся зашифрованным в хранилище, текст из него не извлекается.

Сеть и SSRF

Origin принимает на публичных портах только Cloudflare. Единственная серверная функция, которая загружает URL, работает за защитой от SSRF.

Origin
Порты 80 и 443 принимают соединения только из диапазонов адресов Cloudflare. Внутренние сервисы слушают loopback.
Доступ к серверам
SSH только по ключу, с fail2ban.
read_url
Публичные http и https на портах 80 и 443. Каждый разрезолвленный адрес проверяется, соединение привязывается к проверенному IP, и каждый редирект проверяется заново. Cookie не отправляются, размер и время ограничены, robots.txt соблюдается.
Трафик к третьим лицам
Наши серверы не сканируют, не эксплуатируют и не шлют активный трафик сторонним системам. read_url только читает публичные страницы. Команды CLI выполняются на вашей машине после вашего одобрения.

Усиление защиты приложения

Это заголовки ответа, которые notholy.com отправляет сегодня. Source maps для браузера публично не отдаются.

curl -sI https://notholy.com/en
Strict-Transport-Security
max-age=63072000includeSubDomainspreload
Content-Security-Policy
default-src 'self'script-src 'self' 'unsafe-inline' https://static.cloudflareinsights.com https://challenges.cloudflare.com https://static.ads-twitter.comstyle-src 'self' 'unsafe-inline'img-src 'self' data: blob: https:font-src 'self' data:connect-src 'self' https://api.notholy.com https://cloudflareinsights.com https://t.co https://analytics.twitter.commedia-src 'self' blob:worker-src 'self' blob:manifest-src 'self'frame-src https://challenges.cloudflare.comframe-ancestors 'none'object-src 'none'base-uri 'self'form-action 'self'upgrade-insecure-requests
X-Frame-Options
DENY
X-Content-Type-Options
nosniff
Referrer-Policy
strict-origin-when-cross-origin
Permissions-Policy
camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()
Cross-Origin-Opener-Policy
same-origin

Выделенная директива — слабое место: наш CSP не использует nonce, и script-src всё ещё разрешает 'unsafe-inline'.

Мониторинг и аудит

Метрики и дашборды остаются на нашем собственном хосте, сторонних трекеров ошибок нет.

Метрики
Prometheus и Grafana на нашем хосте, привязаны к loopback. В метриках только метки и счётчики, хранятся 30 дней.
Логи приложения
ID запросов, статусы и ошибки, но никогда не тела запросов. Ротация по размеру: 3 файла по 10 МБ на контейнер.
Аудит действий сотрудников
Исполнитель, действие, объект, значения до и после, IP-адрес и user agent.
Журнал аудита организации
Организации-компании могут смотреть последние 100 записей в настройках, если это позволяет роль.

Бэкапы и восстановление

База копируется раз в день, бэкап шифруется и хранится на отдельной площадке.

Шифрование
AES-256, ключ получается через PBKDF2 с 200 000 итераций.
Срок хранения
14 ежедневных, 8 еженедельных и 12 ежемесячных копий. Удалённые вами данные могут оставаться в бэкапе около 12 месяцев.
Учения по восстановлению
Скрипт восстанавливает свежий бэкап во временную базу, проверяет его контрольную сумму и убеждается, что все таблицы на месте и строк в них не больше, чем в рабочей базе. По расписанию он пока не запускается.
Окно потери данных
Сбой между бэкапами может стоить до одного дня записей.

Сообщить об уязвимости

Мы ждём, что исследователи будут нас тестировать. Вот как сообщить о том, что вы нашли.

Куда
[email protected]. Наш security.txt лежит по адресу /.well-known/security.txt.
Что приложить
Затронутый URL или компонент, шаги воспроизведения и наблюдаемый импакт.
Скоуп
notholy.com, api.notholy.com и docs.notholy.com. Не трогайте данные других клиентов, не проводите DoS-тесты и остановитесь, как только показали импакт.
С нашей стороны
Мы подтверждаем получение отчёта, держим вас в курсе, пока исправляем, и не будем преследовать добросовестные исследования, которые следуют этим правилам.
Вознаграждения
Платной bug bounty программы у нас нет.

Чего мы ещё не сделали

Если ваша проверка зависит от чего-то из этого списка, спросите нас, прежде чем полагаться на NotHoly.

  • Сертификация

    У NotHoly нет SOC 2, ISO 27001 или другой сертификации или аттестации по безопасности.

  • Независимый пентест

    Отчёта о пентесте от третьей стороны, которым мы могли бы поделиться, нет.

  • Сквозное шифрование

    Ключи у сервера, и он расшифровывает чаты и файлы, чтобы их обработать.

  • Изоляция на уровне базы

    Изоляция клиентов реализована в запросах приложения. Второго слоя на уровне базы сегодня нет.

  • Динамический анализ

    Файлы разбираются и не запускаются, поэтому поведение образца во время выполнения никто не наблюдает. Дизассемблирование — превью первых 4 КБ как x86-64.

  • Автоматическое удаление

    У загрузок есть срок истечения, а организации-компании могут выбрать срок хранения чатов, но сегодня ни то ни другое не исполняет ни одна задача. Для метаданных расхода и записей аудита задачи удаления нет, поэтому они хранятся бессрочно. Истёкшие записи сессий, в которых есть IP-адрес и user agent, по расписанию не чистятся.

  • 2FA для всей организации

    Владельцы пока не могут требовать второй фактор от всех участников.

  • Экспорт и неизменяемость логов

    Журнал аудита организации нельзя экспортировать, а наши логи не защищены от перезаписи.

  • Восстановление на момент времени

    Бэкапы — это ежедневные дампы без непрерывного архивирования, и в них не входят загруженные файлы.

Спрашивайте обо всём, что позволяет ваш скоуп.

Создайте аккаунт, пополните баланс от $5 и задайте первый вопрос в чате или в терминале.

  1. 1/3

    Создайте аккаунт

    Личный или для компании. Позже можно перейти на аккаунт компании без потери баланса и ключей.

    ЛичныйКомпания
  2. 2/3

    Пополните баланс

    Картой, от $5. Оплата за токены, без подписки.

    $5.00минимальное пополнение
  3. 3/3

    Спрашивайте

    В чате, или установите CLI и выполните notholy login в терминале.

    $ notholy login