Għat-timijiet tal-InfoSec u r-reviżuri tal-apps
Is-sigurtà f'Peel
Fil-qosor: il-kontenut tal-board jiġi encrypted fil-browser b'ċavetta li tinsab fil-fragment tal-link, għalhekk is-servers tagħna jaħżnu u jgħaddu ciphertext li ma jistgħux jaqraw. Hawn kif isir eżattament, u fejn huma l-limiti.
Sommarju
- It-test tal-karti, l-ismijiet, it-titli tal-boards, il-voti u l-istickers huma encrypted b'AES-256-GCM taħt ċavetta tal-board iġġenerata fil-browser. Iċ-ċavetta tivvjaġġa fil-fragment tal-URL (
#k=) u qatt ma tintbagħat lil server. - L-azzjonijiet tal-facilitator, il-header tal-board u s-snapshots huma ffirmati biċ-ċavetta Ed25519 tal-facilitator. L-ID tal-board huwa derivat minn dik iċ-ċavetta, għalhekk il-clients jindunaw b'sostituzzjoni taċ-ċavetta.
- Il-karti moħbija huma ssiġillati għall-facilitator (X25519 sealed box) saż-żvelar, u marbuta b'commitments bis-salt biex it-test żvelat ma jkunx jista' jinbidel.
- Anonimi b'default: l-operazzjonijiet ma jġorrux ID tal-awtur; il-voti u r-reazzjonijiet jużaw ID każwali għal kull board.
- Il-parteċipanti qatt ma jawtentikaw. L-ebda SDK tal-analytics, l-ebda reklam, l-ebda script ta' partijiet terzi ħlief Paddle.js fil-paġna tal-checkout.
- Cloudflare biss. Il-boards mhux mitluba jitħassru 60 jum wara l-aħħar żjara.
Kif tiċċirkola d-data
Il-fragment ta' URL (kull ma jiġi wara #) jiġi ġestit mill-browser u mhuwiex parti mit-talba HTTP. Peel ipoġġi ċ-ċavetta tal-board hemmhekk.
Mudell tat-theddid
Niddisinjaw b'mod li server kompletament kompromess jew kurjuż, inkluż aħna, jitgħallem l-inqas possibbli dwar x'jgħid tim.
X'nipproteġu
- It-test tal-karti, l-għażliet tal-GIFs u, fil-modalità b'ismijiet, l-isem tal-awtur.
- L-ismijiet u l-avatars tal-parteċipanti, l-isem tal-board u t-titli tat-templates personalizzati.
- Min ivvota jew irreaġixxa fuq xiex, u min kiteb liema karta.
- L-integrità tar-retro: il-passi, iż-żvelar u d-deċiżjonijiet tal-facilitator ma jistgħux jiġu ffalsifikati.
L-avversarji li nikkunsidraw
- Is-servers tagħna stess, insider malizzjuż, jew xi ħadd li jikser il-ħażna tagħna: jiksbu ciphertext u metadata.
- Attakkant fuq in-network: TLS kullimkien; iċ-ċavetta qatt ma taqsam in-network.
- Server li jibdel iċ-ċwievet: l-ID tal-board huwa derivat miċ-ċavetta pubblika tal-facilitator, u l-clients jivverifikaw il-header iffirmat.
- Parteċipant li jrid jitlalla' jew jiffalsifika: il-karti moħbija huma ssiġillati għall-facilitator; l-operazzjonijiet tal-facilitator jeħtieġu l-firma tal-facilitator; l-editjar tal-karti jeħtieġ iċ-ċavetta tal-karta.
- Facilitator li jerġa' jippubblika għal awtur offline: il-commitments iwaqqfuh milli jibdel it-test.
Barra mill-ambitu, b'onestà
- Kulmin għandu l-link tal-parteċipanti jista' jaqra l-board. Il-link huwa l-kontroll tal-aċċess. Aqsmu bl-istess attenzjoni li tagħti lill-board innifsu.
- Apparat kompromess, estensjoni malizzjuża tal-browser, jew xi ħadd li qed iħares minn fuq spallejk.
- Analiżi tat-traffiku: is-server jara l-ħinijiet, id-daqsijiet u n-numri (ara l-mappa tad-data).
- Denial of service mis-server: jista' jwaqqa' jew idewwem il-messaġġi, imma mhux jaqrahom jew jiffalsifikahom.
Kriptografija
Il-primittivi kollha ġejjin mill-API WebCrypto tal-browser. L-ebda kriptografija personalizzata, l-ebda librerija kriptografika ta' partijiet terzi.
| Ċavetta | Algoritmu | Użata għal |
|---|---|---|
| K_board | AES-256-GCM, IV każwali ta' 96 bit | Jagħmel encryption ta' kull operazzjoni, snapshot u aġġornament tal-preżenza. Id-data addizzjonali torbot l-ID tal-board, it-tip tal-operazzjoni u l-ID tal-operazzjoni, sabiex iċ-ciphertext ma jkunx jista' jerġa' jintuża f'board jew slot ieħor. Jinsab biss fil-fragment tal-link #k=. |
| K_owner | Ed25519 | L-awtorità tal-facilitator. Tiffirma l-operazzjonijiet tal-facilitator (pass, timer, spotlight, template, settings, il-ftuħ tal-voti, il-ħabi ta' karta), il-header tal-board u s-snapshots. Counter li dejjem jiżdied jimblokka r-replay. Tinsab biss fil-link tal-facilitator (&o=). |
| ID tal-board | SHA-256, l-ewwel 80 bit, base32 | Derivat miċ-ċavetta pubblika tal-facilitator, għalhekk l-ID innifsu jipprova liema ċavetta għandha l-board. Il-clients jirrifjutaw header li ċ-ċavetta tiegħu ma tagħtix l-ID meta ssirilha hash. |
| K_fac | X25519 sealed box: X25519 effimeru + HKDF-SHA256 + AES-256-GCM | Il-karti moħbija jiġu ssiġillati għaċ-ċavetta pubblika tal-facilitator waqt li n-nies jiktbu. Il-link tal-facilitator biss (&f=) jista' jiftaħhom. |
| Ċwievet tal-karti | Ed25519, ċavetta waħda għal kull karta | Jinżammu biss mill-awtur. L-editjar u ż-żvelar jiġu ffirmati biha: awtentiċità mingħajr identità. |
| Commitments | HMAC-SHA256 b'salt każwali ta' 128 bit | Karta moħbija tippubblika commitment għall-kontenut tagħha. Fiż-żvelar, il-kontenut u s-salt jiġu ppubblikati u kull client jivverifikahom, għalhekk ħadd ma jista' jibdel it-test. |
| Preżenza | AES-256-GCM taħt K_board | L-ismijiet, l-avatars u l-indikaturi tat-tajping huma encrypted bħal kull ħaġa oħra. |
| Bundle taċ-ċwievet | HKDF-SHA256 mill-PRF tal-passkey jew mill-kodiċi ta' rkupru, AES-256-GCM | Il-facilitators li jkunu dħlu fil-kont jistgħu jissinkronizzaw iċ-ċwievet tal-boards bejn apparati. Il-bundle jiġi encrypted fuq l-apparat; is-server jaħżen biss ciphertext u ċwievet imgeżwra. |
Il-messaġġi tal-firem huma separati skont id-dominju (pereżempju peel/sig/v1, peel/header/v1, peel/snap/v1) sabiex firma għal skop wieħed ma tkunx tista' terġa' tintuża għal skop ieħor.
Anonimità
- L-operazzjonijiet ma jġorrux ID tal-awtur. Is-server ma jistax jorbot karta ma' persuna, u b'default lanqas il-facilitator ma jista'.
- Il-voti u r-reazzjonijiet huma marbuta ma' ID każwali għal kull board li mhuwiex marbut ma' isem.
- L-indikaturi tat-tajping juru li xi ħadd qed jikteb, qatt x'qed jikteb.
- Il-modalità b'ismijiet hija setting espliċitu tal-board; f'dak il-każ, l-isem tal-awtur jivvjaġġa ġewwa l-karta encrypted.
- Il-parteċipanti qatt ma jidħlu f'kont, għalhekk m'hemm l-ebda kont x'jiġi korrelat.
Mappa tad-data
Kull ma nżommu, fejn jinsab, min jista' jaqrah u kemm jibqa'.
| Data | Fejn | Min jista' jaqraha | Miżmuma |
|---|---|---|---|
| Karti, voti, reazzjonijiet, stickers, azzjonijiet, isem il-board, titli ta' templates personalizzati | Ħażna tad-Durable Object, bħala ciphertext | Min għandu l-link tal-board | Sakemm jitħassar il-board |
| Envelope tal-operazzjoni: tip, sekwenza u ħin tas-server, daqs, counter tal-facilitator | Ħażna tad-Durable Object | Peel | Sakemm jitħassar il-board |
| Ismijiet tal-parteċipanti, avatars, tajping | Mgħoddija bħala ciphertext; miżmuma fil-memorja waqt il-konnessjoni | Min għandu l-link tal-board | Waqt il-konnessjoni |
| Status tal-board: pass, numru ta' parteċipanti u karti, ID tat-template mill-katalgu, flag tas-sakkar, ħinijiet tal-ħolqien u tal-iskadenza | Durable Object, D1; messaġġi ta' Slack/Teams jekk installati | Peel; il-channel tiegħek ta' Slack/Teams | Il-ħajja tal-board |
| Kont tal-facilitator: ID tal-provider, isem, email jekk kondiviża, providers marbuta, data tal-ħolqien, sessjoni | D1 | Peel | Sakemm tħassar il-kont |
| Bundle taċ-ċwievet u ċwievet imgeżwra | D1, bħala ciphertext | Int biss (passkey jew kodiċi ta' rkupru) | Sakemm tħassar il-kont |
| Pjan, status tal-abbonament, IDs tal-klijent u tal-abbonament ta' Paddle | D1; Paddle | Peel, Paddle | Kif teħtieġ il-liġi tat-taxxa |
| IDs tal-workspace, tal-channel u tal-messaġġi ta' Slack/Teams; token tal-bot (encrypted b'AES-GCM) | D1 | Peel | Sakemm titneħħa l-installazzjoni |
| Indirizz IP | Edge ta' Cloudflare, b'mod temporanju (konsenja, rate limits) | Cloudflare, ir-rate limiter ta' Peel | Mhux maħżun fid-databases tagħna |
| Counters ta' kuljum (boards maħluqa, passi milħuqa) | D1 | Peel | Aggregati biss, mingħajr identifikaturi |
X'jista' u x'ma jistax jagħmel is-server tagħna
Jista'
- Jara t-tipi tal-operazzjonijiet, id-daqsijiet, il-ħinijiet, il-pass, in-numru ta' parteċipanti u karti, l-ID tat-template mill-katalgu u l-flag tas-sakkar.
- Iwaqqa', idewwem jew jirrifjuta li jwassal operazzjonijiet (denial of service).
- Jara l-indirizzi IP fil-edge tan-network.
- Jgħodd il-boards u l-passi milħuqa, b'mod aggregat.
- Iħassar board (skadenza, rapporti ta' abbuż).
Ma jistax
- Jaqra t-test tal-karti, l-ismijiet, it-titli tal-boards, it-titli tat-templates personalizzati, il-voti jew l-istickers.
- Jaqra l-karti moħbija qabel iż-żvelar (lanqas wara).
- Jiffalsifika azzjonijiet tal-facilitator: jeħtieġu l-firma tal-facilitator.
- Ipoġġi ċ-ċwievet tiegħu minflok: l-ID tal-board jikxfu.
- Jibdel it-test żvelat ta' karta: il-commitments u l-firem tal-karti jikxfuh.
- Jgħid min kiteb liema karta.
Bħal kull web app, qed tafda l-kodiċi li nservu. Inżommu dik is-superfiċje żgħira: Content Security Policy stretta, script-src limitat għall-oriġini tagħna, l-ebda script ta' partijiet terzi, u l-protokoll huwa miftuħ għal reviżjoni fuq talba.
Slack u Microsoft Teams
- Il-messaġġi jġorru l-link tal-board u metadata (titlu, pass, numri). It-test tal-karti jintbagħat biss meta l-facilitator jibgħat sommarju u jikkonfermah.
- Il-karta Join fiha l-link tal-parteċipanti, li jinkludi ċ-ċavetta. Kulmin jista' jaqra dak il-channel jista' jingħaqad, eżatt bħallikieku twaħħal link hemmhekk.
- Il-previews tal-links (unfurls) juru biss il-pass u n-numri, qatt il-kontenut.
- Scopes ta' Slack:
commands,chat:write,links:read,links:write;users:readbiss meta tim jixgħel il-mentions. - It-tokens tal-bots huma encrypted meta maħżuna (AES-GCM, iċ-ċavetta tinżamm bħala secret tal-Worker). Il-firem tat-talbiet ta' Slack u t-tokens tal-Bot Framework jiġu vverifikati f'kull talba.
- Meta titneħħa l-app, jieqaf kull messaġġ u t-tokens tagħha jitħassru.
Web u infrastruttura
- Cloudflare biss: Pages, Workers, Durable Objects, D1, R2 u KV fuq il-kont ta' 1801 Labs. L-ebda server ieħor.
- TLS kullimkien, HSTS, u Content Security Policy stretta.
- L-ebda SDK tal-analytics, l-ebda reklam, l-ebda script ta' partijiet terzi. L-unika eċċezzjoni hija Paddle.js, li jitgħabba biss fil-paġna tal-checkout.
- Cookie waħda, għall-facilitators li jkunu dħlu fil-kont biss:
peel_session, httpOnly, Secure, SameSite=Lax. - It-tfittxija tal-GIFs u l-midja jgħaddu mill-API tagħna, għalhekk l-indirizzi IP tal-parteċipanti qatt ma jaslu għand GIPHY.
- Il-fonts u l-assets huma self-hosted. L-ebda font minn CDN, l-ebda tracking pixel.
- Rate limits għal kull IP u għal kull board; rapporti ta' abbuż u sakkar mill-facilitator.
Kontijiet u żamma tad-data
- Il-parteċipanti qatt ma jawtentikaw. Il-facilitators jidħlu b'Google (jew b'Entra ID permezz ta' Teams) biss biex iżommu l-boards jew jużaw features bi ħlas.
- Kont jaħżen ID, l-isem u l-email mingħand il-provider, u bundle ta' ċwievet encrypted li jinfetaħ b'passkey (WebAuthn PRF) jew b'kodiċi ta' rkupru. Id-dħul fil-kont jagħti s-sjieda, mhux aċċess għall-kontenut.
- Meta jintalab board, is-sjieda tiġi ppruvata b'firma tal-facilitator. Iċ-ċwievet tal-board qatt ma jintbagħtu.
- Il-boards mingħajr kont jitħassru 60 jum wara l-aħħar żjara; kull żjara terġa' tibda l-għadd. L-alarms tad-Durable Objects iħassru l-ħażna.
- It-tħassir tal-kont iħassar is-sessjonijiet, il-bundle taċ-ċwievet u l-librerija tiegħek, u jerġa' jagħti lill-boards tiegħek l-iskadenza ta' 60 jum.
Żvelar responsabbli
Sibt xi ħaġa? Għidilna l-ewwel u naħdmu miegħek. Nikkonfermaw ir-rapporti fi żmien tlett ijiem tax-xogħol.
- Jekk jogħġbok agħtina żmien raġonevoli (l-għan tagħna huwa 90 jum) biex nirranġaw qabel ma tiżvela.
- Ittestja bil-boards u l-kontijiet tiegħek. Taċċessax data ta' ħaddieħor u tnaqqasx il-kwalità tas-servizz.
- Ma nieħdux azzjoni legali għal riċerka in bona fede li ssegwi dawn ir-regoli.
- Kuntatt li jinqara mill-magni:
/.well-known/security.txt.
Il-klijenti tal-pjan Kumpanija jieħdu pakkett għar-reviżjoni tas-sigurtà (tweġibiet għall-kwestjonarji, sub-proċessuri, flussi tad-data). DPA · Privatezza