В сравнении
Мы сравниваем FOLD только по свойствам, которые можно проверить, и для каждого столбца даём ссылку на источник. Данные по конкурентам на июнь 2026 года; если производитель что-то изменит, изменится и эта таблица.
| Свойство | FOLD | Apple Mail | Mimestream | Spark | Thunderbird | Outlook (новый) |
|---|---|---|---|---|---|---|
| Без дополнительного облачного бэкенда | Да | Да | Да напрямую к 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. Прямая загрузка добавляет в оболочку приложения один механизм обновления.
| Разрешено | |
|---|---|
Foundation | Apple SDK. Потоки с TLS несут IMAP и SMTP, включая STARTTLS на действующем соединении. |
CryptoKit | Ed25519, X25519, AES-GCM, SHA-2, HKDF. |
Security | Связка ключей, SecTrust, RSA, CMS для S/MIME в macOS. |
CommonCrypto | Блочный шифр AES для режимов OCB и CFB. |
AuthenticationServices | ASWebAuthenticationSession для OAuth. |
SQLite3 | Системный SQLite через тонкую обёртку на Swift. Без GRDB, без SQLite.swift. |
WebKit | Защищённое отображение писем: JavaScript отключён, строгая политика контента. |
os.Logger | Apple 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).