Tietoturvatiimeille ja sovellusten arvioijille
Tietoturva Peelissä
Lyhyesti: taulun sisältö salataan selaimessa avaimella, joka on linkin fragmenttiosassa, joten palvelimemme tallentavat ja välittävät salattua dataa, jota ne eivät pysty lukemaan. Tässä tarkalleen miten, ja missä rajat kulkevat.
Yhteenveto
- Korttien tekstit, nimet, taulujen otsikot, äänet ja tarrat salataan AES-256-GCM:llä selaimessa luodulla taulun avaimella. Avain kulkee URL-fragmentissa (
#k=) eikä sitä koskaan lähetetä palvelimelle. - Fasilitaattorin toiminnot, taulun otsake ja tilannevedokset allekirjoitetaan fasilitaattorin Ed25519-avaimella. Taulun tunnus johdetaan tästä avaimesta, joten asiakasohjelmat huomaavat avaimen vaihtamisen.
- Piilotetut kortit on sinetöity fasilitaattorille (X25519 sealed box) paljastukseen asti, ja ne on sidottu suolattuihin sitoumuksiin, joten paljastettua tekstiä ei voi vaihtaa.
- Oletuksena anonyymi: operaatioissa ei ole kirjoittajan tunnusta; äänet ja reaktiot käyttävät taulukohtaista satunnaista tunnusta.
- Osallistujat eivät koskaan tunnistaudu. Ei analytiikka-SDK:ita, ei mainoksia, ei kolmansien osapuolten skriptejä Paddle.js:ää lukuun ottamatta kassasivulla.
- Vain Cloudflare. Lunastamattomat taulut poistetaan 60 päivää viimeisen käynnin jälkeen.
Miten data kulkee
URL-osoitteen fragmentti (kaikki #-merkin jälkeen) käsitellään selaimessa, eikä se ole osa HTTP-pyyntöä. Peel sijoittaa taulun avaimen sinne.
Uhkamalli
Suunnittelemme niin, että täysin murrettu tai utelias palvelin, me mukaan lukien, saa tietää mahdollisimman vähän siitä, mitä tiimi sanoo.
Mitä suojaamme
- Korttien tekstit, GIF-valinnat ja nimellisessä tilassa kirjoittajan nimen.
- Osallistujien nimet ja avatarit, taulun nimen ja omien pohjien otsikot.
- Kuka äänesti tai reagoi mihinkin, ja kuka kirjoitti minkäkin kortin.
- Retron eheyden: vaiheita, paljastuksia ja fasilitaattorin päätöksiä ei voi väärentää.
Huomioimamme hyökkääjät
- Omat palvelimemme, pahantahtoinen sisäpiiriläinen tai joku, joka murtautuu tallennustilaamme: he saavat salattua dataa ja metatietoa.
- Verkkohyökkääjä: TLS kaikkialla; avain ei koskaan kulje verkon yli.
- Palvelin, joka vaihtaa avaimia: taulun tunnus johdetaan fasilitaattorin julkisesta avaimesta, ja asiakasohjelmat tarkistavat allekirjoitetun otsakkeen.
- Osallistuja, joka haluaa kurkkia tai väärentää: piilotetut kortit on sinetöity fasilitaattorille; fasilitaattorin operaatiot vaativat fasilitaattorin allekirjoituksen; korttien muokkaukset vaativat kortin avaimen.
- Fasilitaattori, joka julkaisee kortin offline-tilassa olevan kirjoittajan puolesta: sitoumukset estävät tekstin muuttamisen.
Rehellisesti: rajauksen ulkopuolella
- Kuka tahansa, jolla on osallistujan linkki, voi lukea taulun. Linkki on pääsynhallinta. Jaa sitä kuin itse taulua.
- Murrettu laite, haitallinen selainlaajennus tai joku, joka kurkkii olkasi yli.
- Liikenneanalyysi: palvelin näkee ajoitukset, koot ja määrät (katso tietokartta).
- Palvelimen aiheuttama palvelunesto: se voi pudottaa tai viivästyttää viestejä, mutta ei lukea tai väärentää niitä.
Kryptografia
Kaikki primitiivit tulevat selaimen WebCrypto-rajapinnasta. Ei itse tehtyä kryptografiaa, ei kolmansien osapuolten kryptokirjastoja.
| Avain | Algoritmi | Käyttötarkoitus |
|---|---|---|
| K_board | AES-256-GCM, 96-bittinen satunnainen IV | Salaa jokaisen operaation, tilannevedoksen ja läsnäolopäivityksen. Lisädata sitoo taulun tunnuksen, operaation tyypin ja operaation tunnuksen, joten salattua dataa ei voi toistaa toiseen tauluun tai paikkaan. Sijaitsee vain linkin fragmentissa #k=. |
| K_owner | Ed25519 | Fasilitaattorin valtuudet. Allekirjoittaa fasilitaattorin operaatiot (vaihe, ajastin, valokeila, pohja, asetukset, äänten avaaminen, kortin piilottaminen), taulun otsakkeen ja tilannevedokset. Aidosti kasvava laskuri estää toistohyökkäykset. Vain fasilitaattorin linkissä (&o=). |
| Taulun tunnus | SHA-256, ensimmäiset 80 bittiä, base32 | Johdetaan fasilitaattorin julkisesta avaimesta, joten tunnus itsessään todistaa, mikä avain omistaa taulun. Asiakasohjelmat hylkäävät otsakkeen, jonka avaimen tiiviste ei vastaa tunnusta. |
| K_fac | X25519 sealed box: kertakäyttöinen X25519 + HKDF-SHA256 + AES-256-GCM | Piilotetut kortit sinetöidään fasilitaattorin julkiselle avaimelle kirjoittamisen ajaksi. Vain fasilitaattorin linkki (&f=) voi avata ne. |
| Korttiavaimet | Ed25519, yksi avain korttia kohden | Vain kirjoittajan hallussa. Muokkaukset ja paljastus allekirjoitetaan sillä: aitous ilman henkilöllisyyttä. |
| Sitoumukset | HMAC-SHA256 128-bittisellä satunnaisella suolalla | Piilotettu kortti julkaisee sitoumuksen sisällöstään. Paljastuksessa sisältö ja suola julkaistaan, ja jokainen asiakasohjelma tarkistaa ne, joten kukaan ei voi vaihtaa tekstiä. |
| Läsnäolo | AES-256-GCM avaimella K_board | Nimet, avatarit ja kirjoitusilmaisimet salataan kuten kaikki muukin. |
| Avainpaketti | HKDF-SHA256 pääsyavaimen PRF:stä tai palautuskoodista, AES-256-GCM | Kirjautuneet fasilitaattorit voivat synkronoida taulujen avaimet laitteiden välillä. Paketti salataan laitteella; palvelin tallentaa vain salattua dataa ja käärittyjä avaimia. |
Allekirjoitettavat viestit on erotettu käyttötarkoituksen mukaan (esimerkiksi peel/sig/v1, peel/header/v1, peel/snap/v1), joten yhteen tarkoitukseen tehtyä allekirjoitusta ei voi käyttää toiseen.
Anonymiteetti
- Operaatioissa ei ole kirjoittajan tunnusta. Palvelin ei pysty yhdistämään korttia henkilöön, eikä oletuksena myöskään fasilitaattori.
- Äänet ja reaktiot yksilöidään taulukohtaisella satunnaisella tunnuksella, jota ei ole liitetty nimeen.
- Kirjoitusilmaisimet kertovat, että joku kirjoittaa, eivät koskaan mitä.
- Nimellinen tila on taulun erillinen asetus; silloin kirjoittajan nimi kulkee salatun kortin sisällä.
- Osallistujat eivät koskaan kirjaudu, joten yhdistettävää tiliä ei ole.
Tietokartta
Kaikki, mitä säilytämme, missä se on, kuka voi lukea sen ja kuinka kauan se säilyy.
| Tieto | Sijainti | Kuka voi lukea | Säilytys |
|---|---|---|---|
| Kortit, äänet, reaktiot, tarrat, toimenpiteet, taulun nimi, omien pohjien otsikot | Durable Object -tallennustila, salattuna | Henkilöt, joilla on taulun linkki | Kunnes taulu poistetaan |
| Operaation kuori: tyyppi, palvelimen järjestysnumero ja aika, koko, fasilitaattorin laskuri | Durable Object -tallennustila | Peel | Kunnes taulu poistetaan |
| Osallistujien nimet, avatarit, kirjoitustila | Välitetään salattuna; pidetään muistissa yhteyden ajan | Henkilöt, joilla on taulun linkki | Yhteyden ajan |
| Taulun tila: vaihe, osallistujien ja korttien määrät, katalogin pohjan tunnus, lukitusmerkintä, luonti- ja vanhenemisajat | Durable Object, D1; Slack-/Teams-viestit, jos asennettu | Peel; Slack-/Teams-kanavasi | Taulun elinkaaren ajan |
| Fasilitaattorin tili: palveluntarjoajan tunnus, nimi, sähköposti (jos jaettu), liitetyt palveluntarjoajat, luontipäivä, istunto | D1 | Peel | Kunnes poistat tilin |
| Avainpaketti ja käärityt avaimet | D1, salattuna | Vain sinä (pääsyavain tai palautuskoodi) | Kunnes poistat tilin |
| Tilaus, tilauksen tila, Paddlen asiakas- ja tilaustunnukset | D1; Paddle | Peel, Paddle | Verolainsäädännön edellyttämän ajan |
| Slack-/Teams-työtilan, kanavan ja viestien tunnukset; bottitunniste (AES-GCM-salattu) | D1 | Peel | Kunnes sovellus poistetaan |
| IP-osoite | Cloudflaren reunaverkko, tilapäisesti (toimitus, käyttörajat) | Cloudflare, Peelin käyttörajoitin | Ei tallenneta tietokantoihimme |
| Päivittäiset laskurit (luodut taulut, saavutetut vaiheet) | D1 | Peel | Vain koostetasolla, ei tunnisteita |
Mitä palvelimemme voi ja ei voi tehdä
Se voi
- Nähdä operaatioiden tyypit, koot ja ajoitukset, vaiheen, osallistujien ja korttien määrät, katalogin pohjan tunnuksen ja lukitusmerkinnän.
- Pudottaa, viivästyttää tai jättää toimittamatta operaatioita (palvelunesto).
- Nähdä IP-osoitteet verkon reunalla.
- Laskea tauluja ja saavutettuja vaiheita koostetasolla.
- Poistaa taulun (vanheneminen, väärinkäyttöilmoitukset).
Se ei voi
- Lukea korttien tekstejä, nimiä, taulujen otsikoita, omien pohjien otsikoita, ääniä tai tarroja.
- Lukea piilotettuja kortteja ennen paljastusta (eikä edes sen jälkeen).
- Väärentää fasilitaattorin toimintoja: ne vaativat fasilitaattorin allekirjoituksen.
- Vaihtaa tilalle omia avaimiaan: taulun tunnus paljastaa sen.
- Muuttaa kortin paljastettua tekstiä: sitoumukset ja korttien allekirjoitukset paljastavat sen.
- Tietää, kuka kirjoitti minkäkin kortin.
Kuten minkä tahansa verkkosovelluksen kohdalla, luotat koodiin, jonka tarjoilemme. Pidämme sen pinnan pienenä: tiukka Content Security Policy, script-src rajattu omaan alkuperäämme, ei kolmansien osapuolten skriptejä, ja protokolla on pyynnöstä avoin arvioitavaksi.
Slack ja Microsoft Teams
- Viestit sisältävät taulun linkin ja metatietoa (otsikko, vaihe, määrät). Korttien teksti lähetetään vain, kun fasilitaattori lähettää yhteenvedon ja vahvistaa sen.
- Liity-kortissa on osallistujan linkki, joka sisältää avaimen. Kuka tahansa kanavaa lukeva voi liittyä, aivan kuin linkki olisi liitetty sinne.
- Linkkien esikatselut näyttävät vain vaiheen ja määrät, eivät koskaan sisältöä.
- Slack-oikeudet:
commands,chat:write,links:read,links:write;users:readvain, jos tiimi ottaa maininnat käyttöön. - Bottitunnisteet on salattu levossa (AES-GCM, avain Workerin salaisuutena). Slackin pyyntöallekirjoitukset ja Bot Frameworkin tunnisteet tarkistetaan jokaisessa pyynnössä.
- Sovelluksen poistaminen lopettaa kaiken viestien lähettämisen ja poistaa sen tunnisteet.
Verkko ja infrastruktuuri
- Vain Cloudflare: Pages, Workers, Durable Objects, D1, R2 ja KV 1801 Labsin tilillä. Ei muita palvelimia.
- TLS kaikkialla, HSTS ja tiukka Content Security Policy.
- Ei analytiikka-SDK:ita, ei mainoksia, ei kolmansien osapuolten skriptejä. Ainoa poikkeus on Paddle.js, joka ladataan vain kassasivulla.
- Yksi eväste, vain kirjautuneille fasilitaattoreille:
peel_session, httpOnly, Secure, SameSite=Lax. - GIF-haku ja media kulkevat rajapintamme kautta, joten osallistujien IP-osoitteet eivät koskaan päädy GIPHYlle.
- Fontit ja tiedostot ovat omalla palvelimellamme. Ei CDN-fontteja, ei seurantapikseleitä.
- Käyttörajat IP-osoitetta ja taulua kohden; väärinkäyttöilmoitukset ja fasilitaattorin lukitus.
Tilit ja säilytys
- Osallistujat eivät koskaan tunnistaudu. Fasilitaattorit kirjautuvat Googlella (tai Entra ID:llä Teamsin kautta) vain säilyttääkseen tauluja tai käyttääkseen maksullisia ominaisuuksia.
- Tilille tallennetaan tunnus, palveluntarjoajalta saatu nimi ja sähköposti sekä salattu avainpaketti, jonka lukitus avataan pääsyavaimella (WebAuthn PRF) tai palautuskoodilla. Kirjautuminen antaa omistajuuden, ei pääsyä sisältöön.
- Taulun lunastaminen todistaa omistajuuden fasilitaattorin allekirjoituksella. Taulujen avaimia ei koskaan lähetetä.
- Ilman tiliä luodut taulut poistetaan 60 päivää viimeisen käynnin jälkeen; jokainen käynti nollaa laskurin. Durable Objectin hälytykset poistavat tallennustilan.
- Tilin poistaminen poistaa istunnot, avainpaketin ja kirjastosi, ja tauluillesi palautuu 60 päivän vanhenemisaika.
Vastuullinen haavoittuvuuksien ilmoittaminen
Löysitkö jotain? Kerro ensin meille, niin teemme yhteistyötä. Kuittaamme ilmoitukset kolmen arkipäivän kuluessa.
- Annathan meille kohtuullisesti aikaa (tavoitteemme on 90 päivää) korjata ongelma ennen julkistamista.
- Testaa omilla tauluillasi ja tileilläsi. Älä käytä muiden tietoja äläkä heikennä palvelua.
- Emme ryhdy oikeustoimiin vilpittömässä mielessä tehdyn, näitä sääntöjä noudattavan tutkimuksen vuoksi.
- Koneluettavat yhteystiedot:
/.well-known/security.txt.
Company-tilauksen asiakkaat saavat tietoturva-arviointipaketin (kyselylomakkeiden vastaukset, alihankkijat, tietovirrat). DPA · Tietosuoja