Pre tímy IT bezpečnosti a recenzentov aplikácií

Zabezpečenie v Peeli

V skratke: obsah nástenky sa šifruje v prehliadači kľúčom, ktorý je vo fragmente odkazu, takže naše servery ukladajú a preposielajú zašifrované dáta, ktoré nedokážu prečítať. Nižšie je presne opísané ako a kde sú hranice.

Zhrnutie

  • Text kartičiek, mená, názvy násteniek, hlasy a nálepky sa šifrujú pomocou AES-256-GCM kľúčom nástenky vygenerovaným v prehliadači. Kľúč cestuje vo fragmente URL (#k=) a nikdy sa neposiela na server.
  • Akcie facilitátora, hlavička nástenky a snapshoty sú podpísané kľúčom facilitátora Ed25519. ID nástenky je z tohto kľúča odvodené, takže klienti podvrhnutie kľúča odhalia.
  • Skryté kartičky sú až do odhalenia zapečatené pre facilitátora (X25519 sealed box) a viazané osolenými commitmentmi, takže odhalený text nemožno vymeniť.
  • Predvolená je anonymita: operácie nenesú ID autora; hlasy a reakcie používajú náhodné ID platné len pre danú nástenku.
  • Účastníci sa nikdy neautentifikujú. Žiadne analytické SDK, žiadne reklamy, žiadne skripty tretích strán okrem Paddle.js na stránke pokladne.
  • Len Cloudflare. Nenárokované nástenky sa mažú 60 dní po poslednej návšteve.

Ako tečú dáta

Fragment URL (všetko za #) spracúva prehliadač a nie je súčasťou HTTP požiadavky. Peel doň ukladá kľúč nástenky.

Tok dát: kľúč sa číta lokálne z odkazu; sieťou putujú len zašifrované dáta a minimum metadát.

Model hrozieb

Navrhujeme tak, aby sa úplne kompromitovaný alebo zvedavý server, vrátane nás, dozvedel o tom, čo tím hovorí, čo najmenej.

Čo chránime

  • Text kartičiek, výber GIF-ov a v režime s menami aj meno autora.
  • Mená a avatary účastníkov, názov nástenky a názvy vlastných šablón.
  • Kto hlasoval alebo reagoval na čo a kto napísal ktorú kartičku.
  • Integritu retra: kroky, odhalenia a rozhodnutia facilitátora nemožno sfalšovať.

S akými útočníkmi počítame

  • Naše vlastné servery, zlomyseľný insider alebo ktokoľvek, kto prenikne do nášho úložiska: získa zašifrované dáta a metadáta.
  • Útočník v sieti: TLS všade; kľúč nikdy neprechádza sieťou.
  • Server, ktorý podvrhne kľúče: ID nástenky je odvodené z verejného kľúča facilitátora a klienti overujú podpísanú hlavičku.
  • Účastník, ktorý chce nakúkať alebo falšovať: skryté kartičky sú zapečatené pre facilitátora; operácie facilitátora vyžadujú jeho podpis; úpravy kartičky vyžadujú kľúč kartičky.
  • Facilitátor, ktorý znova publikuje za autora offline: commitmenty mu bránia text zmeniť.

Mimo rozsahu, úprimne

  • Ktokoľvek s odkazom pre účastníkov môže nástenku čítať. Riadením prístupu je samotný odkaz. Zdieľajte ho rovnako opatrne ako samotnú nástenku.
  • Kompromitované zariadenie, škodlivé rozšírenie prehliadača alebo niekto, kto vám pozerá cez plece.
  • Analýza prevádzky: server vidí časovanie, veľkosti a počty (pozri mapu dát).
  • Odopretie služby zo strany servera: môže správy zahodiť alebo zdržať, ale nie ich prečítať či sfalšovať.

Kryptografia

Všetky primitíva pochádzajú z WebCrypto API prehliadača. Žiadna vlastná kryptografia, žiadne kryptografické knižnice tretích strán.

KľúčAlgoritmusPoužitie
K_boardAES-256-GCM, 96-bitový náhodný IVŠifruje každú operáciu, snapshot a aktualizáciu prítomnosti. Doplnkové dáta viažu ID nástenky, typ operácie a ID operácie, takže zašifrované dáta nemožno prehrať do inej nástenky ani pozície. Existuje len vo fragmente odkazu #k=.
K_ownerEd25519Autorita facilitátora. Podpisuje operácie facilitátora (krok, časovač, reflektor, šablóna, nastavenia, odkrytie hlasov, skrytie kartičky), hlavičku nástenky a snapshoty. Prísne rastúce počítadlo bráni opakovanému prehratiu. Len v odkaze facilitátora (&o=).
ID nástenkySHA-256, prvých 80 bitov, base32Odvodené z verejného kľúča facilitátora, takže samotné ID dokazuje, ktorému kľúču nástenka patrí. Klienti odmietnu hlavičku, ktorej kľúč sa nezahešuje na toto ID.
K_facX25519 sealed box: efemérny X25519 + HKDF-SHA256 + AES-256-GCMSkryté kartičky sa počas písania zapečatia pre verejný kľúč facilitátora. Otvoriť ich dokáže len odkaz facilitátora (&f=).
Kľúče kartičiekEd25519, jeden kľúč na kartičkuDrží ho len autor. Úpravy a odhalenie sú ním podpísané: pravosť bez identity.
CommitmentyHMAC-SHA256 so 128-bitovou náhodnou soľouSkrytá kartička zverejní commitment k svojmu obsahu. Pri odhalení sa zverejní obsah aj soľ a každý klient ich overí, takže text nikto nevymení.
PrítomnosťAES-256-GCM pod K_boardMená, avatary a indikátory písania sa šifrujú rovnako ako všetko ostatné.
Balík kľúčovHKDF-SHA256 z PRF prístupového kľúča alebo z kódu na obnovenie, AES-256-GCMPrihlásení facilitátori môžu synchronizovať kľúče k nástenkám medzi zariadeniami. Balík sa šifruje na zariadení; server ukladá len zašifrované dáta a zabalené kľúče.

Podpisované správy sú doménovo oddelené (napríklad peel/sig/v1, peel/header/v1, peel/snap/v1), takže podpis na jeden účel nemožno použiť na iný.

Skryté kartičky a odhalenie

  1. Počas písania prehliadač autora zapečatí kartičku pre kľúč X25519 facilitátora a zverejní osolený commitment. Otvorený text zostáva na zariadení autora.
  2. Ostatní účastníci vidia skrytú kartičku: nedokážu ju dešifrovať, a server tiež nie.
  3. Prehliadač facilitátora dokáže zapečatené kartičky otvoriť (náhľad „👁 len ty“).
  4. Pri odhalení každý autor znova zverejní kartičku zašifrovanú pomocou K_board, podpísanú kľúčom kartičky, spolu so soľou.
  5. Ak je autor offline, facilitátor ju zverejní zaňho. Každý klient overuje commitment, takže text musí zodpovedať tomu, čo autor napísal.

Keďže facilitátor technicky môže nahliadnuť, každá nástenka počas skrytia kartičiek ukazuje všetkým štítok „facilitátor môže nahliadnuť“. Nejde o nastavenie, ktoré by sa dalo vypnúť.

Anonymita

  • Operácie nenesú ID autora. Server nedokáže spojiť kartičku s osobou a predvolene to nedokáže ani facilitátor.
  • Hlasy a reakcie sú viazané na náhodné ID platné pre jednu nástenku, ktoré nie je spojené s menom.
  • Indikátory písania ukazujú, že niekto píše, nikdy čo.
  • Režim s menami je výslovné nastavenie nástenky; meno autora potom cestuje vnútri zašifrovanej kartičky.
  • Účastníci sa nikdy neprihlasujú, takže neexistuje účet, s ktorým by sa dalo čokoľvek prepojiť.

Mapa dát

Všetko, čo uchovávame, kde to je, kto to môže čítať a ako dlho to zostáva.

DátaKdeKto ich môže čítaťAko dlho
Kartičky, hlasy, reakcie, nálepky, akčné kroky, názov nástenky, názvy vlastných šablónÚložisko Durable Object, zašifrovanéĽudia s odkazom na nástenkuDo vymazania nástenky
Obálka operácie: typ, sekvencia a čas na serveri, veľkosť, počítadlo facilitátoraÚložisko Durable ObjectPeelDo vymazania nástenky
Mená účastníkov, avatary, písaniePreposielané zašifrované; v pamäti počas pripojeniaĽudia s odkazom na nástenkuPočas pripojenia
Stav nástenky: krok, počet účastníkov a kartičiek, ID šablóny z katalógu, príznak zamknutia, čas vytvorenia a vypršaniaDurable Object, D1; správy v Slacku/Teams, ak sú nainštalovanéPeel; váš kanál v Slacku/TeamsPočas životnosti nástenky
Účet facilitátora: ID u poskytovateľa, meno, e-mail (ak je zdieľaný), prepojení poskytovatelia, dátum vytvorenia, reláciaD1PeelDo vymazania účtu
Balík kľúčov a zabalené kľúčeD1, zašifrovanéLen vy (prístupový kľúč alebo kód na obnovenie)Do vymazania účtu
Plán, stav predplatného, ID zákazníka a predplatného v PaddleD1; PaddlePeel, PaddlePodľa požiadaviek daňových predpisov
ID pracovného priestoru, kanála a správ v Slacku/Teams; token bota (šifrovaný AES-GCM)D1PeelDo odinštalovania
IP adresaEdge Cloudflare, prechodne (doručenie, limity požiadaviek)Cloudflare, obmedzovač požiadaviek PeeluNeukladá sa v našich databázach
Denné počítadlá (vytvorené nástenky, dosiahnuté kroky)D1PeelLen agregovane, bez identifikátorov

Čo náš server môže a čo nie

Môže

  • Vidieť typy operácií, veľkosti, časovanie, krok, počet účastníkov a kartičiek, ID šablóny z katalógu a príznak zamknutia.
  • Zahodiť, zdržať alebo odmietnuť doručiť operácie (odopretie služby).
  • Vidieť IP adresy na okraji siete.
  • Agregovane počítať nástenky a dosiahnuté kroky.
  • Vymazať nástenku (vypršanie, nahlásenie zneužitia).

Nemôže

  • Čítať text kartičiek, mená, názvy násteniek, názvy vlastných šablón, hlasy ani nálepky.
  • Čítať skryté kartičky pred odhalením (a ani po ňom).
  • Falšovať akcie facilitátora: vyžadujú jeho podpis.
  • Podstrčiť vlastné kľúče: prezradí ho ID nástenky.
  • Zmeniť odhalený text kartičky: prezradia ho commitmenty a podpisy kartičiek.
  • Zistiť, kto napísal ktorú kartičku.

Ako pri každej webovej aplikácii dôverujete kódu, ktorý servírujeme. Túto plochu držíme malú: prísna Content Security Policy, script-src obmedzený na náš vlastný pôvod, žiadne skripty tretích strán a protokol je na požiadanie k dispozícii na revíziu.

Slack a Microsoft Teams

  • Správy nesú odkaz na nástenku a metadáta (názov, krok, počty). Text kartičiek sa posiela len vtedy, keď facilitátor pošle zhrnutie a potvrdí to.
  • Karta s pozvánkou obsahuje odkaz pre účastníkov vrátane kľúča. Ktokoľvek, kto môže čítať daný kanál, sa môže pripojiť, rovnako ako pri vložení odkazu.
  • Náhľady odkazov ukazujú len krok a počty, nikdy obsah.
  • Oprávnenia v Slacku: commands, chat:write, links:read, links:write; users:read len vtedy, keď tím zapne zmienky.
  • Tokeny botov sú v pokoji zašifrované (AES-GCM, kľúč uložený ako tajomstvo Workera). Podpisy požiadaviek Slacku a tokeny Bot Frameworku sa overujú pri každej požiadavke.
  • Odinštalovaním aplikácie sa zastaví všetko odosielanie a vymažú sa jej tokeny.

Web a infraštruktúra

  • Len Cloudflare: Pages, Workers, Durable Objects, D1, R2 a KV na účte 1801 Labs. Žiadne iné servery.
  • TLS všade, HSTS a prísna Content Security Policy.
  • Žiadne analytické SDK, žiadne reklamy, žiadne skripty tretích strán. Jedinou výnimkou je Paddle.js, načítaný len na stránke pokladne.
  • Jeden cookie, len pre prihlásených facilitátorov: peel_session, httpOnly, Secure, SameSite=Lax.
  • Hľadanie GIF-ov a médiá idú cez naše API, takže IP adresy účastníkov sa ku GIPHY nikdy nedostanú.
  • Fonty a súbory hostujeme sami. Žiadne fonty z CDN, žiadne sledovacie pixely.
  • Limity požiadaviek na IP adresu a na nástenku; hlásenia zneužitia a zamknutie facilitátorom.

Účty a uchovávanie dát

  • Účastníci sa nikdy neautentifikujú. Facilitátori sa prihlasujú cez Google (alebo Entra ID cez Teams) len kvôli uchovaniu násteniek alebo plateným funkciám.
  • Účet uchováva ID, meno a e-mail od poskytovateľa a zašifrovaný balík kľúčov odomykaný prístupovým kľúčom (WebAuthn PRF) alebo kódom na obnovenie. Prihlásenie dáva vlastníctvo, nie prístup k obsahu.
  • Nárokovanie nástenky preukazuje vlastníctvo podpisom facilitátora. Kľúče k nástenkám sa nikdy neposielajú.
  • Nástenky bez účtu sa mažú 60 dní po poslednej návšteve; každá návšteva lehotu vynuluje. Úložisko mažú alarmy Durable Objects.
  • Vymazaním účtu sa vymažú relácie, balík kľúčov a vaša knižnica a nástenky opäť dostanú 60-dňovú lehotu.

Zodpovedné zverejňovanie

Niečo ste našli? Dajte nám vedieť ako prvým a budeme s vami spolupracovať. Prijatie hlásenia potvrdíme do troch pracovných dní.

[email protected]

  • Dajte nám, prosím, primeraný čas na opravu (snažíme sa o 90 dní), než problém zverejníte.
  • Testujte na vlastných nástenkách a účtoch. Nepristupujte k dátam iných ľudí a nezhoršujte prevádzku služby.
  • Proti výskumu v dobrej viere, ktorý dodržiava tieto pravidlá, nepodnikneme právne kroky.
  • Strojovo čitateľný kontakt: /.well-known/security.txt.

Zákazníci s plánom Firma dostanú balík pre bezpečnostný audit (odpovede na dotazníky, subdodávatelia spracúvajúci dáta, toky dát). DPA · Ochrana súkromia