Infoturbe tiimidele ja rakenduste ülevaatajatele
Turvalisus Peelis
Lühidalt: tahvli sisu krüpteeritakse brauseris võtmega, mis asub lingi fragmendis, nii et meie serverid salvestavad ja edastavad krüpteeritud andmeid, mida nad lugeda ei saa. Siin on täpselt kirjas, kuidas see töötab ja kus on piirid.
Kokkuvõte
- Kaartide tekst, nimed, tahvlite pealkirjad, hääled ja kleebised krüpteeritakse algoritmiga AES-256-GCM tahvlivõtmega, mis genereeritakse brauseris. Võti liigub URL-i fragmendis (
#k=) ja seda ei saadeta kunagi serverisse. - Fasilitaatori toimingud, tahvli päis ja hetktõmmised allkirjastatakse fasilitaatori Ed25519 võtmega. Tahvli ID tuletatakse sellest võtmest, nii et kliendid tuvastavad võtme väljavahetamise.
- Peidetud kaardid on avalikustamiseni pitseeritud fasilitaatori võtmega (X25519 sealed box) ja seotud soolatud siduvate kinnitustega, nii et avalikustatud teksti ei saa välja vahetada.
- Vaikimisi anonüümne: toimingud ei sisalda autori ID-d; hääled ja reaktsioonid kasutavad tahvlipõhist juhuslikku ID-d.
- Osalejad ei autendi end kunagi. Ei analüütika-SDK-sid, ei reklaame, ei kolmanda osapoole skripte, välja arvatud Paddle.js makselehel.
- Ainult Cloudflare. Kontoga sidumata tahvlid kustutatakse 60 päeva pärast viimast külastust.
Kuidas andmed liiguvad
URL-i fragmenti (kõike pärast #-märki) käsitleb brauser ja see ei ole HTTP-päringu osa. Peel paneb tahvli võtme just sinna.
Ohumudel
Disainime nii, et täielikult kompromiteeritud või uudishimulik server, sealhulgas meie ise, saaks tiimi jutu kohta teada võimalikult vähe.
Mida me kaitseme
- Kaartide tekst, valitud GIF-id ja nimelises režiimis autori nimi.
- Osalejate nimed ja avatarid, tahvli nimi ja kohandatud mallide pealkirjad.
- Kes mille poolt hääletas või millele reageeris ja kes millise kaardi kirjutas.
- Retro terviklus: samme, avalikustamisi ja fasilitaatori otsuseid ei saa võltsida.
Ründajad, mida arvestame
- Meie enda serverid, pahatahtlik siseringi isik või keegi, kes murrab sisse meie andmehoidlasse: nad saavad krüpteeritud andmed ja metaandmed.
- Võrguründaja: TLS kõikjal; võti ei läbi kunagi võrku.
- Server, mis vahetab võtmeid: tahvli ID tuletatakse fasilitaatori avalikust võtmest ja kliendid kontrollivad allkirjastatud päist.
- Osaleja, kes tahab piiluda või võltsida: peidetud kaardid on pitseeritud fasilitaatori võtmega; fasilitaatori toimingud vajavad fasilitaatori allkirja; kaardi muutmine vajab kaardi võtit.
- Fasilitaator, kes avaldab kaardi võrguühenduseta autori eest: siduvad kinnitused ei lase tal teksti muuta.
Ausalt: väljaspool ulatust
- Igaüks, kellel on osaleja link, saab tahvlit lugeda. Link ongi ligipääsukontroll. Jaga seda nii, nagu jagaksid tahvlit ennast.
- Kompromiteeritud seade, pahatahtlik brauserilaiendus või keegi, kes piilub üle õla.
- Liiklusanalüüs: server näeb ajastust, suurusi ja arve (vaata andmekaarti).
- Serveripoolne teenusetõkestus: server saab sõnumeid kõrvale heita või viivitada, kuid mitte neid lugeda ega võltsida.
Krüptograafia
Kõik primitiivid tulevad brauseri WebCrypto API-st. Ei mingit isetehtud krüptograafiat ega kolmanda osapoole krüptoteeke.
| Võti | Algoritm | Kasutus |
|---|---|---|
| K_board | AES-256-GCM, 96-bitine juhuslik IV | Krüpteerib iga toimingu, hetktõmmise ja kohaloleku uuenduse. Lisaandmed seovad tahvli ID, toimingu tüübi ja toimingu ID, nii et krüpteeritud andmeid ei saa uuesti esitada teises tahvlis ega teises kohas. Asub ainult lingi fragmendis #k=. |
| K_owner | Ed25519 | Fasilitaatori volitus. Allkirjastab fasilitaatori toimingud (samm, taimer, esiletõst, mall, seaded, hääletuse avamine, kaardi peitmine), tahvli päise ja hetktõmmised. Rangelt kasvav loendur takistab kordusrünnet. Ainult fasilitaatori lingis (&o=). |
| Tahvli ID | SHA-256, esimesed 80 bitti, base32 | Tuletatakse fasilitaatori avalikust võtmest, nii et ID ise tõendab, milline võti tahvlit omab. Kliendid lükkavad tagasi päise, mille võtme räsi ei vasta ID-le. |
| K_fac | X25519 sealed box: ajutine X25519 + HKDF-SHA256 + AES-256-GCM | Kirjutamise ajal pitseeritakse peidetud kaardid fasilitaatori avaliku võtmega. Neid saab avada ainult fasilitaatori link (&f=). |
| Kaardivõtmed | Ed25519, üks võti kaardi kohta | On ainult autoril. Sellega allkirjastatakse muudatused ja avalikustamine: autentsus ilma identiteedita. |
| Siduvad kinnitused (commitments) | HMAC-SHA256 128-bitise juhusliku soolaga | Peidetud kaart avaldab oma sisu kohta siduva kinnituse. Avalikustamisel avaldatakse sisu ja sool ning iga klient kontrollib neid, nii et keegi ei saa teksti välja vahetada. |
| Kohalolek | AES-256-GCM võtmega K_board | Nimed, avatarid ja kirjutamise näidikud krüpteeritakse nagu kõik muu. |
| Võtmekimp | HKDF-SHA256 pääsuvõtme PRF-ist või taastekoodist, AES-256-GCM | Sisse logitud fasilitaatorid saavad tahvlivõtmeid seadmete vahel sünkroonida. Kimp krüpteeritakse seadmes; server hoiab ainult krüpteeritud andmeid ja mähitud võtmeid. |
Allkirjastatavad sõnumid on domeenide kaupa eraldatud (näiteks peel/sig/v1, peel/header/v1, peel/snap/v1), nii et ühe eesmärgi allkirja ei saa kasutada teise jaoks.
Anonüümsus
- Toimingud ei sisalda autori ID-d. Server ei saa kaarti inimesega siduda ja vaikimisi ei saa seda ka fasilitaator.
- Hääled ja reaktsioonid on seotud juhusliku tahvlipõhise ID-ga, mis pole nimega seotud.
- Kirjutamise näidik näitab, et keegi kirjutab, aga mitte kunagi seda, mida.
- Nimeline režiim on tahvli selgesõnaline seade; autori nimi liigub siis krüpteeritud kaardi sees.
- Osalejad ei logi kunagi sisse, seega pole kontot, mille järgi andmeid siduda.
Andmekaart
Kõik, mida me hoiame: kus see asub, kes saab seda lugeda ja kui kaua see alles on.
| Andmed | Asukoht | Kes saab lugeda | Säilitamine |
|---|---|---|---|
| Kaardid, hääled, reaktsioonid, kleebised, tegevused, tahvli nimi, kohandatud mallide pealkirjad | Durable Objecti salvestusruum, krüpteeritult | Tahvli lingi omajad | Kuni tahvli kustutamiseni |
| Toimingu ümbris: tüüp, serveri järjekorranumber ja aeg, suurus, fasilitaatori loendur | Durable Objecti salvestusruum | Peel | Kuni tahvli kustutamiseni |
| Osalejate nimed, avatarid, kirjutamise olek | Edastatakse krüpteeritult; hoitakse ühenduse ajal mälus | Tahvli lingi omajad | Ühenduse ajal |
| Tahvli olek: samm, osalejate ja kaartide arv, kataloogimalli ID, lukustuse lipp, loomis- ja aegumisaeg | Durable Object, D1; Slacki/Teamsi sõnumid, kui rakendus on paigaldatud | Peel; sinu Slacki/Teamsi kanal | Tahvli eluea jooksul |
| Fasilitaatori konto: teenusepakkuja ID, nimi, e-post (kui jagatud), seotud teenusepakkujad, loomise kuupäev, seanss | D1 | Peel | Kuni konto kustutamiseni |
| Võtmekimp ja mähitud võtmed | D1, krüpteeritult | Ainult sina (pääsuvõti või taastekood) | Kuni konto kustutamiseni |
| Pakett, tellimuse olek, Paddle’i kliendi- ja tellimuse ID-d | D1; Paddle | Peel, Paddle | Nii kaua, kui maksuseadus nõuab |
| Slacki/Teamsi tööruumi, kanali ja sõnumite ID-d; boti token (AES-GCM-iga krüpteeritud) | D1 | Peel | Kuni rakenduse eemaldamiseni |
| IP-aadress | Cloudflare’i servavõrgus, lühiajaliselt (edastus, päringupiirangud) | Cloudflare, Peeli päringupiiraja | Meie andmebaasides ei salvestata |
| Päevased loendurid (loodud tahvlid, läbitud sammud) | D1 | Peel | Ainult koondandmed, ilma identifikaatoriteta |
Mida meie server saab ja mida ei saa teha
Server saab
- Näha toimingute tüüpe, suurusi, ajastust, sammu, osalejate ja kaartide arvu, kataloogimalli ID-d ja lukustuse lippu.
- Toiminguid kõrvale heita, viivitada või jätta edastamata (teenusetõkestus).
- Näha IP-aadresse võrgu servas.
- Lugeda kokku tahvleid ja läbitud samme, koondandmetena.
- Tahvlit kustutada (aegumine, kuritarvitusest teatamine).
Server ei saa
- Lugeda kaartide teksti, nimesid, tahvlite pealkirju, kohandatud mallide pealkirju, hääli ega kleebiseid.
- Lugeda peidetud kaarte enne avalikustamist (ega ka pärast seda).
- Võltsida fasilitaatori toiminguid: need vajavad fasilitaatori allkirja.
- Vahetada sisse oma võtmeid: tahvli ID reedaks selle.
- Muuta kaardi avalikustatud teksti: siduvad kinnitused ja kaardiallkirjad reedaksid selle.
- Öelda, kes millise kaardi kirjutas.
Nagu iga veebirakenduse puhul, usaldad sa koodi, mida me serveerime. Hoiame selle pinna väikese: range sisuturbepoliitika (Content Security Policy), script-src piiratud meie oma päritoluga, ei ühtegi kolmanda osapoole skripti ning protokoll on soovi korral ülevaatamiseks avatud.
Slack ja Microsoft Teams
- Sõnumid kannavad tahvli linki ja metaandmeid (pealkiri, samm, arvud). Kaartide tekst saadetakse ainult siis, kui fasilitaator postitab kokkuvõtte ja selle kinnitab.
- Liitumiskaardil on osaleja link, mis sisaldab võtit. Igaüks, kes seda kanalit loeb, saab liituda, täpselt nagu siis, kui link sinna kleepida.
- Lingi eelvaated näitavad ainult sammu ja arve, mitte kunagi sisu.
- Slacki õigused:
commands,chat:write,links:read,links:write;users:readainult siis, kui tiim lülitab mainimised sisse. - Boti tokenid on salvestatuna krüpteeritud (AES-GCM, võtit hoitakse Workeri saladusena). Slacki päringuallkirjad ja Bot Frameworki tokenid kontrollitakse iga päringu puhul.
- Rakenduse eemaldamine lõpetab kõik postitused ja kustutab selle tokenid.
Veeb ja taristu
- Ainult Cloudflare: Pages, Workers, Durable Objects, D1, R2 ja KV 1801 Labsi kontol. Muid servereid pole.
- TLS kõikjal, HSTS ja range sisuturbepoliitika (Content Security Policy).
- Ei analüütika-SDK-sid, ei reklaame, ei kolmanda osapoole skripte. Ainus erand on Paddle.js, mis laaditakse ainult makselehel.
- Üks küpsis, ainult sisse logitud fasilitaatoritele:
peel_session, httpOnly, Secure, SameSite=Lax. - GIF-ide otsing ja meedia käivad läbi meie API, nii et osalejate IP-aadressid ei jõua kunagi GIPHY-ni.
- Fondid ja failid on majutatud meie juures. Ei CDN-i fonte ega jälgimispiksleid.
- Päringupiirangud IP ja tahvli kohta; kuritarvitusest teatamine ja fasilitaatori lukk.
Kontod ja andmete säilitamine
- Osalejad ei autendi end kunagi. Fasilitaatorid logivad sisse Google’iga (või Teamsi kaudu Entra ID-ga) ainult tahvlite alles hoidmiseks või tasuliste funktsioonide kasutamiseks.
- Kontol hoitakse ID-d, teenusepakkujalt saadud nime ja e-posti aadressi ning krüpteeritud võtmekimpu, mis avatakse pääsuvõtme (WebAuthn PRF) või taastekoodiga. Sisselogimine annab omandiõiguse, mitte ligipääsu sisule.
- Tahvli enda nimele võtmisel tõendatakse omandiõigust fasilitaatori allkirjaga. Tahvlivõtmeid ei saadeta kunagi.
- Kontota tahvlid kustutatakse 60 päeva pärast viimast külastust; iga külastus alustab arvestust otsast peale. Salvestusruumi kustutavad Durable Objecti äratused.
- Konto kustutamisel kustutatakse seansid, võtmekimp ja sinu kogu ning sinu tahvlitele taastub 60-päevane aegumine.
Vastutustundlik haavatavustest teatamine
Leidsid midagi? Anna esmalt meile teada ja teeme sinuga koostööd. Kinnitame teate kättesaamist kolme tööpäeva jooksul.
- Palun anna meile enne avalikustamist mõistlik aeg parandamiseks (meie eesmärk on 90 päeva).
- Testi oma tahvlite ja kontodega. Ära ligi pääse teiste inimeste andmetele ega halvenda teenust.
- Me ei pöördu kohtusse heas usus tehtud uurimistöö pärast, mis järgib neid reegleid.
- Masinloetav kontakt:
/.well-known/security.txt.
Ettevõtte paketi kliendid saavad turvaülevaatuse paketi (küsimustiku vastused, alamtöötlejad, andmevood). Andmetöötlusleping · Privaatsus