Pro týmy bezpečnosti IT a recenzenty aplikací

Zabezpečení v Peelu

Ve zkratce: obsah nástěnky se šifruje v prohlížeči klíčem, který je ve fragmentu odkazu, takže naše servery ukládají a přeposílají šifrovaná data, která nedokážou přečíst. Níže je přesně popsáno jak a kde jsou hranice.

Shrnutí

  • Text kartiček, jména, názvy nástěnek, hlasy a nálepky se šifrují pomocí AES-256-GCM klíčem nástěnky vygenerovaným v prohlížeči. Klíč cestuje ve fragmentu URL (#k=) a nikdy se neposílá na server.
  • Akce facilitátora, hlavička nástěnky a snapshoty jsou podepsané klíčem facilitátora Ed25519. ID nástěnky je z tohoto klíče odvozené, takže klienti podvržení klíče odhalí.
  • Skryté kartičky jsou až do odhalení zapečetěné pro facilitátora (X25519 sealed box) a svázané osolenými commitmenty, takže odhalený text nelze vyměnit.
  • Výchozí je anonymita: operace nenesou ID autora; hlasy a reakce používají náhodné ID platné jen pro danou nástěnku.
  • Účastníci se nikdy neautentizují. Žádná analytická SDK, žádné reklamy, žádné skripty třetích stran kromě Paddle.js na stránce pokladny.
  • Jen Cloudflare. Nenárokované nástěnky se mažou 60 dní po poslední návštěvě.

Jak tečou data

Fragment URL (vše za #) zpracovává prohlížeč a není součástí HTTP požadavku. Peel do něj ukládá klíč nástěnky.

Tok dat: klíč se čte lokálně z odkazu; sítí putují jen šifrovaná data a minimum metadat.

Model hrozeb

Navrhujeme tak, aby se plně kompromitovaný nebo zvědavý server, včetně nás, dozvěděl o tom, co tým říká, co nejméně.

Co chráníme

  • Text kartiček, výběr GIFů a v režimu se jmény i jméno autora.
  • Jména a avatary účastníků, název nástěnky a názvy vlastních šablon.
  • Kdo hlasoval nebo reagoval na co a kdo napsal kterou kartičku.
  • Integritu retra: kroky, odhalení a rozhodnutí facilitátora nelze zfalšovat.

S jakými útočníky počítáme

  • Naše vlastní servery, zlovolný insider nebo kdokoli, kdo pronikne do našeho úložiště: získá šifrovaná data a metadata.
  • Útočník v síti: TLS všude; klíč nikdy neprochází sítí.
  • Server, který podvrhne klíče: ID nástěnky je odvozené z veřejného klíče facilitátora a klienti ověřují podepsanou hlavičku.
  • Účastník, který chce nakukovat nebo falšovat: skryté kartičky jsou zapečetěné pro facilitátora; operace facilitátora vyžadují jeho podpis; úpravy kartičky vyžadují klíč kartičky.
  • Facilitátor, který znovu publikuje za autora offline: commitmenty mu brání text změnit.

Mimo rozsah, upřímně

  • Kdokoli s odkazem pro účastníky může nástěnku číst. Řízením přístupu je samotný odkaz. Sdílejte ho stejně opatrně jako nástěnku samotnou.
  • Kompromitované zařízení, škodlivé rozšíření prohlížeče nebo někdo, kdo vám kouká přes rameno.
  • Analýza provozu: server vidí časování, velikosti a počty (viz mapa dat).
  • Odepření služby ze strany serveru: může zprávy zahodit nebo zdržet, ale ne je přečíst nebo zfalšovat.

Kryptografie

Všechna primitiva pocházejí z WebCrypto API prohlížeče. Žádná vlastní kryptografie, žádné kryptografické knihovny třetích stran.

KlíčAlgoritmusPoužití
K_boardAES-256-GCM, 96bitový náhodný IVŠifruje každou operaci, snapshot a aktualizaci přítomnosti. Doplňková data vážou ID nástěnky, typ operace a ID operace, takže šifrovaná data nelze přehrát do jiné nástěnky ani pozice. Existuje jen ve fragmentu odkazu #k=.
K_ownerEd25519Autorita facilitátora. Podepisuje operace facilitátora (krok, časovač, reflektor, šablona, nastavení, odkrytí hlasů, skrytí kartičky), hlavičku nástěnky a snapshoty. Přísně rostoucí čítač brání opakovanému přehrání. Jen v odkazu facilitátora (&o=).
ID nástěnkySHA-256, prvních 80 bitů, base32Odvozené z veřejného klíče facilitátora, takže samo ID dokazuje, kterému klíči nástěnka patří. Klienti odmítnou hlavičku, jejíž klíč se nezahashuje na toto ID.
K_facX25519 sealed box: efemérní X25519 + HKDF-SHA256 + AES-256-GCMSkryté kartičky se během psaní zapečetí pro veřejný klíč facilitátora. Otevřít je dokáže jen odkaz facilitátora (&f=).
Klíče kartičekEd25519, jeden klíč na kartičkuDrží ho jen autor. Úpravy a odhalení jsou jím podepsané: pravost bez identity.
CommitmentyHMAC-SHA256 se 128bitovou náhodnou solíSkrytá kartička zveřejní commitment ke svému obsahu. Při odhalení se zveřejní obsah i sůl a každý klient je ověří, takže text nikdo nevymění.
PřítomnostAES-256-GCM pod K_boardJména, avatary a indikátory psaní se šifrují stejně jako všechno ostatní.
Balíček klíčůHKDF-SHA256 z PRF přístupového klíče nebo z kódu pro obnovení, AES-256-GCMPřihlášení facilitátoři mohou synchronizovat klíče k nástěnkám mezi zařízeními. Balíček se šifruje na zařízení; server ukládá jen šifrovaná data a zabalené klíče.

Podepisované zprávy jsou doménově oddělené (například peel/sig/v1, peel/header/v1, peel/snap/v1), takže podpis pro jeden účel nelze použít pro jiný.

Skryté kartičky a odhalení

  1. Během psaní prohlížeč autora zapečetí kartičku pro klíč X25519 facilitátora a zveřejní osolený commitment. Otevřený text zůstává na zařízení autora.
  2. Ostatní účastníci vidí skrytou kartičku: nedokážou ji dešifrovat, a server také ne.
  3. Prohlížeč facilitátora dokáže zapečetěné kartičky otevřít (náhled „👁 jen ty“).
  4. Při odhalení každý autor znovu zveřejní kartičku zašifrovanou pomocí K_board, podepsanou klíčem kartičky, spolu se solí.
  5. Pokud je autor offline, facilitátor ji zveřejní za něj. Každý klient ověřuje commitment, takže text musí odpovídat tomu, co autor napsal.

Protože facilitátor technicky může nahlížet, každá nástěnka po dobu skrytí kartiček ukazuje všem štítek „facilitátor může nahlížet“. Nejde o nastavení, které by šlo vypnout.

Anonymita

  • Operace nenesou ID autora. Server nedokáže spojit kartičku s osobou a ve výchozím stavu to nedokáže ani facilitátor.
  • Hlasy a reakce jsou vázané na náhodné ID platné pro jednu nástěnku, které není spojené se jménem.
  • Indikátory psaní ukazují, že někdo píše, nikdy co.
  • Režim se jmény je výslovné nastavení nástěnky; jméno autora pak cestuje uvnitř šifrované kartičky.
  • Účastníci se nikdy nepřihlašují, takže neexistuje účet, se kterým by šlo cokoli propojit.

Mapa dat

Vše, co uchováváme, kde to je, kdo to může číst a jak dlouho to zůstává.

DataKdeKdo je může čístJak dlouho
Kartičky, hlasy, reakce, nálepky, akční kroky, název nástěnky, názvy vlastních šablonÚložiště Durable Object, šifrovaněLidé s odkazem na nástěnkuDo smazání nástěnky
Obálka operace: typ, sekvence a čas na serveru, velikost, čítač facilitátoraÚložiště Durable ObjectPeelDo smazání nástěnky
Jména účastníků, avatary, psaníPřeposíláno šifrovaně; v paměti po dobu připojeníLidé s odkazem na nástěnkuPo dobu připojení
Stav nástěnky: krok, počet účastníků a kartiček, ID šablony z katalogu, příznak zamčení, čas vytvoření a vypršeníDurable Object, D1; zprávy ve Slacku/Teams, pokud jsou nainstalovanéPeel; váš kanál ve Slacku/TeamsPo dobu života nástěnky
Účet facilitátora: ID u poskytovatele, jméno, e-mail (pokud je sdílený), propojení poskytovatelé, datum vytvoření, relaceD1PeelDo smazání účtu
Balíček klíčů a zabalené klíčeD1, šifrovaněJen vy (přístupový klíč nebo kód pro obnovení)Do smazání účtu
Plán, stav předplatného, ID zákazníka a předplatného v PaddleD1; PaddlePeel, PaddlePodle požadavků daňových předpisů
ID pracovního prostoru, kanálu a zpráv ve Slacku/Teams; token bota (šifrovaný AES-GCM)D1PeelDo odinstalování
IP adresaEdge Cloudflare, přechodně (doručení, limity požadavků)Cloudflare, omezovač požadavků PeeluNeukládá se v našich databázích
Denní počítadla (vytvořené nástěnky, dosažené kroky)D1PeelJen agregovaně, bez identifikátorů

Co náš server může a co ne

Může

  • Vidět typy operací, velikosti, časování, krok, počet účastníků a kartiček, ID šablony z katalogu a příznak zamčení.
  • Zahodit, zdržet nebo odmítnout doručit operace (odepření služby).
  • Vidět IP adresy na okraji sítě.
  • Agregovaně počítat nástěnky a dosažené kroky.
  • Smazat nástěnku (vypršení, nahlášení zneužití).

Nemůže

  • Číst text kartiček, jména, názvy nástěnek, názvy vlastních šablon, hlasy ani nálepky.
  • Číst skryté kartičky před odhalením (a ani po něm).
  • Falšovat akce facilitátora: vyžadují jeho podpis.
  • Podstrčit vlastní klíče: prozradí ho ID nástěnky.
  • Změnit odhalený text kartičky: prozradí ho commitmenty a podpisy kartiček.
  • Zjistit, kdo napsal kterou kartičku.

Jako u každé webové aplikace důvěřujete kódu, který servírujeme. Tuto plochu držíme malou: přísná Content Security Policy, script-src omezený na náš vlastní původ, žádné skripty třetích stran a protokol je na vyžádání k dispozici k revizi.

Slack a Microsoft Teams

  • Zprávy nesou odkaz na nástěnku a metadata (název, krok, počty). Text kartiček se posílá jen tehdy, když facilitátor pošle shrnutí a potvrdí to.
  • Karta s pozvánkou obsahuje odkaz pro účastníky včetně klíče. Kdokoli, kdo může číst daný kanál, se může připojit, stejně jako při vložení odkazu.
  • Náhledy odkazů ukazují jen krok a počty, nikdy obsah.
  • Oprávnění ve Slacku: commands, chat:write, links:read, links:write; users:read jen tehdy, když tým zapne zmínky.
  • Tokeny botů jsou v klidu šifrované (AES-GCM, klíč uložený jako tajemství Workeru). Podpisy požadavků Slacku a tokeny Bot Frameworku se ověřují u každého požadavku.
  • Odinstalováním aplikace se zastaví veškeré odesílání a smažou se její tokeny.

Web a infrastruktura

  • Jen Cloudflare: Pages, Workers, Durable Objects, D1, R2 a KV na účtu 1801 Labs. Žádné jiné servery.
  • TLS všude, HSTS a přísná Content Security Policy.
  • Žádná analytická SDK, žádné reklamy, žádné skripty třetích stran. Jedinou výjimkou je Paddle.js, načítaný jen na stránce pokladny.
  • Jedna cookie, jen pro přihlášené facilitátory: peel_session, httpOnly, Secure, SameSite=Lax.
  • Hledání GIFů a média jdou přes naše API, takže IP adresy účastníků se ke GIPHY nikdy nedostanou.
  • Fonty a soubory hostujeme sami. Žádné fonty z CDN, žádné sledovací pixely.
  • Limity požadavků na IP adresu a na nástěnku; hlášení zneužití a zamčení facilitátorem.

Účty a uchovávání dat

  • Účastníci se nikdy neautentizují. Facilitátoři se přihlašují přes Google (nebo Entra ID přes Teams) jen kvůli uchování nástěnek nebo placeným funkcím.
  • Účet uchovává ID, jméno a e-mail od poskytovatele a šifrovaný balíček klíčů odemykaný přístupovým klíčem (WebAuthn PRF) nebo kódem pro obnovení. Přihlášení dává vlastnictví, ne přístup k obsahu.
  • Nárokování nástěnky prokazuje vlastnictví podpisem facilitátora. Klíče k nástěnkám se nikdy neposílají.
  • Nástěnky bez účtu se mažou 60 dní po poslední návštěvě; každá návštěva lhůtu vynuluje. Úložiště mažou alarmy Durable Objects.
  • Smazáním účtu se smažou relace, balíček klíčů a vaše knihovna a nástěnky opět dostanou 60denní lhůtu.

Odpovědné zveřejňování

Něco jste našli? Dejte nám vědět jako prvním a budeme s vámi spolupracovat. Přijetí hlášení potvrdíme do tří pracovních dnů.

[email protected]

  • Dejte nám prosím přiměřený čas na opravu (snažíme se o 90 dní), než problém zveřejníte.
  • Testujte na vlastních nástěnkách a účtech. Nepřistupujte k datům jiných lidí a nezhoršujte provoz služby.
  • Proti výzkumu v dobré víře, který dodržuje tato pravidla, nebudeme podnikat právní kroky.
  • Strojově čitelný kontakt: /.well-known/security.txt.

Zákazníci s plánem Firma dostanou balíček pro bezpečnostní audit (odpovědi na dotazníky, subzpracovatelé, toky dat). DPA · Ochrana soukromí