Za ekipe za informacijsko varnost in pregledovalce aplikacij
Varnost pri Peelu
Na kratko: vsebina table se šifrira v brskalniku s ključem, ki živi v fragmentu povezave, zato naši strežniki shranjujejo in posredujejo šifrirano besedilo, ki ga ne morejo prebrati. Spodaj je natančno opisano, kako, in kje so meje.
Povzetek
- Besedilo kartic, imena, naslovi tabel, glasovi in nalepke so šifrirani z AES-256-GCM s ključem table, ustvarjenim v brskalniku. Ključ potuje v fragmentu URL-ja (
#k=) in se nikoli ne pošlje strežniku. - Dejanja facilitatorja, glava table in posnetki stanja so podpisani s facilitatorjevim ključem Ed25519. ID table je izpeljan iz tega ključa, zato odjemalci zaznajo zamenjavo ključa.
- Skrite kartice so do razkritja zapečatene za facilitatorja (X25519 sealed box) in vezane s soljenimi zavezami (commitments), zato razkritega besedila ni mogoče zamenjati.
- Privzeto anonimno: operacije ne nosijo ID-ja avtorja; glasovi in odzivi uporabljajo naključni ID, ki velja samo za posamezno tablo.
- Udeleženci se nikoli ne overjajo. Brez analitičnih SDK-jev, brez oglasov, brez skript tretjih oseb, razen Paddle.js na strani za plačilo.
- Samo Cloudflare. Neprevzete table se izbrišejo 60 dni po zadnjem obisku.
Kako tečejo podatki
Fragment URL-ja (vse za #) obdela brskalnik in ni del zahteve HTTP. Peel tja shrani ključ table.
Model groženj
Sistem je zasnovan tako, da popolnoma kompromitiran ali radoveden strežnik, vključno z nami, izve čim manj o tem, kaj ekipa govori.
Kaj ščitimo
- Besedilo kartic, izbrane GIF-e in v načinu z imeni ime avtorja.
- Imena in avatarje udeležencev, ime table in naslove predlog po meri.
- Kdo je glasoval ali se odzval na kaj in kdo je napisal katero kartico.
- Celovitost retra: korakov, razkritij in odločitev facilitatorja ni mogoče ponarediti.
Napadalci, ki jih upoštevamo
- Naši lastni strežniki, zlonamerni notranji sodelavec ali nekdo, ki vdre v našo hrambo: dobijo šifrirano besedilo in metapodatke.
- Omrežni napadalec: TLS povsod; ključ nikoli ne potuje po omrežju.
- Strežnik, ki zamenja ključe: ID table je izpeljan iz facilitatorjevega javnega ključa, odjemalci pa preverijo podpisano glavo.
- Udeleženec, ki bi rad kukal ali ponarejal: skrite kartice so zapečatene za facilitatorja; operacije facilitatorja zahtevajo njegov podpis; urejanje kartice zahteva ključ kartice.
- Facilitator, ki kartico ponovno objavi namesto avtorja brez povezave: zaveze mu preprečijo spremembo besedila.
Zunaj obsega, iskreno
- Kdor ima povezavo za udeležence, lahko bere tablo. Povezava je nadzor dostopa. Z njo je treba ravnati tako kot s samo tablo.
- Kompromitirana naprava, zlonamerna razširitev brskalnika ali nekdo, ki gleda čez ramo.
- Analiza prometa: strežnik vidi časovni potek, velikosti in števila (glejte zemljevid podatkov).
- Zavrnitev storitve s strani strežnika: sporočila lahko zavrže ali zakasni, ne more pa jih prebrati ali ponarediti.
Kriptografija
Vsi primitivi prihajajo iz brskalnikovega API-ja WebCrypto. Brez lastne kriptografije, brez kriptografskih knjižnic tretjih oseb.
| Ključ | Algoritem | Uporaba |
|---|---|---|
| K_board | AES-256-GCM, 96-bitni naključni IV | Šifrira vsako operacijo, posnetek stanja in posodobitev prisotnosti. Dodatni podatki vežejo ID table, vrsto operacije in ID operacije, zato šifriranega besedila ni mogoče ponovno predvajati v drugi tabli ali na drugem mestu. Živi samo v fragmentu povezave #k=. |
| K_owner | Ed25519 | Pooblastila facilitatorja. Podpisuje operacije facilitatorja (korak, časovnik, žaromet, predloga, nastavitve, odpiranje glasov, skrivanje kartice), glavo table in posnetke stanja. Strogo naraščajoči števec preprečuje ponovno predvajanje. Samo v povezavi facilitatorja (&o=). |
| ID table | SHA-256, prvih 80 bitov, base32 | Izpeljan iz facilitatorjevega javnega ključa, zato že sam ID dokazuje, kateri ključ je lastnik table. Odjemalci zavrnejo glavo, katere ključ se ne zgosti v ta ID. |
| K_fac | X25519 sealed box: efemerni X25519 + HKDF-SHA256 + AES-256-GCM | Skrite kartice so med pisanjem zapečatene za facilitatorjev javni ključ. Odpre jih lahko samo povezava facilitatorja (&f=). |
| Ključi kartic | Ed25519, en ključ na kartico | Ima ga samo avtor. Z njim so podpisana urejanja in razkritje: pristnost brez identitete. |
| Zaveze | HMAC-SHA256 s 128-bitno naključno soljo | Skrita kartica objavi zavezo svoji vsebini. Ob razkritju se objavita vsebina in sol, vsak odjemalec pa ju preveri, zato nihče ne more zamenjati besedila. |
| Prisotnost | AES-256-GCM s K_board | Imena, avatarji in indikatorji tipkanja so šifrirani kot vse drugo. |
| Zbirka ključev | HKDF-SHA256 iz PRF ključa za dostop ali obnovitvene kode, AES-256-GCM | Prijavljeni facilitatorji lahko ključe tabel sinhronizirajo med napravami. Zbirka je šifrirana na napravi; strežnik hrani samo šifrirano besedilo in ovite ključe. |
Podpisana sporočila so domensko ločena (na primer peel/sig/v1, peel/header/v1, peel/snap/v1), zato podpisa za en namen ni mogoče znova uporabiti za drugega.
Anonimnost
- Operacije ne nosijo ID-ja avtorja. Strežnik ne more povezati kartice z osebo, privzeto pa tudi facilitator ne.
- Glasovi in odzivi so vezani na naključni ID, ki velja za posamezno tablo in ni povezan z imenom.
- Indikatorji tipkanja pokažejo, da nekdo piše, nikoli pa kaj.
- Način z imeni je izrecna nastavitev table; ime avtorja takrat potuje znotraj šifrirane kartice.
- Udeleženci se nikoli ne prijavijo, zato ni računa, ki bi ga bilo mogoče povezati z njimi.
Zemljevid podatkov
Vse, kar hranimo, kje je shranjeno, kdo lahko to bere in kako dolgo ostane.
| Podatki | Kje | Kdo lahko bere | Hramba |
|---|---|---|---|
| Kartice, glasovi, odzivi, nalepke, ukrepi, ime table, naslovi predlog po meri | Hramba Durable Object, kot šifrirano besedilo | Osebe s povezavo do table | Dokler tabla ni izbrisana |
| Ovojnica operacije: vrsta, strežniško zaporedje in čas, velikost, števec facilitatorja | Hramba Durable Object | Peel | Dokler tabla ni izbrisana |
| Imena udeležencev, avatarji, tipkanje | Posredovano kot šifrirano besedilo; v pomnilniku, dokler je povezava vzpostavljena | Osebe s povezavo do table | Med povezavo |
| Stanje table: korak, število udeležencev in kartic, ID predloge iz kataloga, oznaka zaklepa, čas nastanka in poteka | Durable Object, D1; sporočila v Slacku/Teams, če je aplikacija nameščena | Peel; vaš kanal v Slacku/Teams | Življenjska doba table |
| Račun facilitatorja: ID ponudnika, ime, e-pošta (če je deljena), povezani ponudniki, datum nastanka, seja | D1 | Peel | Dokler račun ni izbrisan |
| Zbirka ključev in oviti ključi | D1, kot šifrirano besedilo | Samo vi (ključ za dostop ali obnovitvena koda) | Dokler račun ni izbrisan |
| Paket, stanje naročnine, ID stranke in ID naročnine pri Paddlu | D1; Paddle | Peel, Paddle | Kot zahteva davčna zakonodaja |
| ID-ji delovnega prostora, kanala in sporočil v Slacku/Teams; žeton bota (šifriran z AES-GCM) | D1 | Peel | Do odstranitve aplikacije |
| Naslov IP | Robno omrežje Cloudflare, prehodno (dostava, omejitve hitrosti) | Cloudflare, Peelov omejevalnik hitrosti | Ni shranjen v naših bazah podatkov |
| Dnevni števci (ustvarjene table, doseženi koraki) | D1 | Peel | Samo skupni seštevki, brez identifikatorjev |
Kaj naš strežnik lahko in česa ne more
Lahko
- Vidi vrste operacij, velikosti, časovni potek, korak, število udeležencev in kartic, ID predloge iz kataloga in oznako zaklepa.
- Zavrže, zakasni ali zavrne dostavo operacij (zavrnitev storitve).
- Vidi naslove IP na robu omrežja.
- Šteje table in dosežene korake, skupno.
- Izbriše tablo (potek, prijave zlorab).
Ne more
- Brati besedila kartic, imen, naslovov tabel, naslovov predlog po meri, glasov ali nalepk.
- Brati skritih kartic pred razkritjem (niti po njem ne).
- Ponarediti dejanj facilitatorja: za to potrebuje facilitatorjev podpis.
- Podtakniti lastnih ključev: ID table to izda.
- Spremeniti razkritega besedila kartice: zaveze in podpisi kartic to izdajo.
- Ugotoviti, kdo je napisal katero kartico.
Kot pri vsaki spletni aplikaciji zaupate kodi, ki jo strežemo. To površino ohranjamo majhno: strog Content Security Policy, script-src, omejen na naš izvor, brez skript tretjih oseb, protokol pa je na zahtevo odprt za pregled.
Slack in Microsoft Teams
- Sporočila vsebujejo povezavo do table in metapodatke (naslov, korak, števila). Besedilo kartic se pošlje samo, ko facilitator objavi povzetek in to potrdi.
- Kartica za pridružitev vsebuje povezavo za udeležence, ki vključuje ključ. Pridruži se lahko vsak, ki lahko bere ta kanal, enako kot če bi tja prilepili povezavo.
- Predogledi povezav prikazujejo samo korak in števila, nikoli vsebine.
- Obsegi dovoljenj v Slacku:
commands,chat:write,links:read,links:write;users:readsamo, ko ekipa vklopi omembe. - Žetoni botov so v mirovanju šifrirani (AES-GCM, ključ je shranjen kot skrivnost Workerja). Podpisi zahtev Slack in žetoni Bot Framework se preverijo ob vsaki zahtevi.
- Odstranitev aplikacije ustavi vse objavljanje in izbriše njene žetone.
Splet in infrastruktura
- Samo Cloudflare: Pages, Workers, Durable Objects, D1, R2 in KV v računu 1801 Labs. Nobenih drugih strežnikov.
- TLS povsod, HSTS in strog Content Security Policy.
- Brez analitičnih SDK-jev, brez oglasov, brez skript tretjih oseb. Edina izjema je Paddle.js, ki se naloži samo na strani za plačilo.
- En piškotek, samo za prijavljene facilitatorje:
peel_session, httpOnly, Secure, SameSite=Lax. - Iskanje GIF-ov in mediji gredo prek našega API-ja, zato naslovi IP udeležencev nikoli ne pridejo do GIPHY.
- Pisave in druga sredstva gostujemo sami. Brez pisav s CDN-jev, brez sledilnih pikslov.
- Omejitve hitrosti na IP in na tablo; prijave zlorab in zaklep s strani facilitatorja.
Računi in hramba
- Udeleženci se nikoli ne overjajo. Facilitatorji se prijavijo z Googlom ali Applom (ali z Entra ID prek Teams) samo za hrambo tabel ali plačljive funkcije.
- Račun hrani ID, ime in e-pošto od ponudnika ter šifrirano zbirko ključev, ki jo odklene ključ za dostop (WebAuthn PRF) ali obnovitvena koda. Prijava daje lastništvo, ne dostopa do vsebine.
- Prevzem table dokaže lastništvo s podpisom facilitatorja. Ključi tabel se nikoli ne pošljejo.
- Table brez računa se izbrišejo 60 dni po zadnjem obisku; vsak obisk ponastavi štetje. Shrambo izbrišejo alarmi Durable Object.
- Izbris računa izbriše seje, zbirko ključev in knjižnico, tablam pa vrne 60-dnevni rok poteka.
Odgovorno razkrivanje
Ste kaj našli? Najprej povejte nam in sodelovali bomo z vami. Prijave potrdimo v treh delovnih dneh.
- Prosimo, dajte nam razumno časa (ciljamo na 90 dni) za popravek, preden ranljivost razkrijete.
- Testirajte s svojimi tablami in računi. Ne dostopajte do podatkov drugih in ne poslabšujte delovanja storitve.
- Zoper raziskave v dobri veri, ki sledijo tem pravilom, ne bomo pravno ukrepali.
- Strojno berljiv kontakt:
/.well-known/security.txt.
Stranke paketa Podjetje dobijo paket za varnostni pregled (odgovori na vprašalnike, podobdelovalci, tokovi podatkov). DPA · Zasebnost