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.

Tok podatkov: ključ se prebere lokalno iz povezave; po omrežju potujeta samo šifrirano besedilo in minimalni metapodatki.

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čAlgoritemUporaba
K_boardAES-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_ownerEd25519Pooblastila 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 tableSHA-256, prvih 80 bitov, base32Izpeljan 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_facX25519 sealed box: efemerni X25519 + HKDF-SHA256 + AES-256-GCMSkrite kartice so med pisanjem zapečatene za facilitatorjev javni ključ. Odpre jih lahko samo povezava facilitatorja (&f=).
Ključi karticEd25519, en ključ na karticoIma ga samo avtor. Z njim so podpisana urejanja in razkritje: pristnost brez identitete.
ZavezeHMAC-SHA256 s 128-bitno naključno soljoSkrita kartica objavi zavezo svoji vsebini. Ob razkritju se objavita vsebina in sol, vsak odjemalec pa ju preveri, zato nihče ne more zamenjati besedila.
PrisotnostAES-256-GCM s K_boardImena, avatarji in indikatorji tipkanja so šifrirani kot vse drugo.
Zbirka ključevHKDF-SHA256 iz PRF ključa za dostop ali obnovitvene kode, AES-256-GCMPrijavljeni 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.

Skrite kartice in razkritje

  1. Med pisanjem avtorjev brskalnik zapečati kartico za facilitatorjev ključ X25519 in objavi soljeno zavezo. Golo besedilo ostane na avtorjevi napravi.
  2. Drugi udeleženci vidijo skrito kartico: ne morejo je dešifrirati, prav tako ne strežnik.
  3. Facilitatorjev brskalnik lahko odpre zapečatene kartice (predogled „👁 samo ti“).
  4. Ob razkritju vsak avtor kartico ponovno objavi, šifrirano s K_board in podpisano s ključem kartice, skupaj s soljo.
  5. Če avtor ni povezan, jo namesto njega ponovno objavi facilitator. Vsak odjemalec preveri zavezo, zato se mora besedilo ujemati s tistim, kar je napisal avtor.

Ker facilitator tehnično lahko vidi kartice vnaprej, vsaka tabla vsem prikazuje oznako „facilitator lahko vidi vnaprej“, dokler so kartice skrite. Te oznake ni mogoče skriti z nobeno nastavitvijo.

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.

PodatkiKjeKdo lahko bereHramba
Kartice, glasovi, odzivi, nalepke, ukrepi, ime table, naslovi predlog po meriHramba Durable Object, kot šifrirano besediloOsebe s povezavo do tableDokler tabla ni izbrisana
Ovojnica operacije: vrsta, strežniško zaporedje in čas, velikost, števec facilitatorjaHramba Durable ObjectPeelDokler tabla ni izbrisana
Imena udeležencev, avatarji, tipkanjePosredovano kot šifrirano besedilo; v pomnilniku, dokler je povezava vzpostavljenaOsebe s povezavo do tableMed povezavo
Stanje table: korak, število udeležencev in kartic, ID predloge iz kataloga, oznaka zaklepa, čas nastanka in potekaDurable Object, D1; sporočila v Slacku/Teams, če je aplikacija nameščenaPeel; vaš kanal v Slacku/TeamsŽivljenjska doba table
Račun facilitatorja: ID ponudnika, ime, e-pošta (če je deljena), povezani ponudniki, datum nastanka, sejaD1PeelDokler račun ni izbrisan
Zbirka ključev in oviti ključiD1, kot šifrirano besediloSamo vi (ključ za dostop ali obnovitvena koda)Dokler račun ni izbrisan
Paket, stanje naročnine, ID stranke in ID naročnine pri PaddluD1; PaddlePeel, PaddleKot zahteva davčna zakonodaja
ID-ji delovnega prostora, kanala in sporočil v Slacku/Teams; žeton bota (šifriran z AES-GCM)D1PeelDo odstranitve aplikacije
Naslov IPRobno omrežje Cloudflare, prehodno (dostava, omejitve hitrosti)Cloudflare, Peelov omejevalnik hitrostiNi shranjen v naših bazah podatkov
Dnevni števci (ustvarjene table, doseženi koraki)D1PeelSamo 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:read samo, 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.

[email protected]

  • 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