InfoSec komandoms ir programėlių vertintojams
Saugumas Peel
Trumpai: lentos turinys šifruojamas naršyklėje raktu, kuris yra nuorodos fragmente, todėl mūsų serveriai saugo ir perduoda šifruotus duomenis, kurių negali perskaityti. Toliau – kaip tiksliai tai veikia ir kur yra ribos.
Santrauka
- Kortelių tekstas, vardai, lentų pavadinimai, balsai ir lipdukai šifruojami AES-256-GCM su lentos raktu, sugeneruotu naršyklėje. Raktas keliauja URL fragmente (
#k=) ir niekada nesiunčiamas į serverį. - Fasilitatoriaus veiksmai, lentos antraštė ir momentinės kopijos pasirašomi fasilitatoriaus Ed25519 raktu. Lentos ID išvedamas iš šio rakto, todėl klientai aptinka rakto pakeitimą.
- Paslėptos kortelės iki atskleidimo užantspauduotos fasilitatoriui (X25519 sealed box) ir susietos įsipareigojimais su druska, todėl atskleisto teksto sukeisti neįmanoma.
- Pagal numatymą anonimiška: operacijose nėra autoriaus ID; balsams ir reakcijoms naudojamas atsitiktinis, kiekvienai lentai atskiras ID.
- Dalyviai niekada neautentifikuojami. Jokių analitikos SDK, jokių reklamų, jokių trečiųjų šalių scenarijų, išskyrus Paddle.js apmokėjimo puslapyje.
- Tik Cloudflare. Neperimtos lentos ištrinamos praėjus 60 dienų nuo paskutinio apsilankymo.
Kaip keliauja duomenys
URL fragmentą (viską po #) apdoroja naršyklė, ir jis nėra HTTP užklausos dalis. Būtent ten Peel įdeda lentos raktą.
Grėsmių modelis
Projektuojame taip, kad visiškai pažeistas ar smalsus serveris, įskaitant mus pačius, sužinotų kuo mažiau apie tai, ką sako komanda.
Ką saugome
- Kortelių tekstas, GIF pasirinkimai ir, režimu su vardais, autoriaus vardas.
- Dalyvių vardai ir avatarai, lentos pavadinimas ir savų šablonų pavadinimai.
- Kas už ką balsavo ar reagavo ir kas parašė kurią kortelę.
- Retro vientisumas: etapų, atskleidimų ir fasilitatoriaus sprendimų suklastoti neįmanoma.
Kokius priešininkus vertiname
- Mūsų pačių serveriai, piktavalis vidinis darbuotojas ar kas nors, įsilaužęs į mūsų saugyklą: jie gauna šifruotus duomenis ir metaduomenis.
- Tinklo užpuolikas: TLS visur; raktas niekada nekeliauja tinklu.
- Raktus keičiantis serveris: lentos ID išvedamas iš fasilitatoriaus viešojo rakto, o klientai tikrina pasirašytą antraštę.
- Dalyvis, norintis žvilgtelėti ar klastoti: paslėptos kortelės užantspauduotos fasilitatoriui; fasilitatoriaus operacijoms reikia fasilitatoriaus parašo; kortelių redagavimui – kortelės rakto.
- Fasilitatorius, iš naujo skelbiantis už neprisijungusį autorių: įsipareigojimai neleidžia pakeisti teksto.
Atvirai: kas nepatenka į apimtį
- Kiekvienas, turintis dalyvio nuorodą, gali skaityti lentą. Nuoroda ir yra prieigos kontrolė. Dalykis ja taip pat atsakingai, kaip pačia lenta.
- Pažeistas įrenginys, kenkėjiškas naršyklės plėtinys ar kas nors, žiūrintis tau per petį.
- Srauto analizė: serveris mato laiką, dydžius ir skaičius (žr. duomenų žemėlapį).
- Serverio vykdomas paslaugos trikdymas: jis gali atmesti ar uždelsti žinutes, bet ne jas perskaityti ar suklastoti.
Kriptografija
Visi primityvai paimti iš naršyklės WebCrypto API. Jokios savadarbės kriptografijos, jokių trečiųjų šalių kriptografijos bibliotekų.
| Raktas | Algoritmas | Paskirtis |
|---|---|---|
| K_board | AES-256-GCM, 96 bitų atsitiktinis IV | Šifruoja kiekvieną operaciją, momentinę kopiją ir buvimo atnaujinimą. Papildomi duomenys susieja lentos ID, operacijos tipą ir operacijos ID, todėl šifruotų duomenų negalima pakartotinai panaudoti kitoje lentoje ar vietoje. Saugomas tik nuorodos fragmente #k=. |
| K_owner | Ed25519 | Fasilitatoriaus įgaliojimai. Juo pasirašomos fasilitatoriaus operacijos (etapas, laikmatis, dėmesio centras, šablonas, nustatymai, balsų atvėrimas, kortelės slėpimas), lentos antraštė ir momentinės kopijos. Griežtai didėjantis skaitiklis užkerta kelią pakartojimo atakoms. Yra tik fasilitatoriaus nuorodoje (&o=). |
| Lentos ID | SHA-256, pirmi 80 bitų, base32 | Išvedamas iš fasilitatoriaus viešojo rakto, todėl pats ID įrodo, kuriam raktui priklauso lenta. Klientai atmeta antraštę, kurios rakto maiša nesutampa su ID. |
| K_fac | X25519 sealed box: vienkartinis X25519 + HKDF-SHA256 + AES-256-GCM | Kol žmonės rašo, paslėptos kortelės užantspauduojamos fasilitatoriaus viešuoju raktu. Atidaryti jas gali tik fasilitatoriaus nuoroda (&f=). |
| Kortelių raktai | Ed25519, atskiras raktas kiekvienai kortelei | Juos turi tik autorius. Jais pasirašomi redagavimai ir atskleidimas: autentiškumas be tapatybės. |
| Įsipareigojimai (commitments) | HMAC-SHA256 su 128 bitų atsitiktine druska | Paslėpta kortelė paskelbia įsipareigojimą savo turiniui. Atskleidimo metu paskelbiami turinys ir druska, o kiekvienas klientas juos patikrina, todėl niekas negali sukeisti teksto. |
| Buvimas (presence) | AES-256-GCM su K_board | Vardai, avatarai ir rašymo indikatoriai šifruojami kaip ir visa kita. |
| Raktų paketas | HKDF-SHA256 iš prieigos rakto PRF arba atkūrimo kodo, AES-256-GCM | Prisijungę fasilitatoriai gali sinchronizuoti lentų raktus tarp įrenginių. Paketas šifruojamas įrenginyje; serveris saugo tik šifruotus duomenis ir apgaubtus (wrapped) raktus. |
Pasirašomi pranešimai atskirti pagal sritį (pvz., peel/sig/v1, peel/header/v1, peel/snap/v1), todėl vienai paskirčiai skirto parašo negalima panaudoti kitai.
Anonimiškumas
- Operacijose nėra autoriaus ID. Serveris negali susieti kortelės su žmogumi, o pagal numatymą – ir fasilitatorius.
- Balsai ir reakcijos susiejami su atsitiktiniu, kiekvienai lentai atskiru ID, kuris nesusietas su vardu.
- Rašymo indikatoriai rodo, kad kažkas rašo, bet niekada – ką.
- Režimas su vardais yra aiškus lentos nustatymas; tada autoriaus vardas keliauja šifruotos kortelės viduje.
- Dalyviai niekada neprisijungia, todėl nėra paskyros, pagal kurią būtų galima susieti duomenis.
Duomenų žemėlapis
Viskas, ką saugome: kur tai laikoma, kas gali perskaityti ir kiek laiko saugoma.
| Duomenys | Kur | Kas gali perskaityti | Saugoma |
|---|---|---|---|
| Kortelės, balsai, reakcijos, lipdukai, veiksmai, lentos pavadinimas, savų šablonų pavadinimai | Durable Object saugykla, šifruotai | Lentos nuorodą turintys žmonės | Kol lenta ištrinama |
| Operacijos vokas: tipas, serverio eilės numeris ir laikas, dydis, fasilitatoriaus skaitiklis | Durable Object saugykla | Peel | Kol lenta ištrinama |
| Dalyvių vardai, avatarai, rašymo būsena | Perduodama šifruotai; laikoma atmintyje, kol prisijungta | Lentos nuorodą turintys žmonės | Kol prisijungta |
| Lentos būsena: etapas, dalyvių ir kortelių skaičius, katalogo šablono ID, užrakinimo žyma, sukūrimo ir galiojimo pabaigos laikas | Durable Object, D1; Slack/Teams žinutės, jei įdiegta | Peel; tavo Slack/Teams kanalas | Visą lentos gyvavimo laiką |
| Fasilitatoriaus paskyra: teikėjo ID, vardas, el. paštas (jei pateiktas), susieti teikėjai, sukūrimo data, sesija | D1 | Peel | Kol ištrinsi paskyrą |
| Raktų paketas ir apgaubti raktai | D1, šifruotai | Tik tu (prieigos raktas arba atkūrimo kodas) | Kol ištrinsi paskyrą |
| Planas, prenumeratos būsena, Paddle kliento ir prenumeratos ID | D1; Paddle | Peel, Paddle | Kiek reikalauja mokesčių įstatymai |
| Slack/Teams darbo erdvės, kanalo ir žinučių ID; boto prieigos raktas (šifruotas AES-GCM) | D1 | Peel | Kol pašalinama |
| IP adresas | Cloudflare tinklo kraštas, laikinai (pristatymas, užklausų ribojimas) | Cloudflare, Peel užklausų ribotuvas | Mūsų duomenų bazėse nesaugomas |
| Dienos skaitikliai (sukurtos lentos, pasiekti etapai) | D1 | Peel | Tik suvestiniai, be identifikatorių |
Ką mūsų serveris gali ir ko negali
Jis gali
- Matyti operacijų tipus, dydžius, laiką, etapą, dalyvių ir kortelių skaičių, katalogo šablono ID ir užrakinimo žymą.
- Atmesti, uždelsti arba atsisakyti pristatyti operacijas (paslaugos trikdymas).
- Matyti IP adresus tinklo krašte.
- Skaičiuoti lentas ir pasiektus etapus, tik suvestiniu būdu.
- Ištrinti lentą (pasibaigus galiojimui, gavus pranešimą apie piktnaudžiavimą).
Jis negali
- Perskaityti kortelių tekstą, vardus, lentų pavadinimus, savų šablonų pavadinimus, balsus ar lipdukus.
- Perskaityti paslėptas korteles prieš atskleidimą (nei po jo).
- Suklastoti fasilitatoriaus veiksmų: jiems reikia fasilitatoriaus parašo.
- Pakeisti raktų savais: tai išduotų lentos ID.
- Pakeisti atskleistos kortelės teksto: tai išduotų įsipareigojimai ir kortelių parašai.
- Nustatyti, kas parašė kurią kortelę.
Kaip ir su bet kuria interneto programa, tenka pasitikėti mūsų pateikiamu kodu. Šią sritį laikome kuo mažesnę: griežta turinio saugumo politika (CSP), script-src apribotas mūsų pačių kilme, jokių trečiųjų šalių scenarijų, o protokolą gali peržiūrėti paprašius.
Slack ir Microsoft Teams
- Žinutėse perduodama lentos nuoroda ir metaduomenys (pavadinimas, etapas, skaičiai). Kortelių tekstas siunčiamas tik tada, kai fasilitatorius paskelbia santrauką ir tai patvirtina.
- Kortelėje „Prisijungti“ yra dalyvio nuoroda su raktu. Prisijungti gali kiekvienas, kas mato tą kanalą – lygiai taip pat, kaip įklijavus ten nuorodą.
- Nuorodų peržiūrose rodomas tik etapas ir skaičiai, niekada – turinys.
- Slack leidimai:
commands,chat:write,links:read,links:write;users:read– tik kai komanda įjungia paminėjimus. - Botų prieigos raktai saugomi šifruoti (AES-GCM, raktas laikomas kaip Worker paslaptis). Slack užklausų parašai ir Bot Framework prieigos raktai tikrinami kiekvienoje užklausoje.
- Pašalinus programėlę, visi skelbimai sustabdomi, o jos prieigos raktai ištrinami.
Žiniatinklis ir infrastruktūra
- Tik Cloudflare: Pages, Workers, Durable Objects, D1, R2 ir KV 1801 Labs paskyroje. Jokių kitų serverių.
- TLS visur, HSTS ir griežta turinio saugumo politika (CSP).
- Jokių analitikos SDK, jokių reklamų, jokių trečiųjų šalių scenarijų. Vienintelė išimtis – Paddle.js, įkeliamas tik apmokėjimo puslapyje.
- Vienas slapukas, tik prisijungusiems fasilitatoriams:
peel_session, httpOnly, Secure, SameSite=Lax. - GIF paieška ir medija keliauja per mūsų API, todėl dalyvių IP adresai niekada nepasiekia GIPHY.
- Šriftai ir ištekliai talpinami pas mus. Jokių CDN šriftų, jokių sekimo pikselių.
- Užklausų ribojimas pagal IP ir pagal lentą; pranešimai apie piktnaudžiavimą ir fasilitatoriaus užraktas.
Paskyros ir duomenų saugojimas
- Dalyviai niekada neautentifikuojami. Fasilitatoriai prisijungia su Google (arba Entra ID per Teams) tik tam, kad išsaugotų lentas ar naudotųsi mokamomis funkcijomis.
- Paskyroje saugomas ID, vardas ir el. pašto adresas iš tapatybės teikėjo bei šifruotas raktų paketas, atrakinamas prieigos raktu (WebAuthn PRF) arba atkūrimo kodu. Prisijungimas suteikia nuosavybę, bet ne prieigą prie turinio.
- Perimant lentą nuosavybė įrodoma fasilitatoriaus parašu. Lentų raktai niekada nesiunčiami.
- Lentos be paskyros ištrinamos praėjus 60 dienų nuo paskutinio apsilankymo; kiekvienas apsilankymas atskaitą pradeda iš naujo. Saugyklą ištrina Durable Object signalai (alarms).
- Ištrynus paskyrą, ištrinamos sesijos, raktų paketas ir tavo biblioteka, o lentoms vėl taikomas 60 dienų galiojimas.
Atsakingas pažeidžiamumų atskleidimas
Radai ką nors? Pirmiausia pranešk mums, ir dirbsime kartu. Pranešimų gavimą patvirtiname per tris darbo dienas.
- Prašome skirti pagrįstą laiką (siekiame 90 dienų) pataisymui prieš viešinant informaciją.
- Testuok su savo lentomis ir paskyromis. Nesinaudok kitų žmonių duomenimis ir netrikdyk paslaugos veikimo.
- Nesiimsime teisinių veiksmų dėl sąžiningų tyrimų, kurie atitinka šias taisykles.
- Mašinai skaitomas kontaktas:
/.well-known/security.txt.
Įmonės plano klientai gauna saugumo vertinimo paketą (klausimyno atsakymai, subtvarkytojai, duomenų srautai). DPA · Privatumas