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.

Datan kulku: avain luetaan linkistä paikallisesti; verkon yli kulkee vain salattua dataa ja minimaalinen metatieto.

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.

AvainAlgoritmiKäyttötarkoitus
K_boardAES-256-GCM, 96-bittinen satunnainen IVSalaa 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_ownerEd25519Fasilitaattorin 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 tunnusSHA-256, ensimmäiset 80 bittiä, base32Johdetaan fasilitaattorin julkisesta avaimesta, joten tunnus itsessään todistaa, mikä avain omistaa taulun. Asiakasohjelmat hylkäävät otsakkeen, jonka avaimen tiiviste ei vastaa tunnusta.
K_facX25519 sealed box: kertakäyttöinen X25519 + HKDF-SHA256 + AES-256-GCMPiilotetut kortit sinetöidään fasilitaattorin julkiselle avaimelle kirjoittamisen ajaksi. Vain fasilitaattorin linkki (&f=) voi avata ne.
KorttiavaimetEd25519, yksi avain korttia kohdenVain kirjoittajan hallussa. Muokkaukset ja paljastus allekirjoitetaan sillä: aitous ilman henkilöllisyyttä.
SitoumuksetHMAC-SHA256 128-bittisellä satunnaisella suolallaPiilotettu 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äoloAES-256-GCM avaimella K_boardNimet, avatarit ja kirjoitusilmaisimet salataan kuten kaikki muukin.
AvainpakettiHKDF-SHA256 pääsyavaimen PRF:stä tai palautuskoodista, AES-256-GCMKirjautuneet 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.

Piilotetut kortit ja paljastus

  1. Kirjoittamisen aikana kirjoittajan selain sinetöi kortin fasilitaattorin X25519-avaimelle ja julkaisee suolatun sitoumuksen. Selväkielinen teksti pysyy kirjoittajan laitteella.
  2. Muut osallistujat näkevät piilotetun kortin: he eivät pysty purkamaan sitä, eikä myöskään palvelin.
  3. Fasilitaattorin selain voi avata sinetöidyt kortit (”👁 vain sinä” -esikatselu).
  4. Paljastuksessa jokainen kirjoittaja julkaisee korttinsa uudelleen avaimella K_board salattuna ja kortin avaimella allekirjoitettuna, yhdessä suolan kanssa.
  5. Jos kirjoittaja on offline-tilassa, fasilitaattori julkaisee kortin hänen puolestaan. Jokainen asiakasohjelma tarkistaa sitoumuksen, joten tekstin on vastattava sitä, mitä kirjoittaja kirjoitti.

Koska fasilitaattori voi teknisesti esikatsella kortteja, jokaisessa taulussa näkyy kaikille merkintä ”fasilitaattori voi esikatsella” niin kauan kuin kortit ovat piilossa. Sitä ei voi piilottaa asetuksista.

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.

TietoSijaintiKuka voi lukeaSäilytys
Kortit, äänet, reaktiot, tarrat, toimenpiteet, taulun nimi, omien pohjien otsikotDurable Object -tallennustila, salattunaHenkilöt, joilla on taulun linkkiKunnes taulu poistetaan
Operaation kuori: tyyppi, palvelimen järjestysnumero ja aika, koko, fasilitaattorin laskuriDurable Object -tallennustilaPeelKunnes taulu poistetaan
Osallistujien nimet, avatarit, kirjoitustilaVälitetään salattuna; pidetään muistissa yhteyden ajanHenkilöt, joilla on taulun linkkiYhteyden ajan
Taulun tila: vaihe, osallistujien ja korttien määrät, katalogin pohjan tunnus, lukitusmerkintä, luonti- ja vanhenemisajatDurable Object, D1; Slack-/Teams-viestit, jos asennettuPeel; Slack-/Teams-kanavasiTaulun elinkaaren ajan
Fasilitaattorin tili: palveluntarjoajan tunnus, nimi, sähköposti (jos jaettu), liitetyt palveluntarjoajat, luontipäivä, istuntoD1PeelKunnes poistat tilin
Avainpaketti ja käärityt avaimetD1, salattunaVain sinä (pääsyavain tai palautuskoodi)Kunnes poistat tilin
Tilaus, tilauksen tila, Paddlen asiakas- ja tilaustunnuksetD1; PaddlePeel, PaddleVerolainsäädännön edellyttämän ajan
Slack-/Teams-työtilan, kanavan ja viestien tunnukset; bottitunniste (AES-GCM-salattu)D1PeelKunnes sovellus poistetaan
IP-osoiteCloudflaren reunaverkko, tilapäisesti (toimitus, käyttörajat)Cloudflare, Peelin käyttörajoitinEi tallenneta tietokantoihimme
Päivittäiset laskurit (luodut taulut, saavutetut vaiheet)D1PeelVain 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:read vain, 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.

[email protected]

  • 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