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.
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.
| Kulcs | Algoritmus | Mire használjuk |
|---|---|---|
| K_board | AES-256-GCM, 96 bites véletlen IV | Minden 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_owner | Ed25519 | A 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, base32 | A 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_fac | X25519 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ártyakulcsok | Ed25519, kártyánként egy kulcs | Csak a szerzőnél van. A szerkesztéseket és a felfedést ezzel írja alá: hitelesség személyazonosság nélkül. |
| Commitmentek | HMAC-SHA256, 128 bites véletlen sóval | A 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ét | AES-256-GCM, K_board kulccsal | A nevek, az avatarok és a gépelésjelzők ugyanúgy titkosítva vannak, mint minden más. |
| Kulcscsomag | HKDF-SHA256 azonosítókulcs-PRF-ből vagy helyreállítási kódból, AES-256-GCM | A 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.
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.
| Adat | Hol | Ki olvashatja | Meddig |
|---|---|---|---|
| Kártyák, szavazatok, reakciók, matricák, teendők, a tábla neve, egyéni sablonok címei | Durable Object tárhely, titkosítva | Akiknél ott a tábla linkje | Amí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árhely | Peel | Amíg a táblát nem törlik |
| Résztvevők nevei, avatarjai, gépelésjelzés | Titkosítva továbbítva; csatlakozás közben a memóriában | Akiknél ott a tábla linkje | Csatlakozá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-üzenetek | Peel; a Slack-/Teams-csatornád | A 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, munkamenet | D1 | Peel | Amíg nem törlöd a fiókot |
| Kulcscsomag és becsomagolt kulcsok | D1, titkosítva | Csak 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ók | D1; Paddle | Peel, Paddle | Ameddig az adójogszabályok előírják |
| Slack-/Teams-munkaterület-, csatorna- és üzenetazonosítók; bot token (AES-GCM-mel titkosítva) | D1 | Peel | Az eltávolításig |
| IP-cím | Cloudflare edge, átmenetileg (kézbesítés, sebességkorlát) | Cloudflare, a Peel sebességkorlátozója | Nem tároljuk az adatbázisainkban |
| Napi számlálók (létrehozott táblák, elért lépések) | D1 | Peel | Csak ö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:readcsak 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.
- 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