Bezpečnostní zásady
Herkos pracuje se soukromými klíči a šifrovanými zprávami, proto bereme hlášení o bezpečnosti vážně a o problému se raději dozvíme dřív než později.
Hlášení zranitelnosti
Bezpečnostní problémy prosím nehlaste ve veřejném issue.
Nahlaste je soukromě e-mailem na security@herkos.email.
Hodí se uvést: v čem problém spočívá, jak ho reprodukovat, na jaké platformě a verzi jste testovali a čeho by mohl útočník dosáhnout. Hodně pomůže proof of concept.
Do hlášení nikdy nevkládejte svůj nsec, tajný klíč ani tajemství bunkeru.
Snažíme se hlášení potvrdit během několika dní. Herkos je malý projekt, proto prosím před zveřejněním ponechte přiměřený čas na opravu. V bezpečnostním oznámení vás rádi uvedeme jako autora nálezu, pokud si nepřejete jinak.
Co do rozsahu patří
Samotná aplikace Herkos: práce s klíči a jejich ukládání, šifrování a
dešifrování zpráv (včetně kontrol odesílatele NIP-59 a izolace Bcc
v local_packages/nostr_mail), zámek aplikace, komunikace s relé a mosty,
práce s přílohami a proces sestavení a vydávání. U Herkos Drive také jeho
protokolový balíček (packages/herkos_drive_protocol) a stránka, která
otevírá jeho odkazy (herkos.app/f/); viz jeho vlastní oddíl níže.
Co do rozsahu nepatří
- Samotný protokol Nostr a jeho NIPy — ty hlaste u jejich autorů.
- Relé, mosty a servery Blossom provozované třetími stranami. Herkos je nabízí ve výchozím nastavení, ale neprovozuje je; problémy hlaste jejich provozovatelům.
- Původní projekt Nostr Mail Client, pokud se problém netýká přímo změn provedených v Herkosu.
- Chybějící zabezpečení, které už dokumentujeme jako známé omezení (viz níže).
Známá omezení, řečeno na rovinu
Jde o kompromisy v návrhu, ne o zranitelnosti. Raději je sepíšeme, než aby je někdo objevil na vlastní kůži:
- Pošta na tradiční adresy není koncově šifrovaná. Zprávy mezi uživateli Nostru používají NIP-17 gift wrap a jsou šifrované E2E. Když píšete na běžnou e-mailovou adresu, most zprávu převádí a může ji číst.
- Zámek aplikace (PIN a biometrie) je pohodlná bariéra, ne šifrování uložených dat. Zastaví někoho, kdo zvedne odemčené zařízení; nechrání před útočníkem s plným přístupem k zařízení nebo k jeho úložišti.
- Ve Windows nelze vynutit ověření pouze biometrií. Windows Hello neumožňuje zvolit metodu, takže systémový PIN zůstává vždy k dispozici jako záloha.
- Ztráta klíče znamená ztrátu účtu. Žádná obnova neexistuje, záměrně.
- Metadata nejsou zcela skrytá. Relé mohou pozorovat vzorce připojení a každé relé vidí vaši IP adresu, i když nemůže číst obsah zpráv. Co Herkos (od 30. 9. 2026) neprozrazuje, je, kdo píše komu, když relé žádá ověření NIP-42:
- Zjišťování, kam doručit. Seznamy relé a serverů Blossom příjemce se
zjišťují přes samostatné připojení, které vás nikdy neidentifikuje, nejprve na
relé, která ověření nevyžadují (
purplepag.es,user.kindpag.es,nos.lol,offchain.pub). - Profily a plánovač. Jméno a obrázek zobrazované u kohokoli jiného (kind 0) a seznam relé plánovacího DVM, když naplánujete nebo zrušíte e-mail, se zjišťují stejně: nejprve anonymně, a pokud relé trvá na ověření, dočasným klíčem popsaným níže, nikdy vaším (od 1. 10. 2026; předtím relé, které žádalo ověření, dostalo váš klíč a mohlo poznat, čí profil si prohlížíte). Jen váš vlastní profil se stále čte jako vy.
- Doručování. Gift wraps putují na relé pro soukromou poštu příjemce, přes stejné samostatné připojení. Pokud některé z nich vyžaduje ověření, Herkos odpoví klíčem vytvořeným pro tento účel a drženým jen v paměti, nikdy vaším; každý účet v zařízení má svůj vlastní. Relé přesto může vidět, že stejné zařízení (stejná IP, stejný dočasný klíč) během relace odeslalo několik obálek.
- Velké e-maily. Šifrovaná kopie e-mailu nad 32 KB se nahrává na servery Blossom, včetně serverů příjemců. Jen vaše vlastní servery (váš seznam Blossom) dostanou nahrání autorizované vaším klíčem. Každý jiný server ho dostane anonymně, a pokud trvá na autorizaci, podepsané stejným dočasným klíčem jako výše (od 1. 10. 2026; předtím každý server dostal váš klíč). Server, který přijímá jen známé klíče, ho odmítne a kopie zůstane na ostatních serverech.
- Vaše vlastní data. Synchronizace vaší schránky, štítků, nastavení a konceptů se tam, kde to relé žádá, ověřuje jako účet, kterému data patří, i během přepínání účtů. Vašim vlastním relé to neříká nic, co by nevěděla: požadavky váš klíč stejně uvádějí. Vaše vlastní seznamy relé a serverů Blossom jsou veřejné a zjišťují se bez vaší identifikace, stejně jako relé uvedená v odkazu v e-mailu.
- Stav přečtení a složky jsou (zatím) veřejná metadata. Označení e-mailu jako přečteného, s hvězdičkou, archivovaného nebo přesunutého zveřejní nešifrovanou událost štítku NIP-32 spojenou s vaším veřejným klíčem, včetně názvů vlastních složek. Odesílatel, který zná id e-mailu, jež vám poslal, může poznat, kdy jste s ním něco udělali. Šifrování těchto štítků je v plánu; do té doby berte názvy složek jako veřejné.
- Push oznámení a plánované odesílání využívají služby třetích stran.
Push server, pokud si nějaký zvolíte (ve výchozím stavu žádný;
api.nmail.lisrelay.nmail.lina požádání), se dozví váš veřejný klíč, push token a kdy přijímáte poštu; plánovací DVM se dozví váš veřejný klíč a už zašifrované zprávy, které má zveřejnit. Obojí je volitelné a popsané vPRIVACY.md. Text push oznámení volí push server a Herkos mu věří, jen když ho UnifiedPush doručí šifrovaný (RFC 8291); nešifrovaný obsah aplikaci jen probudí, aby si poštu stáhla sama. - Webová verze drží váš klíč v prohlížeči, což je pro něj nejslabší místo. Nainstalované aplikace předávají váš tajný klíč zabezpečenému úložišti operačního systému (Android Keystore, DPAPI ve Windows, libsecret, iOS/macOS Keychain). Prohlížeč nic z toho nemá: klíč leží v úložišti původu (origin) a při každém podpisu jím prochází JavaScript, v dosahu jakéhokoli kódu, který na stránce běží — rozšíření prohlížeče s přístupem ke všem webům, chyby XSS v aplikaci nebo v závislosti, podvrženého nasazení — i jakéhokoli infostealeru, který zkopíruje profil prohlížeče. Neexistuje ani okamžik, kdy byste kód jednou ověřili: podepsaný binární soubor se kontroluje při instalaci, zatímco webová stránka při každé návštěvě dodává nový kód. Do webové verze se přihlaste vzdálenou podpisovou aplikací (bunker NIP-46, Amber), aby se klíč do prohlížeče nikdy nedostal, nebo ji berte jako identitu na jedno použití a svůj skutečný klíč držte v nainstalované aplikaci.
- Pošta přes most je jen tak důvěryhodná jako most. Herkos ověřuje, že
zpráva označená jako doručená přes most byla opravdu podepsána mostem, který
máte nastavený (nebo jedním z výchozích). Nemůže ale nic ověřit o
tradiční adrese
From:, kterou most předává. - Přílohy otevírá operační systém. Herkos nikdy nespouští spustitelné soubory ani skripty a před předáním jakékoli jiné přílohy bez náhledu výchozí systémové aplikaci se zeptá, ale aplikace, která soubor otevře, je mimo naši kontrolu.
Herkos Local Relay: co chrání a co ne
Herkos Local Relay uchovává události vašich aplikací ve vašem zařízení, i ty soukromé (koncepty, soukromé seznamy, obálky, které přijímáte). Tady je, co je chrání a kde je hranice, platformu po platformě. Bezpečnostní chyby relé hlaste stejně jako všechny ostatní (viz výše).
Celá databáze je šifrovaná, včetně žurnálu (SQLite3 Multiple Ciphers, AEGIS-256). Klíč tvoří 32 náhodných bajtů vytvořených v zařízení a uložených v zabezpečeném úložišti systému: v Keystore v Androidu, pomocí DPAPI ve Windows, v klíčence (libsecret) v Linuxu. Nechrání ho žádné vaše heslo, protože relé se musí spustit samo. Bez klíče se relé nespustí a řekne to: nikdy neotevře ani nevytvoří nešifrovanou databázi a nikdy nesmaže databázi, kterou nedokáže otevřít.
| Pokud… | Android | Windows | Linux |
|---|---|---|---|
| někdo zkopíruje soubor databáze (záloha, synchronizovaná složka, obraz disku) | Chráněno | Chráněno | Chráněno |
| někdo ukradne vypnuté zařízení nebo disk | Chráněno: klíč je v Keystore | Chráněno, pokud zloděj nezná vaše přihlašovací heslo do Windows: DPAPI jím klíč chrání | Chráněno, pokud zloděj nezná heslo vaší klíčenky (téměř vždy je to heslo vaší relace) |
| jiný uživatelský účet ve stejném zařízení | Chráněno | Chráněno: DPAPI je pro každého uživatele zvlášť | Chráněno: klíčenka je pro každého uživatele zvlášť |
| jiná aplikace nebo program spuštěný pod vaším uživatelem | Chráněno: Android od sebe aplikace odděluje a Keystore dá klíč jen relé | Ne: DPAPI šifruje pro uživatele, ne pro aplikaci; program spuštěný jako vy si může o klíč říct stejně jako relé | Ne: klíčenka vaší relace od sebe aplikace neodděluje |
| telefon s rootem nebo nástroj, který spouští kód jako aplikace | Ne | — | — |
| někdo drží odemčené zařízení v ruce | Jen PIN nebo otisk prstu relé, pokud je nastavíte | Stejně | Stejně |
| někdo čte paměť relé, zatímco běží | Ne | Ne | Ne |
Na počítači je hranice DPAPI i klíčenky stejná jako u každého programu: chrání před jinými uživateli a před tím, kdo odnese disk, ne před škodlivým programem, který už běží pod vaším uživatelem. Pokud vás tento případ znepokojuje, chrání vás šifrování systémového disku (BitLocker, LUKS) a to, že nespouštíte programy, kterým nedůvěřujete. V Linuxu bez klíčenky (bez Secret Service) se relé nespustí a vysvětlí proč: klíč nikdy neukládá nešifrovaný.
Kdo se dostane dovnitř, přímo v zařízení. Relé naslouchá jen na
127.0.0.1 a na tuto adresu se dostane každá aplikace v zařízení i webová
stránka v prohlížeči. Proto:
- Aplikace se musí spárovat: objeví se na obrazovce relé a vy ji schválíte (PINem nebo otiskem prstu, pokud jste je nastavili). Každá aplikace si může dát jakýkoli název: schvalujte jen tehdy, když jste o to právě požádali z té aplikace.
- Webová stránka se musí spárovat vždy a spárování platí jen tam, kde vzniklo: spárování aplikace v zařízení webové stránce nic neotevře, ani když podepisuje stejným klíčem.
- Spárovaná aplikace čte a zapisuje jen ty druhy událostí, které jste jí povolili, a maže jen ty, které smí zapisovat. Odvolání ji okamžitě odpojí.
- Nespárovaná aplikace čte jen vaše veřejné události (které jsou tak jako tak veřejné) a nic nezapisuje, pokud nezapnete nastavení, které pouští dovnitř nespárované aplikace v zařízení.
- Soukromé události se vydávají jen tomu, kdo pomocí NIP-42 prokáže, že má klíč, ke kterému patří, a obálka jen jejímu příjemci.
Co tady nechrání:
- Škodlivá aplikace v zařízení může relé zpomalit nebo ho přimět spotřebovávat paměť. Nic soukromého tím přečíst nemůže.
- Když relé spí nebo neběží, jeho port je volný. V Androidu usne po 10 minutách bez připojení; na počítači je port volný, dokud relé nespustíte. Jiná aplikace by na něm mohla naslouchat a vydávat se za relé. Aplikace Herkos budou ověřovat klíč relé, než mu pošlou cokoli soukromého; zatím to nedělají a do té doby je to skutečná hranice.
- Na počítači se ostatní uživatelé počítače mohou připojit jako nespárovaná aplikace: číst vaše veřejné události a požádat o spárování.
Místní síť, pokud ji zapnete (ve výchozím stavu je vypnutá):
- Jen
wss://, s vlastním certifikátem relé; mimo zařízení nikdy nešifrovanéws://. - Nic před ověřením (NIP-42) klíčem z vašeho seznamu. Připojení, které to neudělá do 30 sekund, se zavře, a místní síť má vlastní počet připojení: nikdy nezabírá ta, která patří aplikacím v zařízení.
- Klíč ze seznamu čte vaše veřejné události a své vlastní soukromé a zapisuje jen události, které sám podepsal. Odebrání ze seznamu ho odpojí.
- Certifikát platí jen pro domácí názvy (
localhost,.local, soukromé adresy): i kdyby někdo ukradl jeho klíč, nemohl by jím na zařízeních, která certifikát nainstalovala, podepsat internetovou doménu.
Co tady nechrání: kdokoli ve stejné síti vidí, že zařízení má otevřený port a kolik provozu jím prochází, i když ne co; a pokud má zařízení veřejnou adresu (bez routeru mezi ním a internetem), je ten port vidět z internetu, i když stále vyžaduje klíč z vašeho seznamu.
Zálohy. Šifrovaná záloha má heslo (scrypt a XChaCha20-Poly1305): bez něj ji nikdo neotevře, ani my. Export JSONL šifrovaný není a obsahuje vaše soukromé události v prostém textu; aplikace vás na to upozorní.
Zámek (PIN a k tomu otisk prstu nebo Windows Hello) se vyžaduje při otevření aplikace, po 30 sekundách mimo ni a ke schválení spárování. Je to pohodlná bariéra, jako v Mailu: nic nešifruje. V Androidu s nastaveným PINem nejdou pořizovat snímky obrazovky a v nedávných aplikacích se nezobrazuje náhled, a od Androidu 12 se přes okno relé nemůže položit okno žádné jiné aplikace, zatímco ho používáte.
Herkos Drive: co chrání a co ne
Herkos Drive uchovává vaše soubory na serverech Blossom a seznam vašich souborů
a složek na relé Nostr, obojí šifrované ve vašem zařízení. Toto je to, co je
chrání, a kde jsou hranice. Všechny podrobnosti jsou v spec-drive.md
a v modelu hrozeb amenazas-drive.md, v packages/herkos_drive_protocol/; co
vidí každé relé a server, popisují
zásady ochrany soukromí. Bezpečnostní
problémy Drive hlaste stejně jako všechny ostatní (výše).
Co relé a servery udělat nemohou:
- Číst vaše soubory ani jejich názvy. Každý blok souboru je šifrovaný AES-256-GCM klíčem vlastním pro jeho revizi; názvy, složky, velikosti, data a klíče jsou zapečetěné XChaCha20-Poly1305 klíčem složky, ve které jsou. Nic se neodvozuje z obsahu: stejný soubor nahraný dvakrát dá různé bloky.
- Nepozorovaně cokoli změnit, zaměnit nebo přesunout. Každý blok se kontroluje proti manifestu zapečetěnému v záznamu jeho souboru a každý záznam je podepsaný klíčem svazku a zapečetěný pro své vlastní místo (svazek, identifikátor a složka): relé nemůže vydávat jeden záznam za jiný ani jeden blok za jiný.
- Vrátit starou verzi. Aplikace nikdy nepřijme záznam starší, než jaký už má pro tentýž identifikátor.
- Psát za vás jen s klíčem svazku. Co zapisují vaše zařízení, nese značku vlastníka, HMAC s klíčem, který žádný odkaz nedává; záznam nebo smazání bez ní se nepřijme a aplikace vás upozorní.
Co nechrání:
- Vzorec vašeho Drive. Relé mohou spočítat vaše soubory a složky, vidět tvar stromu a kdy se který záznam mění; servery vidí přibližně, jak velký je každý soubor (bloky se doplňují na 64 KiB, záznamy na mocninu dvou). Každé relé a server vidí vaši IP adresu. Pokud vám na tom záleží, použijte Tor nebo Orbot na úrovni systému.
- Co už někdo stáhl. Odstranění odkazu nebo osoby dá tomu, co mohla otevřít, hned nové klíče, takže neotevře, co přidáte později; nemůže ale vzít zpět, co už si uložila.
- Uniklý odkaz. Odkaz bez hesla je klíč. Prohlížeč si ho může uložit do historie dřív, než ho stránka odstraní z adresního řádku. Pro cokoli citlivého dejte odkazu heslo, poslané jinou cestou, nebo sdílejte s účtem dané osoby. Slabé heslo lze časem prolomit: kdo má odkaz, může zkoušet offline.
- Stránka
herkos.app/f/běží v prohlížeči toho, kdo odkaz otevře. Je poskytována s přísnou Content-Security-Policy, Subresource Integrity a bez kódu třetích stran, ale kdo ovládá webhosting, mohl by poskytnout jinou stránku. To je hranice každé webové stránky, která dešifruje v prohlížeči. - Kdo měl klíč svazku (váš, nebo předaný s odkazem na složku), může dál mazat bloky, které se s ním nahrály, dokud se nenahrají znovu. Klíč svazku můžete změnit (Nastavení → Klíč svazku): vaše ostatní zařízení se přizpůsobí sama.
- Vaše zařízení. Seznam souborů je v mezipaměti šifrovaný, s klíčem v zabezpečeném úložišti systému; soubor, který stáhnete nebo otevřete, se zapíše nešifrovaný tam, kam zvolíte. PIN v Drive je bariéra pro pohodlí, stejně jako v Mail.
- Kvantový počítač, později. Bloky a pečeti jsou symetrické (AES-256, XChaCha20), ale váš lokátor je šifrovaný NIP-44 na secp256k1: kdo si ho dnes uloží a zítra prolomí secp256k1, mohl by otevřít celý Drive.
Jak se to ověřuje. Dvě interní revize vůči modelu hrozeb (2. listopadu 2026) a jejich opravy; testy toho, co ukazuje každá událost a každý blok; fuzzing každého čtenáře toho, co přichází zvenčí (události, pečeti, manifesty, odkazy, zálohy). Zatím žádný externí audit: jeden se plánuje před veřejnou betou a jeho zpráva bude zveřejněna celá. Drive je stále ve vývoji.
Podporované verze
Bezpečnostní opravy se vydávají pro nejnovější vydanou verzi. Vzhledem k velikosti projektu se starší verze neudržují — před nahlášením prosím aktualizujte.