FOLD
Досье по безопасности

Безопасность изнутри.

Удобочитаемая версия наших внутренних документов по безопасности, сверенная с кодом 2026-09-22. Если свойство запланировано, но ещё не выпущено, на этой странице так и сказано.

В сравнении

Мы сравниваем FOLD только по свойствам, которые можно проверить, и для каждого столбца даём ссылку на источник. Данные по конкурентам на июнь 2026 года; если производитель что-то изменит, изменится и эта таблица.

СвойствоFOLDApple MailMimestreamSparkThunderbirdOutlook (новый)
Без дополнительного облачного бэкендаДаДаДа напрямую к GmailНет облако ReaddleДаНет облако MS
Работа в App SandboxДаДаДаДаОграниченно стандартная установка без песочницыДа
Встроенный OpenPGPДа Ed25519, Curve25519 + RSAНетНетНетДаНет
Встроенный S/MIMEДаДаНетНетДаДа
Проверка DKIM в самом клиентеДаНетНетНетДополнение не в ядреНет
Любой IMAP-провайдерДаДаНет только GmailДаДаОграниченно принудительно через облако MS
Открытый исходный кодНетНетНетНетДа MPL 2.0Нет

Источники: Apple Platform Security · Поддерживаемые учётные записи Mimestream · Spark о конфиденциальности · Thunderbird · Облачная синхронизация нового Outlook (Cybernews, 2023).

Строка DKIM означает независимую проверку на стороне клиента (пересчёт хеша тела и подписи), а не просто показ серверного заголовка Authentication-Results. По состоянию на 06/2026.

Политика зависимостей

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

Движок и интерфейс используют только системные фреймворки Apple. Прямая загрузка добавляет в оболочку приложения один механизм обновления.

Разрешено
FoundationApple SDK. Потоки с TLS несут IMAP и SMTP, включая STARTTLS на действующем соединении.
CryptoKitEd25519, X25519, AES-GCM, SHA-2, HKDF.
SecurityСвязка ключей, SecTrust, RSA, CMS для S/MIME в macOS.
CommonCryptoБлочный шифр AES для режимов OCB и CFB.
AuthenticationServicesASWebAuthenticationSession для OAuth.
SQLite3Системный SQLite через тонкую обёртку на Swift. Без GRDB, без SQLite.swift.
WebKitЗащищённое отображение писем: JavaScript отключён, строгая политика контента.
os.LoggerApple SDK.
SparkleТолько для прямой загрузки, только в оболочке приложения: подписанные обновления. Не входит ни в движок, ни в интерфейс.
Исключено
swift-cryptoКроссплатформенный двойник CryptoKit, на платформах Apple не нужен.
libetpan, MailCoreОбёртки на C; нам нужен проверяемый код на Swift.
Библиотеки OpenPGPСобственная реализация с приоритетом современных алгоритмов вместо большой поверхности устаревшего кода.
SwiftData, CoreDataНе рассчитан на 500 000 писем в почтовом ящике; вместо него SQLite напрямую.
Сторонние пакеты для JSON, журналирования и сетиХватает Foundation и os.

Криптографическая стратегия

Асимметричная криптография, AES-GCM, HKDF, SHA-2 и Curve25519 берутся из CryptoKit и Security.framework, блочные шифры из CommonCrypto. Где у Apple нет нужного примитива, FOLD реализует его сам и проверяет байт в байт по эталонным реализациям: Argon2id и BLAKE2b для режима Fortress, AES-OCB для OpenPGP, PBKDF2 для SCRAM. Теги аутентификации и серверные подписи SCRAM сравниваются за постоянное время.

OpenPGP: по умолчанию современно, наследие под контролем

Правило из двух частей. Создание: ключи версии 4 с подписями Ed25519 и согласованием ключей Curve25519 (ECDH), AES-256 с проверкой целостности (SEIPD v1 с MDC), SHA-256/512. Чтение и отправка существующим получателям: дополнительно RSA в Security.framework, а при чтении также режим OCB из GnuPG; зашифрованные данные принимаются только с действительной проверкой целостности, иначе письмо отклоняется (EFAIL). Пока не поддерживаются: ключи версии 6 и шифрование AEAD (SEIPD v2) из RFC 9580. Отклоняются всегда: CAST5, IDEA, Blowfish, 3DES, подписи MD5 и SHA-1, а также зашифрованные данные без защиты целостности. Закрытые ключи хранятся под защитой S2K (AES-256) в сейфе Связки ключей, привязанном к устройству. Проверено на настоящем GnuPG.

S/MIME

В macOS через интерфейсы CMS в Security.framework, в iOS через платформенно-независимую реализацию CMS поверх SecKey и SecTrust: подпись, проверка, шифрование и расшифровка. Можно импортировать удостоверение .p12 и сертификаты получателей (.cer, .pem, .der), сертификаты из проверенных подписанных писем собираются, доверие проверяет SecTrust. Действительная подпись, адрес в сертификате которой не совпадает с отправителем, показывается как недоверенная. В iOS сертификаты получателей собираются из проверенных подписанных писем; ручной импорт появится позже. Проверено на тестовых данных, подписанных openssl.

