Ко всем статьям

Первый внешний security-аудит: что нашли и как починили

Инженерная команда· Опубликовано 08.04.2026· 12 мин

Seven findings, two critical. Разбираем по-честному что было, что исправили.

Контекст

В феврале мы заключили контракт с независимой security-фирмой на полный аудит: код edge-ноды, админ-сервиса, user-сервиса, мобильных клиентов, инфраструктуры. 3 недели, 2 инженера.

Finding #1 (critical): race condition в auth-middleware

В auth-middleware на user-service при высокой нагрузке была возможность race condition, при которой один запрос мог получить контекст другого пользователя. Триггер — одновременный refresh token'а и rate-limited запрос.

Исправление: каждая сессия теперь имеет isolated context, проверка происходит до любых cache-чтений. Коммит 8a2f1b0 в user-service.

Finding #2 (critical): обфускация ключа в macOS keychain

На macOS клиентские PSK хранились в Keychain с правильным access-control, но наш wrapper пропускал параметр kSecAttrSynchronizable = false. В теории, на устройствах с включённым iCloud Keychain sync ключи могли синкаться в облако.

Исправление: явный kSecAttrSynchronizable = false во всех места записи. Существующие ключи перезаписываются при следующем login'е. Коммит 6e4cc9a в mobile client.

Finding #3 (high): logs leak client IP

У edge-ноды в debug-режиме логировался client IP в некоторых error-path'ах. В production-mode такого не было, но debug-mode включался через env var, доступный через S3-бакет с конфигами.

Исправление: удалён IP logging в debug path, rotate S3 credentials, S3 bucket policy ужесточён.

Finding #4-7 (medium/low)

  • HSTS отсутствовал на auth.domain → добавлен.
  • Session cookie flags не включали SameSite=Strict → исправлено.
  • Слабый CSP на status.domain → усилен.
  • Возможный timing-attack в password check → добавлен crypto.timingSafeEqual.

Что мы выпустили вместе с фиксами

Security disclosure page: /security — с changelog'ом фиксов, warrant canary, и (что самое важное) bug bounty программой. Коллега из аудит-фирмы помог сформулировать scope, bounty range $100 — $10 000.

Вывод

Внешний аудит — дорого ($35k), но окупается сразу по двум причинам:

  1. Находит реальные баги. Мы нашли бы их сами, но не в первые 3 недели.
  2. В маркетинге anti-censorship аудитории — «прошли внешний security аудит» работает сильнее любых слоганов.

Поделиться

X / TwitterTelegram