Bezpečnostná politika
Herkos pracuje so súkromnými kľúčmi a šifrovanými správami, preto berieme hlásenia o bezpečnosti vážne a o probléme sa radšej dozvieme skôr ako neskôr.
Nahlásenie zraniteľnosti
Bezpečnostné problémy, prosím, nehláste cez verejné issue.
Nahláste ich súkromne e-mailom na security@herkos.email.
Užitočné je uviesť: o aký problém ide, ako ho zopakovať, na akej platforme a verzii ste testovali a čo by mohol útočník dosiahnuť. Veľmi pomôže proof of concept.
Do hlásenia nikdy nevkladajte svoj nsec, súkromný kľúč ani tajomstvo bunkra.
Snažíme sa potvrdiť prijatie hlásenia do niekoľkých dní. Keďže Herkos je malý projekt, pred zverejnením nám, prosím, nechajte primeraný čas na opravu. Radi vás uvedieme v bezpečnostnom upozornení, pokiaľ si neželáte inak.
Čo patrí do rozsahu
Samotná aplikácia Herkos: práca s kľúčmi a ich ukladanie, šifrovanie a
dešifrovanie správ (vrátane kontrol odosielateľa NIP-59 a izolácie skrytej kópie (Bcc)
v local_packages/nostr_mail), zámok aplikácie, komunikácia s relé a mostami,
spracovanie príloh a proces zostavovania a vydávania. Pri Herkos Drive aj jeho
protokolový balík (packages/herkos_drive_protocol) a stránka, ktorá otvára
jeho odkazy (herkos.app/f/); pozri jeho vlastnú časť nižšie.
Čo nepatrí do rozsahu
- Samotný protokol Nostr a jeho NIP — tie hláste priamo ich autorom.
- Relé, mosty a servery Blossom prevádzkované tretími stranami. Herkos ich má v predvolených nastaveniach, ale neprevádzkuje ich; problémy hláste ich prevádzkovateľom.
- Pôvodný projekt Nostr Mail Client, pokiaľ sa problém netýka konkrétne zmien vykonaných v Herkos.
- Chýbajúce spevnenie, ktoré už uvádzame ako známe obmedzenie (pozri nižšie).
Známe obmedzenia, povedané na rovinu
Ide o kompromisy v návrhu, nie o zraniteľnosti. Radšej ich napíšeme, než aby ich niekto objavil na vlastnej koži:
- Pošta na tradičné adresy nie je koncovo šifrovaná. Správy medzi používateľmi Nostr používajú NIP-17 gift wrap a sú koncovo šifrované. Keď píšete na bežnú e-mailovú adresu, most správu prevedie a môže ju čítať.
- Zámok aplikácie (PIN a biometria) je pohodlná bariéra, nie šifrovanie uložených údajov. Zastaví niekoho, kto zoberie odomknuté zariadenie; nechráni pred útočníkom s plným prístupom k zariadeniu alebo jeho úložisku.
- Vo Windows nemožno vynútiť overenie výlučne biometriou. Windows Hello neumožňuje vybrať metódu, takže systémový PIN zostáva vždy k dispozícii ako záložná možnosť.
- Strata kľúča znamená stratu účtu. Obnovenie neexistuje, a to zámerne.
- Metadáta nie sú úplne skryté. Relé môžu pozorovať vzorce pripojení a každé relé vidí vašu IP adresu, aj keď nemôže čítať obsah správ. Čo Herkos neprezradí (od 30. 9. 2026), je, kto píše komu, keď relé požiada o overenie NIP-42:
- Zisťovanie, kam doručiť. Zoznamy relé a serverov Blossom príjemcu sa
vyžiadajú cez samostatné pripojenie, ktoré vás nikdy neidentifikuje, najprv na
relé, ktoré nevyžadujú overenie (
purplepag.es,user.kindpag.es,nos.lol,offchain.pub). - Profily a plánovač. Meno a obrázok zobrazované pre kohokoľvek iného (kind 0) a zoznam relé plánovacieho DVM, keď naplánujete alebo zrušíte e-mail, sa vyžiadajú rovnako: najprv anonymne a ak relé trvá na overení, s dočasným kľúčom opísaným nižšie, nikdy s vaším (od 1. 10. 2026; predtým relé, ktoré požiadalo o overenie, dostalo váš kľúč a mohlo zistiť, čí profil si prezeráte). Len váš vlastný profil sa stále načítava pod vašou identitou.
- Doručovanie. Gift wraps idú na relé pre súkromnú poštu príjemcu cez to isté samostatné pripojenie. Ak niektoré z nich vyžaduje overenie, Herkos odpovie kľúčom vytvoreným na tento účel a uchovávaným len v pamäti, nikdy vaším; každý účet v zariadení má vlastný. Relé však stále môže vidieť, že to isté zariadenie (rovnaká IP, rovnaký dočasný kľúč) počas relácie poslalo viacero obálok.
- Veľké e-maily. Šifrovaná kópia e-mailu väčšieho ako 32 KB sa nahrá na servery Blossom vrátane serverov príjemcov. Len vaše vlastné servery (váš zoznam Blossom) dostanú nahrávanie autorizované vaším kľúčom. Akýkoľvek iný server ho dostane anonymne, a ak trvá na autorizácii, podpísanej rovnakým dočasným kľúčom ako vyššie (od 1. 10. 2026; predtým každý server dostal váš kľúč). Server, ktorý prijíma len známe kľúče, ho odmietne a kópia zostane na ostatných serveroch.
- Vaše vlastné údaje. Synchronizácia vašej poštovej schránky, štítkov, nastavení a konceptov sa tam, kde o to relé požiada, overuje ako účet, ktorému údaje patria, aj počas prepínania účtov. Vašim vlastným relé to neprezradí nič, čo by nevedeli: požiadavky aj tak uvádzajú váš kľúč. Vaše vlastné zoznamy relé a serverov Blossom sú verejné a vyžiadajú sa bez vašej identifikácie, rovnako ako relé uvedené v odkaze v e-maile.
- Stav prečítania a priečinky sú (zatiaľ) verejné metadáta. Označenie e-mailu ako prečítaného, s hviezdičkou, archivovaného alebo presunutého zverejní nešifrovanú udalosť štítka NIP-32 prepojenú s vaším verejným kľúčom, vrátane názvov vlastných priečinkov. Odosielateľ, ktorý pozná id e-mailu, ktorý vám poslal, dokáže zistiť, kedy ste s ním niečo urobili. Šifrovanie týchto štítkov je naplánované; dovtedy považujte názvy priečinkov za verejné.
- Push upozornenia a plánované odosielanie využívajú služby tretích strán.
Push server, ak si nejaký zvolíte (predvolene žiadny;
api.nmail.lisrelay.nmail.lina požiadanie), sa dozvie váš verejný kľúč, push token a kedy dostávate poštu; plánovací DVM sa dozvie váš verejný kľúč a už zašifrované správy, ktoré má zverejniť. Obe sú voliteľné a zdokumentované vPRIVACY.md. Text push upozornenia určuje push server a Herkos mu dôveruje len vtedy, keď ho UnifiedPush doručí šifrovaný (RFC 8291); nešifrovaný obsah len prebudí aplikáciu, aby si poštu stiahla sama. - Webová verzia uchováva váš kľúč v prehliadači, čo je preň najslabšie miesto. Nainštalované aplikácie odovzdávajú váš súkromný kľúč zabezpečenému úložisku operačného systému (Android Keystore, DPAPI vo Windows, libsecret, iOS/macOS Keychain). Prehliadač nič také nemá: kľúč leží v úložisku pôvodu (origin) a pri každom podpise prechádza cez JavaScript, na dosah akéhokoľvek kódu, ktorý na stránke beží — rozšírenia prehliadača s prístupom ku všetkým stránkam, chyby XSS v aplikácii alebo v závislosti, podvrhnutého nasadenia — a akéhokoľvek infostealera, ktorý skopíruje profil prehliadača. Neexistuje ani okamih, keď kód raz overíte: podpísaný binárny súbor sa kontroluje pri inštalácii, kým webová stránka pri každej návšteve dodá nový kód. Do webovej verzie sa prihláste vzdialeným podpisovačom (bunker NIP-46, Amber), aby sa kľúč do prehliadača nikdy nedostal, alebo ju berte ako jednorazovú identitu a svoj skutočný kľúč uchovávajte v nainštalovanej aplikácii.
- Pošta cez most je len taká dôveryhodná ako most. Herkos overuje, že
správa označená ako prichádzajúca cez most bola naozaj podpísaná mostom, ktorý
máte nastavený (alebo jedným z predvolených). Nedokáže overiť nič o
tradičnej adrese
From:, ktorú most preposiela. - Prílohy otvára operačný systém. Herkos nikdy nespúšťa spustiteľné súbory ani súbory skriptov a pred odovzdaním akejkoľvek inej prílohy bez náhľadu predvolenej systémovej aplikácii sa spýta, ale aplikácia, ktorá súbor otvorí, je mimo našej kontroly.
Herkos Local Relay: čo chráni a čo nie
Herkos Local Relay uchováva vo vašom zariadení udalosti vašich aplikácií, aj tie súkromné (koncepty, súkromné zoznamy, obálky, ktoré dostávate). Toto ich chráni a tu je hranica, platforma po platforme. Bezpečnostné chyby relé hláste rovnako ako všetky ostatné (vyššie).
Celá databáza je šifrovaná, vrátane jej žurnálu (SQLite3 Multiple Ciphers, AEGIS-256). Kľúčom je 32 náhodných bajtov vytvorených v zariadení a uložených v zabezpečenom úložisku systému: Keystore v Androide, DPAPI vo Windows, zväzok kľúčov (libsecret) v Linuxe. Nie je k nemu žiadne vaše heslo, pretože relé sa musí spustiť samo. Bez kľúča sa relé nespustí a povie to: nikdy neotvorí ani nevytvorí nešifrovanú databázu a nikdy nevymaže tú, ktorú nedokáže otvoriť.
| Ak… | Android | Windows | Linux |
|---|---|---|---|
| niekto skopíruje súbor databázy (záloha, synchronizovaný priečinok, obraz disku) | Chránené | Chránené | Chránené |
| vám ukradnú vypnuté zariadenie alebo disk | Chránené: kľúč je v Keystore | Chránené, pokiaľ nepoznajú heslo vášho prihlásenia do Windows: DPAPI ním chráni kľúč | Chránené, pokiaľ nepoznajú heslo vášho zväzku kľúčov (takmer vždy je to heslo vašej relácie) |
| iný používateľský účet v tom istom zariadení | Chránené | Chránené: DPAPI je pre každého používateľa zvlášť | Chránené: zväzok kľúčov je pre každého používateľa zvlášť |
| iná aplikácia alebo program bežiaci pod vaším používateľom | Chránené: Android oddeľuje každú aplikáciu a Keystore dá kľúč len relé | Nie: DPAPI šifruje pre používateľa, nie pre aplikáciu; program bežiaci ako vy si môže o kľúč požiadať rovnako ako relé | Nie: zväzok kľúčov vašej relácie neoddeľuje aplikácie od seba |
| telefón s rootom alebo nástroj, ktorý spúšťa kód ako aplikácia | Nie | — | — |
| niekto drží odomknuté zariadenie v ruke | Len PIN alebo odtlačok prsta relé, ak ste ich nastavili | Rovnako | Rovnako |
| niekto číta pamäť relé počas jeho behu | Nie | Nie | Nie |
Na počítači je hranica DPAPI a zväzku kľúčov rovnaká ako pri akomkoľvek programe: chránia pred inými používateľmi a pred tým, kto si odnesie disk, nie pred škodlivým programom, ktorý už beží pod vaším používateľom. Ak vás tento prípad znepokojuje, chráni vás šifrovanie systémového disku (BitLocker, LUKS) a to, že nespúšťate programy, ktorým nedôverujete. V Linuxe bez zväzku kľúčov (bez Secret Service) sa relé nespustí a vysvetlí prečo: kľúč nikdy neuchováva nešifrovaný.
Kto sa dostane dnu, priamo v zariadení. Relé počúva len na 127.0.0.1
a k tejto adrese sa dostane každá aplikácia v zariadení aj webová stránka
v prehliadači. Preto:
- Aplikácia sa musí spárovať: zobrazí sa na obrazovke relé a vy ju schválite (PIN-om alebo odtlačkom prsta, ak ste ich nastavili). Každá aplikácia si môže dať akýkoľvek názov: schváľte ju, len ak ste o to práve požiadali z tejto aplikácie.
- Webová stránka sa páruje vždy a spárovanie platí len odtiaľ, kde vzniklo: spárovanie aplikácie v zariadení neotvorí nič webovej stránke, ani keď podpisuje tým istým kľúčom.
- Spárovaná aplikácia číta a zapisuje len tie druhy udalostí, ktoré ste jej povolili, a maže len tie, ktoré smie zapisovať. Jej odvolanie ju okamžite odpojí.
- Nespárovaná aplikácia číta len vaše verejné udalosti (ktoré sú aj tak verejné) a nezapisuje nič, pokiaľ nezapnete nastavenie, ktoré púšťa dnu nespárované aplikácie v zariadení.
- Súkromné udalosti sa vydajú len tomu, kto cez NIP-42 preukáže, že má kľúč, ku ktorému patria, a obálka len jej adresátovi.
Čo tu nechráni:
- Škodlivá aplikácia v zariadení môže relé spomaliť alebo ho prinútiť míňať pamäť. Nič súkromné tým prečítať nemôže.
- Kým relé spí alebo nebeží, jeho port je voľný. V Androide sa uspí po 10 minútach bez pripojení; na počítači je port voľný, kým relé nespustíte. Iná aplikácia by tam mohla počúvať a vydávať sa zaň. Aplikácie Herkos budú pred odoslaním čohokoľvek súkromného overovať kľúč relé; zatiaľ to nerobia a dovtedy je to skutočná hranica.
- Na počítači sa iní používatelia počítača môžu pripojiť ako nespárovaná aplikácia: čítať vaše verejné udalosti a žiadať o spárovanie.
Lokálna sieť, ak ju zapnete (predvolene je vypnutá):
- Len
wss://, s vlastným certifikátom relé; mimo zariadenia nikdy nešifrovanéws://. - Nič pred overením (NIP-42) kľúčom z vášho zoznamu. Pripojenie, ktoré to neurobí do 30 sekúnd, sa zatvorí, a lokálna sieť má vlastný počet pripojení: nikdy neberie tie, ktoré patria aplikáciám v zariadení.
- Kľúč zo zoznamu číta vaše verejné udalosti a svoje vlastné súkromné a zapisuje len udalosti, ktoré sám podpísal. Jeho odobratie zo zoznamu ho odpojí.
- Certifikát platí len pre domáce názvy (
localhost,.local, súkromné adresy): aj keby niekto ukradol jeho kľúč, nepomohol by mu podpísať internetovú doménu v zariadeniach, ktoré ho nainštalovali.
Čo tu nechráni: ktokoľvek v tej istej sieti vidí, že zariadenie má otvorený port a koľko cezeň prechádza prevádzky, hoci nie čo; a ak má zariadenie verejnú adresu (bez smerovača medzi), tento port je viditeľný z internetu, hoci stále žiada kľúč z vášho zoznamu.
Zálohy. Šifrovaná záloha má heslo (scrypt a XChaCha20-Poly1305): bez neho ju nikto neotvorí, ani my. Export JSONL nie je šifrovaný a obsahuje vaše súkromné udalosti v čitateľnej podobe; aplikácia vás na to upozorní.
Zámok (PIN, plus odtlačok prsta alebo Windows Hello) sa vyžaduje pri otvorení aplikácie, po 30 sekundách mimo nej a na schválenie spárovania. Je to pohodlná bariéra, ako v Mail: nič nešifruje. V Androide s nastaveným PIN-om nie sú možné snímky obrazovky ani náhľad medzi nedávnymi aplikáciami a od Androidu 12 sa nad okno relé nemôže dostať okno žiadnej inej aplikácie, kým ho používate.
Herkos Drive: čo chráni a čo nie
Herkos Drive uchováva vaše súbory na serveroch Blossom a zoznam vašich súborov
a priečinkov na relé Nostr, oboje šifrované vo vašom zariadení. Toto je to, čo
ich chráni, a kde sú hranice. Všetky podrobnosti sú v spec-drive.md
a v modeli hrozieb amenazas-drive.md, v packages/herkos_drive_protocol/; čo
vidí každé relé a server, opisujú
zásady ochrany súkromia. Bezpečnostné
problémy Drive hláste rovnako ako všetky ostatné (vyššie).
Čo relé a servery urobiť nemôžu:
- Čítať vaše súbory ani ich názvy. Každý blok súboru je šifrovaný AES-256-GCM kľúčom vlastným pre jeho revíziu; názvy, priečinky, veľkosti, dátumy a kľúče sú zapečatené XChaCha20-Poly1305 kľúčom priečinka, v ktorom sú. Nič sa neodvodzuje z obsahu: ten istý súbor nahratý dvakrát dá rôzne bloky.
- Nepozorovane čokoľvek zmeniť, zameniť alebo presunúť. Každý blok sa kontroluje voči manifestu zapečatenému v zázname jeho súboru a každý záznam je podpísaný kľúčom zväzku a zapečatený pre svoje vlastné miesto (zväzok, identifikátor a priečinok): relé nemôže vydávať jeden záznam za iný ani jeden blok za iný.
- Vrátiť starú verziu. Aplikácia nikdy neprijme záznam starší, než aký už má pre ten istý identifikátor.
- Písať za vás len s kľúčom zväzku. Čo zapisujú vaše zariadenia, nesie značku vlastníka, HMAC s kľúčom, ktorý nedáva žiadny odkaz; záznam alebo zmazanie bez nej sa neprijme a aplikácia vás upozorní.
Čo nechráni:
- Vzorec vášho Drive. Relé môžu spočítať vaše súbory a priečinky, vidieť tvar stromu a kedy sa ktorý záznam mení; servery vidia približne, aký veľký je každý súbor (bloky sa dopĺňajú na 64 KiB, záznamy na mocninu dvoch). Každé relé a server vidí vašu IP adresu. Ak vám na tom záleží, použite Tor alebo Orbot na úrovni systému.
- Čo už niekto stiahol. Odstránenie odkazu alebo osoby dá tomu, čo mohla otvoriť, hneď nové kľúče, takže neotvorí, čo pridáte neskôr; nemôže však vziať späť, čo si už uložila.
- Uniknutý odkaz. Odkaz bez hesla je kľúč. Prehliadač si ho môže uložiť do histórie skôr, než ho stránka odstráni z panela s adresou. Pre čokoľvek citlivé dajte odkazu heslo, poslané inou cestou, alebo zdieľajte s účtom danej osoby. Slabé heslo sa dá časom prelomiť: kto má odkaz, môže skúšať offline.
- Stránka
herkos.app/f/beží v prehliadači toho, kto odkaz otvorí. Je poskytovaná s prísnou Content-Security-Policy, Subresource Integrity a bez kódu tretích strán, ale kto ovláda webhosting, mohol by poskytnúť inú stránku. To je hranica každej webovej stránky, ktorá dešifruje v prehliadači. - Kto mal kľúč zväzku (váš, alebo odovzdaný s odkazom na priečinok), môže ďalej mazať bloky, ktoré sa s ním nahrali, kým sa nenahrajú znova. Kľúč zväzku môžete zmeniť (Nastavenia → Kľúč zväzku): vaše ostatné zariadenia sa prispôsobia samy.
- Vaše zariadenie. Zoznam súborov je vo vyrovnávacej pamäti šifrovaný, s kľúčom v zabezpečenom úložisku systému; súbor, ktorý stiahnete alebo otvoríte, sa zapíše nešifrovaný tam, kam zvolíte. PIN v Drive je bariéra pre pohodlie, rovnako ako v Mail.
- Kvantový počítač, neskôr. Bloky a pečate sú symetrické (AES-256, XChaCha20), ale váš lokátor je šifrovaný NIP-44 na secp256k1: kto si ho dnes uloží a zajtra prelomí secp256k1, mohol by otvoriť celý Drive.
Ako sa to overuje. Dve interné revízie voči modelu hrozieb (2. novembra 2026) a ich opravy; testy toho, čo ukazuje každá udalosť a každý blok; fuzzing každého čítača toho, čo prichádza zvonku (udalosti, pečate, manifesty, odkazy, zálohy). Zatiaľ žiadny externý audit: jeden sa plánuje pred verejnou betou a jeho správa bude zverejnená celá. Drive je stále vo vývoji.
Podporované verzie
Bezpečnostné opravy sa aplikujú na najnovšiu vydanú verziu. Vzhľadom na veľkosť projektu sa staršie verzie neudržiavajú — pred nahlásením, prosím, aktualizujte.