Настройки TLS по умолчанию

Строгая проверка сертификата и имени хоста без возможности обхода. Версии TLS следуют стандартным настройкам платформы Apple. STARTTLS: FOLD подключается, запрашивает переход на TLS и прерывает соединение, если сервер отказывает или переход не удаётся; данные, попавшие в буфер до перехода, считаются признаком атаки «человек посередине» и завершают соединение. Незашифрованные IMAP и SMTP отклоняются в принципе. Привязка сертификатов (pinning) для каждой учётной записи запланирована, но пока недоступна.

Аутентификация

Пароли и токены OAuth хранятся только в Связке ключей с kSecAttrAccessibleWhenUnlockedThisDeviceOnly, никогда в UserDefaults или plist-файлах. OAuth работает через ASWebAuthenticationSession с обязательным PKCE (S256) как публичный клиент: в бинарном файле нет секрета клиента, одновременные обновления токенов объединяются. SMTP предпочитает SCRAM-SHA-256 с проверкой подписи сервера, затем CRAM-MD5, PLAIN и LOGIN; учётные записи OAuth используют XOAUTH2. По желанию, после отдельного согласия, пароли IMAP и SMTP можно зеркалировать через Связку ключей iCloud со сквозным шифрованием. Токены OAuth, секреты Fortress и PGP никогда не покидают устройство.

Политика журналирования

В журналах нет персональных данных, содержимого писем, тем, адресов, токенов и cookie, в том числе в отладочных сборках; это обеспечивают правила линтера, при нарушении которых сборка прерывается. Разрешены: события соединения (хост, порт, версия TLS, задержка), состояние протокола, категории ошибок. Окно активности на Mac с шагами синхронизации и журналом SMTP-сеанса хранится в памяти, ограничено 300 записями и никогда не записывается на диск.

Песочница и Hardened Runtime

macOS: App Sandbox и Hardened Runtime. Права: исходящие сетевые соединения, выбранные пользователем файлы, одна группа доступа к Связке ключей и контейнер iCloud для необязательной синхронизации; входящие соединения отключены. Никакого обхода проверки библиотек. iOS: системная песочница, группа Связки ключей и контейнер iCloud, без App Groups. Прямая загрузка, ещё не опубликованная, добавляет одно исключение, чтобы её механизм обновления мог устанавливать обновления. Распространение через Developer ID в macOS и через App Store.

Режим Fortress

Шифрование на уровне приложения, включаемое отдельно для каждой учётной записи. Argon2id над вашей парольной фразой и 32-байтовой солью, хранящейся в Связке ключей (m = 64 МиБ, t = 3, p = 4), выводит 256-битный главный ключ, который существует только в оперативной памяти; каждая учётная запись получает собственный ключ через HKDF-SHA-256. AES-256-GCM запечатывает текстовые столбцы базы заголовков и кэш писем; полнотекстовый поиск для учётных записей Fortress ограничен. Автоблокировка стирает ключ после периода бездействия, а при включённой блокировке приложения также при уходе приложения в фон. Argon2id и BLAKE2b реализованы нами самостоятельно и проверены по RFC 9106 и эталонному инструменту.

Чем Fortress не является

Не замена OpenPGP или S/MIME: они защищают письма при передаче, Fortress защищает локальную копию. Не защита от скомпрометированного ядра или операционной системы. Не режим анонимизации: метаданные IMAP по-прежнему сообщают серверу, с кем вы переписываетесь.

Модель угроз

Меры защиты сопоставлены с MITRE ATT&CK (26 техник) и MITRE D3FEND. Для каждой техники указана мера противодействия в FOLD; для обработки входных данных и отображения (вложения целевого фишинга, MIME-бомбы, файлы-полиглоты, эксфильтрация в духе EFAIL) также тест, который её покрывает.

Стратегия тестирования

Строгая проверка параллелизма Swift 6 и ExistentialAny на этапе компиляции. Более 3000 автоматизированных тестов по состоянию на 2026-09-22. Санитайзеры Address, Thread и Undefined Behavior запускаются локально как обязательные проверки перед каждым push и каждым релизом; хостинговой CI нет, это сознательное решение. Набор регрессионных тестов воспроизводит исторические CVE почтовых клиентов (EFAIL, BadWinmail, переполнения кучи в iOS Mail). Пять целей libFuzzer покрывают MIME, закодированные слова, адреса, блоки заголовков и CMS, и каждый прогон тестов воспроизводит корпус с 3000 мутаций.

Скоординированное раскрытие

Нашли уязвимость? Напишите на [email protected]. Мы подтверждаем получение в течение 72 часов и выпускаем исправления с указанием вашего имени. Ключ PGP по запросу; контакт также опубликован в /.well-known/security.txt (RFC 9116).

[email protected]