Információbiztonsági csapatoknak és alkalmazás-ellenőröknek

Biztonság a Peelben

Röviden: a tábla tartalmát a böngésző titkosítja egy olyan kulccsal, amely a link fragmentjében él, így a szervereink csak olyan titkosított adatot tárolnak és továbbítanak, amelyet nem tudnak elolvasni. Itt pontosan leírjuk, hogyan, és hol vannak a határai.

Összefoglaló

  • A kártyaszövegeket, neveket, táblacímeket, szavazatokat és matricákat AES-256-GCM titkosítja egy, a böngészőben generált táblakulccsal. A kulcs az URL fragmentjében (#k=) utazik, és soha nem kerül szerverre.
  • A facilitátori műveleteket, a táblafejlécet és a pillanatképeket a facilitátor Ed25519 kulcsa írja alá. A táblaazonosító ebből a kulcsból származik, így a kliensek észreveszik, ha valaki kicseréli a kulcsot.
  • A rejtett kártyák a felfedésig a facilitátornak vannak lepecsételve (X25519 sealed box), és sózott commitmentek kötik őket, így a felfedett szöveg nem cserélhető ki.
  • Alapból anonim: a műveletek nem hordoznak szerzőazonosítót; a szavazatok és reakciók táblánkénti véletlen azonosítót használnak.
  • A résztvevők soha nem azonosítják magukat. Nincs analitikai SDK, nincs reklám, nincs harmadik féltől származó szkript, kivéve a Paddle.js-t a fizetési oldalon.
  • Kizárólag Cloudflare. A gazdátlan táblák az utolsó látogatás után 60 nappal törlődnek.

Hogyan áramlik az adat

Az URL fragmentjét (mindent a # után) a böngésző kezeli, és nem része a HTTP-kérésnek. A Peel ide teszi a tábla kulcsát.

Adatáramlás: a kulcsot a böngésző helyben olvassa ki a linkből; a hálózaton csak titkosított adat és minimális metaadat halad át.

Fenyegetésmodell

Úgy tervezünk, hogy egy teljesen kompromittált vagy kíváncsi szerver, beleértve minket is, a lehető legkevesebbet tudja meg arról, amit egy csapat mond.

Amit védünk

  • A kártyaszövegeket, a GIF-választásokat és névvel ellátott módban a szerző nevét.
  • A résztvevők nevét és avatarját, a tábla nevét és az egyéni sablonok címeit.
  • Azt, hogy ki mire szavazott vagy reagált, és ki melyik kártyát írta.
  • A retro integritását: a lépések, a felfedések és a facilitátori döntések nem hamisíthatók.

Támadók, akikkel számolunk

  • A saját szervereink, egy rosszindulatú bennfentes, vagy valaki, aki betör a tárhelyünkre: titkosított adatot és metaadatot kapnak.
  • Hálózati támadó: mindenhol TLS; a kulcs soha nem halad át a hálózaton.
  • Kulcsot cserélő szerver: a táblaazonosító a facilitátor nyilvános kulcsából származik, és a kliensek ellenőrzik az aláírt fejlécet.
  • Kukucskálni vagy hamisítani akaró résztvevő: a rejtett kártyák a facilitátornak vannak lepecsételve; a facilitátori műveletekhez a facilitátor aláírása kell; a kártya szerkesztéséhez a kártya kulcsa.
  • Offline szerző helyett újraközlő facilitátor: a commitmentek megakadályozzák, hogy megváltoztassa a szöveget.

Őszintén: amire nem terjed ki

  • Aki birtokolja a résztvevői linket, olvashatja a táblát. A link maga a hozzáférés-szabályozás. Úgy oszd meg, mintha magát a táblát adnád oda.
  • Kompromittált eszköz, rosszindulatú böngészőbővítmény, vagy valaki, aki a válladon át figyel.
  • Forgalomelemzés: a szerver látja az időzítést, a méreteket és a darabszámokat (lásd az adattérképet).
  • Szolgáltatásmegtagadás a szerver részéről: eldobhat vagy késleltethet üzeneteket, de nem tudja elolvasni vagy hamisítani őket.

Kriptográfia

Minden primitív a böngésző WebCrypto API-jából származik. Nincs saját fejlesztésű kriptográfia, nincsenek harmadik féltől származó kriptokönyvtárak.

KulcsAlgoritmusMire használjuk
K_boardAES-256-GCM, 96 bites véletlen IVMinden műveletet, pillanatképet és jelenléti frissítést titkosít. A kiegészítő adat a táblaazonosítóhoz, a művelettípushoz és a műveletazonosítóhoz köti, így a titkosított adat nem játszható vissza egy másik táblába vagy helyre. Kizárólag a link fragmentjében él: #k=.
K_ownerEd25519A facilitátor jogosultsága. Ezzel írja alá a facilitátori műveleteket (lépés, időzítő, reflektorfény, sablon, beállítások, szavazatok felfedése, kártya elrejtése), a táblafejlécet és a pillanatképeket. Egy szigorúan növekvő számláló akadályozza meg a visszajátszást. Csak a facilitátori linkben (&o=).
TáblaazonosítóSHA-256, első 80 bit, base32A facilitátor nyilvános kulcsából származik, így már maga az azonosító bizonyítja, melyik kulcs birtokolja a táblát. A kliensek elutasítják azt a fejlécet, amelynek kulcsa nem az azonosítóra hashel.
K_facX25519 sealed box: efemer X25519 + HKDF-SHA256 + AES-256-GCMÍrás közben a rejtett kártyák a facilitátor nyilvános kulcsára vannak lepecsételve. Csak a facilitátori link (&f=) tudja kinyitni őket.
KártyakulcsokEd25519, kártyánként egy kulcsCsak a szerzőnél van. A szerkesztéseket és a felfedést ezzel írja alá: hitelesség személyazonosság nélkül.
CommitmentekHMAC-SHA256, 128 bites véletlen sóvalA rejtett kártya commitmentet tesz közzé a tartalmáról. A felfedéskor a tartalom és a só is nyilvános lesz, és minden kliens ellenőrzi őket, így senki nem cserélheti ki a szöveget.
JelenlétAES-256-GCM, K_board kulccsalA nevek, az avatarok és a gépelésjelzők ugyanúgy titkosítva vannak, mint minden más.
KulcscsomagHKDF-SHA256 azonosítókulcs-PRF-ből vagy helyreállítási kódból, AES-256-GCMA bejelentkezett facilitátorok szinkronizálhatják a táblakulcsokat az eszközeik között. A csomagot az eszköz titkosítja; a szerver csak titkosított adatot és becsomagolt kulcsokat tárol.

Az aláírt üzenetek tartományonként el vannak választva (például peel/sig/v1, peel/header/v1, peel/snap/v1), így egy adott célra készült aláírás nem használható fel másra.

Rejtett kártyák és a felfedés

  1. Írás közben a szerző böngészője a facilitátor X25519 kulcsára pecsételi le a kártyát, és sózott commitmentet tesz közzé. A nyílt szöveg a szerző eszközén marad.
  2. A többi résztvevő rejtett kártyát lát: nem tudják visszafejteni, ahogy a szerver sem.
  3. A facilitátor böngészője ki tudja nyitni a lepecsételt kártyákat (ez a „👁 csak te” előnézet).
  4. A felfedéskor minden szerző újra közzéteszi a kártyát K_board-dal titkosítva, a kártyakulccsal aláírva, a sóval együtt.
  5. Ha egy szerző offline, a facilitátor teszi közzé helyette. Minden kliens ellenőrzi a commitmentet, így a szövegnek egyeznie kell azzal, amit a szerző írt.

Mivel a facilitátor technikailag beleláthat, minden tábla mindenkinek „a facilitátor beleláthat” címkét mutat, amíg a kártyák rejtve vannak. Ez nem olyan beállítás, amit el lehetne rejteni.

Anonimitás

  • A műveletek nem hordoznak szerzőazonosítót. A szerver nem tudja egy kártyát egy személyhez kötni, és alapból a facilitátor sem.
  • A szavazatok és reakciók táblánkénti véletlen azonosítóhoz kötődnek, amely nem kapcsolódik névhez.
  • A gépelésjelzők azt mutatják, hogy valaki ír, azt soha, hogy mit.
  • A névvel ellátott mód egy kifejezett táblabeállítás; ilyenkor a szerző neve a titkosított kártyán belül utazik.
  • A résztvevők soha nem jelentkeznek be, így nincs fiók, amit össze lehetne kapcsolni.

Adattérkép

Minden, amit tárolunk: hol van, ki olvashatja, és meddig marad meg.

AdatHolKi olvashatjaMeddig
Kártyák, szavazatok, reakciók, matricák, teendők, a tábla neve, egyéni sablonok címeiDurable Object tárhely, titkosítvaAkiknél ott a tábla linkjeAmíg a táblát nem törlik
Műveleti boríték: típus, szerveroldali sorszám és idő, méret, facilitátori számlálóDurable Object tárhelyPeelAmíg a táblát nem törlik
Résztvevők nevei, avatarjai, gépelésjelzésTitkosítva továbbítva; csatlakozás közben a memóriábanAkiknél ott a tábla linkjeCsatlakozás közben
Táblaállapot: lépés, résztvevők és kártyák száma, katalógusbeli sablonazonosító, zárolásjelző, létrehozási és lejárati időDurable Object, D1; telepítés esetén Slack-/Teams-üzenetekPeel; a Slack-/Teams-csatornádA tábla élettartama alatt
Facilitátori fiók: szolgáltatói azonosító, név, e-mail-cím (ha megosztod), összekapcsolt szolgáltatók, létrehozás dátuma, munkamenetD1PeelAmíg nem törlöd a fiókot
Kulcscsomag és becsomagolt kulcsokD1, titkosítvaCsak te (azonosítókulcs vagy helyreállítási kód)Amíg nem törlöd a fiókot
Csomag, előfizetési állapot, Paddle-ügyfél- és -előfizetés-azonosítókD1; PaddlePeel, PaddleAmeddig az adójogszabályok előírják
Slack-/Teams-munkaterület-, csatorna- és üzenetazonosítók; bot token (AES-GCM-mel titkosítva)D1PeelAz eltávolításig
IP-címCloudflare edge, átmenetileg (kézbesítés, sebességkorlát)Cloudflare, a Peel sebességkorlátozójaNem tároljuk az adatbázisainkban
Napi számlálók (létrehozott táblák, elért lépések)D1PeelCsak összesítve, azonosítók nélkül

Mit tud és mit nem tud a szerverünk

Amit tud

  • Látja a művelettípusokat, a méreteket, az időzítést, a lépést, a résztvevők és a kártyák számát, a katalógusbeli sablonazonosítót és a zárolásjelzőt.
  • Eldobhat, késleltethet műveleteket, vagy megtagadhatja a kézbesítésüket (szolgáltatásmegtagadás).
  • Látja az IP-címeket a hálózat szélén.
  • Összesítve megszámolja a táblákat és az elért lépéseket.
  • Törölhet egy táblát (lejárat, visszaélés-bejelentés).

Amit nem tud

  • Elolvasni a kártyaszövegeket, neveket, táblacímeket, egyéni sablonok címeit, szavazatokat vagy matricákat.
  • Elolvasni a rejtett kártyákat a felfedés előtt (sőt utána sem).
  • Facilitátori műveleteket hamisítani: azokhoz a facilitátor aláírása kell.
  • Becsempészni a saját kulcsait: a táblaazonosító lebuktatja.
  • Megváltoztatni egy kártya felfedett szövegét: a commitmentek és a kártyaaláírások lebuktatják.
  • Megmondani, ki melyik kártyát írta.

Mint minden webalkalmazásnál, itt is megbízol az általunk kiszolgált kódban. Ezt a felületet kicsin tartjuk: szigorú Content Security Policy, a saját originünkre korlátozott script-src, nincs harmadik féltől származó szkript, a protokollt pedig kérésre bárki átnézheti.

Slack és Microsoft Teams

  • Az üzenetek a tábla linkjét és metaadatokat (cím, lépés, darabszámok) visznek. Kártyaszöveget csak akkor küldünk, ha a facilitátor összefoglalót tesz közzé, és ezt megerősíti.
  • A Csatlakozás-kártya tartalmazza a résztvevői linket, benne a kulccsal. Aki olvassa az adott csatornát, csatlakozhat, pont mintha bemásolnád oda a linket.
  • A linkelőnézetek csak a lépést és a darabszámokat mutatják, tartalmat soha.
  • Slack-jogosultságok: commands, chat:write, links:read, links:write; users:read csak akkor, ha egy csapat bekapcsolja az említéseket.
  • A bot tokeneket titkosítva tároljuk (AES-GCM, a kulcs Worker-titokként van tárolva). A Slack kérésaláírásait és a Bot Framework tokeneket minden kérésnél ellenőrizzük.
  • Az alkalmazás eltávolítása leállít minden közzétételt, és törli a tokenjeit.

Web és infrastruktúra

  • Kizárólag Cloudflare: Pages, Workers, Durable Objects, D1, R2 és KV az 1801 Labs fiókján. Más szerver nincs.
  • Mindenhol TLS, HSTS és szigorú Content Security Policy.
  • Nincs analitikai SDK, nincs reklám, nincs harmadik féltől származó szkript. Az egyetlen kivétel a Paddle.js, amely csak a fizetési oldalon töltődik be.
  • Egyetlen süti, csak bejelentkezett facilitátoroknak: peel_session, httpOnly, Secure, SameSite=Lax.
  • A GIF-keresés és a médiafájlok az API-nkon keresztül mennek, így a résztvevők IP-címe sosem jut el a GIPHY-hoz.
  • A betűtípusokat és egyéb fájlokat magunk szolgáljuk ki. Nincsenek CDN-ről töltött betűtípusok, nincsenek követőpixelek.
  • Sebességkorlát IP-címenként és táblánként; visszaélés-bejelentés és facilitátori zárolás.

Fiókok és adatmegőrzés

  • A résztvevők soha nem azonosítják magukat. A facilitátorok Google-fiókkal (a Teamsen keresztül Entra ID-vel) jelentkeznek be, és csak azért, hogy megőrizzék a táblákat, vagy fizetős funkciókat használjanak.
  • Egy fiók egy azonosítót, a szolgáltatótól kapott nevet és e-mail-címet, valamint egy titkosított kulcscsomagot tárol, amelyet azonosítókulcs (WebAuthn PRF) vagy helyreállítási kód nyit. A bejelentkezés tulajdonjogot ad, nem hozzáférést a tartalomhoz.
  • Egy tábla igénylésekor a tulajdonjogot facilitátori aláírás bizonyítja. A táblakulcsokat soha nem küldjük el.
  • A fiók nélküli táblák az utolsó látogatás után 60 nappal törlődnek; minden látogatás újraindítja az órát. A tárhelyet Durable Object-riasztások törlik.
  • A fiókod törlésével törlődnek a munkameneteid, a kulcscsomagod és a könyvtárad, a tábláidra pedig ismét a 60 napos lejárat vonatkozik.

Felelős közzététel

Találtál valamit? Először nekünk szólj, és együtt dolgozunk rajta. A bejelentéseket három munkanapon belül visszaigazoljuk.

[email protected]

  • Kérjük, hagyj nekünk észszerű időt a javításra (90 napra törekszünk), mielőtt nyilvánosságra hozod.
  • A saját tábláiddal és fiókjaiddal tesztelj. Ne férj hozzá mások adataihoz, és ne rontsd a szolgáltatás működését.
  • Nem indítunk jogi eljárást a jóhiszemű kutatás miatt, ha az betartja ezeket a szabályokat.
  • Géppel olvasható elérhetőség: /.well-known/security.txt.

A Vállalati csomag ügyfelei biztonsági átvilágítási csomagot kapnak (kérdőív-válaszok, alvállalkozó adatfeldolgozók, adatfolyamok). Adatfeldolgozási megállapodás · Adatvédelem