Політика безпеки
Herkos працює із приватними ключами та зашифрованими повідомленнями, тож ми серйозно ставимося до повідомлень про проблеми безпеки й воліємо дізнатися про проблему раніше, ніж пізніше.
Як повідомити про вразливість
Будь ласка, не відкривайте публічний issue щодо проблем безпеки.
Повідомте приватно електронною поштою на security@herkos.email.
Корисно вказати: у чому полягає проблема, як її відтворити, на якій платформі й версії ви тестували і чого може досягти зловмисник. Доказ концепції (proof of concept) дуже допомагає.
Ніколи не додавайте до повідомлення свій nsec, приватний ключ чи секрет bunker.
Ми намагаємося підтверджувати отримання повідомлень протягом кількох днів. Оскільки Herkos — невеликий проєкт, будь ласка, дайте нам розумний час на виправлення, перш ніж розголошувати проблему публічно. Ми з радістю згадаємо вас у бюлетені безпеки, якщо ви не захочете інакше.
Що входить у сферу дії
Сам застосунок Herkos: обробка та зберігання ключів, шифрування й
розшифрування повідомлень (зокрема перевірки відправника NIP-59 та ізоляція Bcc
у local_packages/nostr_mail), блокування застосунку, зв'язок із релеями й мостами,
обробка вкладень, а також конвеєр збирання й випуску. Для Herkos Drive — також
його пакет протоколу (packages/herkos_drive_protocol) і сторінка, що
відкриває його посилання (herkos.app/f/); див. його власний розділ нижче.
Що не входить у сферу дії
- Сам протокол Nostr і його NIP — повідомляйте про це їхнім авторам.
- Релеї, мости й сервери Blossom, які обслуговують треті сторони. Herkos постачається з типовими налаштуваннями, але не обслуговує їх; повідомляйте про проблеми їхнім операторам.
- Початковий проєкт Nostr Mail Client, якщо проблема не стосується саме змін, зроблених у Herkos.
- Відсутність захисних заходів, яку ми вже задокументували як відоме обмеження (див. нижче).
Відомі обмеження, сказані прямо
Це компроміси дизайну, а не вразливості. Ми воліємо записати їх, ніж щоб хтось дізнався про них на власному гіркому досвіді:
- Пошта на традиційні адреси не зашифрована наскрізно. Повідомлення між користувачами Nostr використовують NIP-17 gift wrap і зашифровані наскрізно. Коли ви пишете на звичайну адресу електронної пошти, міст перетворює повідомлення і може його прочитати.
- Блокування застосунку (PIN і біометрія) — це бар'єр зручності, а не шифрування даних у спокої. Воно зупиняє того, хто візьме розблокований пристрій; воно не захищає від зловмисника з повним доступом до пристрою чи його сховища.
- У Windows неможливо вимагати автентифікацію лише біометрією. Windows Hello не дає змоги вибрати метод, тож системний PIN завжди лишається доступним як запасний варіант.
- Втрата ключа означає втрату облікового запису. Відновлення немає — так задумано.
- Метадані приховано не повністю. Релеї можуть спостерігати шаблони з'єднань, і кожен релей бачить вашу IP-адресу, навіть коли не може прочитати вміст повідомлень. Чого Herkos не видає (з 30-09-2026), так це хто пише кому, коли релей просить автентифікацію NIP-42:
- Пошук, куди доставляти. Списки релеїв і Blossom одержувача
запитуються через окреме з'єднання, яке ніколи вас не ідентифікує, спершу на
релеях, що не вимагають автентифікації (
purplepag.es,user.kindpag.es,nos.lol,offchain.pub). - Профілі та планувальник. Ім'я та зображення, які показуються для будь-кого іншого (kind 0), і список релеїв DVM планувальника, коли ви плануєте або скасовуєте лист, запитуються так само: спершу анонімно, а якщо релей наполягає, — з тимчасовим ключем, описаним нижче, ніколи не з вашим (з 01-10-2026; раніше релей, який просив автентифікацію, отримував ваш ключ і міг дізнатися, чий профіль ви переглядаєте). Лише ваш власний профіль і досі читається від вашого імені.
- Доставка. Gift wrap надходять на релеї DM одержувача через те саме окреме з'єднання. Якщо якийсь із них вимагає автентифікації, Herkos відповідає ключем, створеним для цієї мети й збереженим лише в пам'яті, ніколи не вашим; кожен обліковий запис на пристрої має свій. Релей однаково може бачити, що той самий пристрій (та сама IP-адреса, той самий тимчасовий ключ) надіслав кілька конвертів протягом сеансу.
- Великі листи. Зашифрована копія листа понад 32 КБ завантажується на сервери Blossom, зокрема на сервери одержувачів. Лише ваші власні сервери (ваш список Blossom) отримують завантаження, авторизоване вашим ключем. Будь-який інший сервер отримує його анонімно, а якщо наполягає на авторизації, — підписаній тим самим тимчасовим ключем, що й вище (з 01-10-2026; раніше кожен сервер отримував ваш ключ). Сервер, який приймає лише відомі ключі, відхиляє його, і копія лишається на інших серверах.
- Ваші власні дані. Синхронізація вашої скриньки, міток, налаштувань і чернеток автентифікується, коли релей просить, як обліковий запис, якому належать дані, навіть під час перемикання облікових записів. Вашим власним релеям це не повідомляє нічого, чого вони не знали: запити й так містять ваш ключ. Ваші власні списки релеїв і Blossom публічні й запитуються без вашої ідентифікації, як і релеї, названі в посиланні в листі.
- Стан прочитання й папки — публічні метадані (поки що). Позначення листа прочитаним, зірочкою, архівованим чи переміщеним публікує незашифровану подію мітки NIP-32, прив'язану до вашого відкритого ключа, включно з назвами власних папок. Відправник, який знає ідентифікатор листа, надісланого вам, може дізнатися, коли ви з ним щось зробили. Шифрування цих міток заплановано; доти вважайте назви папок публічними.
- Push-сповіщення й відкладене надсилання використовують сторонні сервіси.
Push-сервер, якщо ви його оберете (типово жодного;
api.nmail.liзrelay.nmail.liна запит), дізнається ваш відкритий ключ, push-токен і час отримання пошти; DVM планувальника дізнається ваш відкритий ключ і вже зашифровані повідомлення, які має опублікувати. Обидва вмикаються лише за вашим бажанням і описані вPRIVACY.md. Текст push-сповіщення обирає push-сервер, і Herkos довіряє йому лише тоді, коли UnifiedPush доставляє його зашифрованим (RFC 8291); незашифрований вміст лише будить застосунок, щоб він сам забрав пошту. - Вебверсія зберігає ваш ключ у браузері, а це найслабше місце для нього. Встановлені застосунки передають ваш приватний ключ до захищеного сховища операційної системи (Android Keystore, DPAPI у Windows, libsecret, зв'язка ключів iOS/macOS). У браузері нічого такого немає: ключ лежить у сховищі сайту й проходить через JavaScript під час кожного підпису, у досяжності будь-якого коду, що виконується на сторінці, — розширення браузера з доступом до всіх сайтів, вразливості XSS у застосунку чи в залежності, підміненого розгортання, — а також будь-якого інфостілера, що копіює профіль браузера. До того ж немає моменту, коли ви один раз перевіряєте код: підписаний двійковий файл перевіряється під час встановлення, тоді як вебсторінка віддає новий код під час кожного відвідування. Входьте у вебверсію через віддалений застосунок для підпису (bunker NIP-46, Amber), щоб ключ ніколи не потрапляв у браузер, або використовуйте в ній одноразовий обліковий запис, а справжній ключ тримайте у встановленому застосунку.
- Пошта через міст надійна рівно настільки, наскільки надійний міст. Herkos перевіряє, що
повідомлення, позначене як таке, що пройшло через міст, справді підписане мостом, який ви
налаштували (або одним із типових). Він не може нічого перевірити щодо
традиційної адреси
From:, яку передає міст. - Вкладення відкриває операційна система. Herkos ніколи не запускає виконувані файли чи скрипти і питає, перш ніж передати будь-яке інше вкладення без попереднього перегляду типовому системному застосунку, але застосунок, який відкриває файл, поза нашим контролем.
Herkos Local Relay: що він захищає, а що ні
Herkos Local Relay зберігає на вашому пристрої події ваших застосунків, зокрема приватні (чернетки, приватні списки, конверти, які ви отримуєте). Ось що їх захищає і де проходить межа — для кожної платформи окремо. Про проблеми безпеки релея повідомляйте так само, як про будь-які інші (див. вище).
Уся база даних зашифрована, разом із журналом транзакцій (SQLite3 Multiple Ciphers, AEGIS-256). Ключ — це 32 випадкові байти, створені на пристрої та збережені в захищеному сховищі системи: Keystore в Android, DPAPI у Windows, зв'язка ключів (libsecret) у Linux. Вашого пароля в нього немає, бо релей має запускатися сам. Без ключа релей не запускається і повідомляє про це: він ніколи не відкриває й не створює незашифровану базу і ніколи не видаляє ту, яку не може відкрити.
| Якщо… | Android | Windows | Linux |
|---|---|---|---|
| хтось копіює файл бази (резервна копія, синхронізована папка, образ диска) | Захищено | Захищено | Захищено |
| викрадено вимкнений пристрій або диск | Захищено: ключ у Keystore | Захищено, якщо не знають пароля вашого облікового запису Windows: DPAPI захищає ним ключ | Захищено, якщо не знають пароля вашої зв'язки ключів (майже завжди це пароль вашого сеансу) |
| інший обліковий запис користувача на тому самому пристрої | Захищено | Захищено: DPAPI працює окремо для кожного користувача | Захищено: у кожного користувача своя зв'язка ключів |
| інший застосунок чи програма, що працює від імені вашого користувача | Захищено: Android ізолює кожен застосунок, а Keystore віддає ключ лише релею | Ні: DPAPI шифрує для користувача, а не для застосунку; програма, що працює від вашого імені, може запросити ключ так само, як релей | Ні: зв'язка ключів вашого сеансу не відокремлює застосунки один від одного |
| телефон із root-доступом або інструмент, що виконує код від імені застосунку | Ні | — | — |
| хтось тримає в руках розблокований пристрій | Лише PIN або відбиток пальця релея, якщо ви їх задали | Так само | Так само |
| хтось читає пам'ять релея під час його роботи | Ні | Ні | Ні |
На комп'ютері межа DPAPI і зв'язки ключів така сама, як у будь-якої програми: вони захищають від інших користувачів і від того, хто забере диск, але не від шкідливої програми, що вже працює від вашого імені. Якщо вас турбує цей випадок, захищає шифрування системного диска (BitLocker, LUKS) і відмова від запуску програм, яким ви не довіряєте. У Linux без зв'язки ключів (без Secret Service) релей не запускається і пояснює чому: він ніколи не зберігає ключ у відкритому вигляді.
Хто входить — на самому пристрої. Релей слухає лише на 127.0.0.1, а до
цієї адреси може дістатися будь-який застосунок на пристрої або вебсторінка в
браузері. Тому:
- Застосунок має спряжитися: він з'являється на екрані релея, і ви його схвалюєте (PIN-кодом або відбитком пальця, якщо ви їх задали). Будь-який застосунок може назватися як завгодно: схвалюйте, лише якщо ви щойно попросили про це з цього застосунку.
- Вебсторінка спрягається завжди, і спряження діє лише звідти, де його зроблено: спряження застосунку на пристрої нічого не відкриває вебсторінці, навіть якщо вона підписує тим самим ключем.
- Спряжений застосунок читає й записує лише ті види подій, які ви йому дозволили, і видаляє лише ті, які може записувати. Відкликання одразу його від'єднує.
- Неспряжений застосунок читає лише ваші публічні події (які й так публічні) і нічого не записує, якщо ви не ввімкнете налаштування, яке впускає неспряжені застосунки пристрою.
- Приватні події видаються лише тому, хто доведе через NIP-42, що має ключ, якому вони належать, а конверт — лише його адресатові.
Чого він тут не захищає:
- Шкідливий застосунок на пристрої може сповільнити релей або змусити його витрачати пам'ять. Прочитати щось приватне в такий спосіб він не може.
- Поки релей спить або не працює, його порт вільний. В Android він засинає після 10 хвилин без з'єднань; на комп'ютері порт вільний, поки ви його не запустили. Інший застосунок міг би слухати на цьому порту й видавати себе за релей. Застосунки Herkos перевірятимуть ключ релея, перш ніж надсилати йому щось приватне; поки вони цього не роблять, і доти це реальна межа.
- На комп'ютері інші користувачі цього комп'ютера можуть під'єднатися як неспряжений застосунок: читати ваші публічні події й просити про спряження.
Локальна мережа, якщо ви її ввімкнете (типово вона вимкнена):
- Лише
wss://, із власним сертифікатом релея; ніколи незашифрованийws://поза пристроєм. - Нічого до автентифікації (NIP-42) ключем із вашого списку. З'єднання, яке не зробить цього за 30 секунд, закривається, а локальна мережа має власний ліміт з'єднань: вона ніколи не займає з'єднання застосунків пристрою.
- Ключ зі списку читає ваші публічні події та власні приватні і записує лише події, підписані ним самим. Вилучення його зі списку його від'єднує.
- Сертифікат дійсний лише для домашніх імен (
localhost,.local, приватні адреси): навіть якби хтось викрав його ключ, той не допоміг би підписати інтернет-домен на пристроях, які його встановили.
Чого він тут не захищає: будь-хто в тій самій мережі бачить, що пристрій має відкритий порт і скільки трафіку через нього проходить, хоча й не що саме; а якщо пристрій має публічну адресу (без роутера посередині), цей порт видно з інтернету, хоча він і далі вимагає ключ із вашого списку.
Копії. Зашифрована копія має пароль (scrypt і XChaCha20-Poly1305): без нього її ніхто не відкриє, зокрема й ми. Експорт у JSONL не зашифрований і містить ваші приватні події у відкритому вигляді; застосунок про це попереджає.
Блокування (PIN, а також відбиток пальця або Windows Hello) запитується під час відкриття застосунку, після 30 секунд поза ним і для схвалення спряження. Це бар'єр зручності, як у Mail: воно нічого не шифрує. В Android із заданим PIN-кодом немає знімків екрана й мініатюри серед нещодавніх застосунків, а починаючи з Android 12 вікно жодного іншого застосунку не може опинитися поверх вікна релея, поки ви ним користуєтеся.
Herkos Drive: що він захищає, а що ні
Herkos Drive зберігає ваші файли на серверах Blossom, а список ваших файлів і
папок — на релеях Nostr, і те, і те зашифрованим на вашому пристрої. Ось що їх
захищає і де пролягають межі. Усі подробиці — у spec-drive.md і в моделі
загроз amenazas-drive.md, у packages/herkos_drive_protocol/; що бачить
кожен релей і кожен сервер — у політиці
конфіденційності. Повідомляйте про проблеми
безпеки Drive так само, як про будь-які інші (див. вище).
Чого релеї та сервери зробити не можуть:
- Прочитати ваші файли чи їхні назви. Кожен блок файлу шифрується AES-256-GCM ключем його власної ревізії; назви, папки, розміри, дати й ключі передаються запечатаними XChaCha20-Poly1305 ключем папки, у якій вони лежать. Ніщо не виводиться з умісту: той самий файл, вивантажений двічі, дає різні блоки.
- Непомітно змінити, підмінити чи перемістити будь-що. Кожен блок перевіряється за маніфестом, запечатаним у записі його файлу, а кожен запис підписано ключем тому й запечатано для свого місця (том, ідентифікатор і папка): релей не може видати один запис за інший або один блок за інший.
- Повернути стару версію. Застосунок ніколи не приймає запис, старіший за той, що він уже має для того самого ідентифікатора.
- Писати від вашого імені, маючи лише ключ тому. Те, що пишуть ваші пристрої, несе мітку власника — HMAC із ключем, якого не дає жодне посилання; запис або видалення без неї не приймаються, і застосунок вас попереджає.
Чого він не захищає:
- Картину вашого Drive. Релеї можуть підрахувати ваші файли й папки, побачити форму дерева й те, коли змінюється кожен запис; сервери бачать приблизно, якого розміру кожен файл (блоки доповнюються до 64 КіБ, записи — до степеня двійки). Кожен релей і кожен сервер бачать вашу IP-адресу. Використовуйте Tor або Orbot на рівні системи, якщо це для вас важливо.
- Те, що хтось уже завантажив. Видалення посилання чи людини одразу дає нові ключі тому, що вона могла відкрити, тож вона не відкриє того, що ви додасте пізніше; повернути те, що вона вже зберегла, це не може.
- Посилання, що витекло. Посилання без пароля і є ключ. Браузер може зберегти його в історії до того, як сторінка прибере його з адресного рядка. Для всього, що потребує обережності, задайте посиланню пароль і передайте його іншим шляхом або поділіться з обліковим записом людини. Слабкий пароль із часом можна підібрати: той, у кого є посилання, може перебирати офлайн.
- Сторінку
herkos.app/f/, яка працює в браузері того, хто відкриває посилання. Вона віддається із суворою Content-Security-Policy, Subresource Integrity і без стороннього коду, але той, хто контролює вебхостинг, міг би віддати іншу сторінку. Це межа будь-якої вебсторінки, що розшифровує в браузері. - Того, у кого був ключ тому (ваш або переданий із посиланням на папку): він усе ще може видалити блоки, вивантажені з цим ключем, доки їх не буде вивантажено знову. Ключ тому можна змінити (Налаштування → Ключ тому): ваші інші пристрої переходять на новий самі.
- Ваш пристрій. Список файлів кешується зашифрованим, а його ключ зберігається в захищеному сховищі системи; файл, який ви завантажуєте чи відкриваєте, записується у відкритому вигляді туди, куди ви оберете. PIN Drive — бар'єр зручності, як у Mail.
- Квантовий комп'ютер у майбутньому. Блоки й печатки симетричні (AES-256, XChaCha20), але ваш локатор зашифровано NIP-44 на secp256k1: той, хто збереже його сьогодні й зламає secp256k1 завтра, зможе відкрити весь Drive.
Як це перевіряється. Дві внутрішні перевірки за моделлю загроз (2 листопада 2026 року) і виправлення за їхніми підсумками; тести того, що показує кожна подія й кожен блок; фазинг кожного обробника того, що надходить ззовні (події, печатки, маніфести, посилання, резервні копії). Зовнішнього аудиту поки немає: його заплановано до публічної бети, і його звіт буде опубліковано повністю. Drive ще перебуває в розробці.
Підтримувані версії
Виправлення безпеки застосовуються до останньої випущеної версії. З огляду на розмір проєкту старіші версії не підтримуються — будь ласка, оновіться, перш ніж повідомляти.