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.

Andmevoog: võti loetakse lingist kohapeal; võrku läbivad ainult krüpteeritud andmed ja minimaalsed metaandmed.

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õtiAlgoritmKasutus
K_boardAES-256-GCM, 96-bitine juhuslik IVKrü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_ownerEd25519Fasilitaatori 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 IDSHA-256, esimesed 80 bitti, base32Tuletatakse 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_facX25519 sealed box: ajutine X25519 + HKDF-SHA256 + AES-256-GCMKirjutamise ajal pitseeritakse peidetud kaardid fasilitaatori avaliku võtmega. Neid saab avada ainult fasilitaatori link (&f=).
KaardivõtmedEd25519, üks võti kaardi kohtaOn ainult autoril. Sellega allkirjastatakse muudatused ja avalikustamine: autentsus ilma identiteedita.
Siduvad kinnitused (commitments)HMAC-SHA256 128-bitise juhusliku soolagaPeidetud 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.
KohalolekAES-256-GCM võtmega K_boardNimed, avatarid ja kirjutamise näidikud krüpteeritakse nagu kõik muu.
VõtmekimpHKDF-SHA256 pääsuvõtme PRF-ist või taastekoodist, AES-256-GCMSisse 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.

Peidetud kaardid ja avalikustamine

  1. Kirjutamise ajal pitseerib autori brauser kaardi fasilitaatori X25519 võtmega ja avaldab soolatud siduva kinnituse. Avatekst jääb autori seadmesse.
  2. Teised osalejad näevad peidetud kaarti: nemad ei saa seda dekrüpteerida ja server ka mitte.
  3. Fasilitaatori brauser saab pitseeritud kaarte avada (eelvaade „👁 ainult sina“).
  4. Avalikustamisel avaldab iga autor kaardi uuesti, krüpteerituna võtmega K_board ja allkirjastatuna kaardivõtmega, koos soolaga.
  5. Kui autor pole võrgus, avaldab fasilitaator kaardi tema eest. Iga klient kontrollib siduvat kinnitust, nii et tekst peab vastama sellele, mida autor kirjutas.

Kuna fasilitaator näeb tehniliselt eelvaadet, näitab iga tahvel kaartide peidus olemise ajal kõigile silti „fasilitaator näeb eelvaadet“. Seda seadet ei saa peita.

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.

AndmedAsukohtKes saab lugedaSäilitamine
Kaardid, hääled, reaktsioonid, kleebised, tegevused, tahvli nimi, kohandatud mallide pealkirjadDurable Objecti salvestusruum, krüpteeritultTahvli lingi omajadKuni tahvli kustutamiseni
Toimingu ümbris: tüüp, serveri järjekorranumber ja aeg, suurus, fasilitaatori loendurDurable Objecti salvestusruumPeelKuni tahvli kustutamiseni
Osalejate nimed, avatarid, kirjutamise olekEdastatakse krüpteeritult; hoitakse ühenduse ajal mälusTahvli lingi omajadÜhenduse ajal
Tahvli olek: samm, osalejate ja kaartide arv, kataloogimalli ID, lukustuse lipp, loomis- ja aegumisaegDurable Object, D1; Slacki/Teamsi sõnumid, kui rakendus on paigaldatudPeel; sinu Slacki/Teamsi kanalTahvli eluea jooksul
Fasilitaatori konto: teenusepakkuja ID, nimi, e-post (kui jagatud), seotud teenusepakkujad, loomise kuupäev, seanssD1PeelKuni konto kustutamiseni
Võtmekimp ja mähitud võtmedD1, krüpteeritultAinult sina (pääsuvõti või taastekood)Kuni konto kustutamiseni
Pakett, tellimuse olek, Paddle’i kliendi- ja tellimuse ID-dD1; PaddlePeel, PaddleNii kaua, kui maksuseadus nõuab
Slacki/Teamsi tööruumi, kanali ja sõnumite ID-d; boti token (AES-GCM-iga krüpteeritud)D1PeelKuni rakenduse eemaldamiseni
IP-aadressCloudflare’i servavõrgus, lühiajaliselt (edastus, päringupiirangud)Cloudflare, Peeli päringupiirajaMeie andmebaasides ei salvestata
Päevased loendurid (loodud tahvlid, läbitud sammud)D1PeelAinult 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:read ainult 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.

[email protected]

  • 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