Za timove za informacijsku sigurnost i recenzente aplikacija

Sigurnost u Peelu

Ukratko: sadržaj ploče šifrira se u pregledniku ključem koji se nalazi u fragmentu poveznice, pa naši poslužitelji pohranjuju i prosljeđuju šifrirani tekst koji ne mogu pročitati. U nastavku je točno opisano kako, i gdje su granice.

Sažetak

  • Tekst kartica, imena, naslovi ploča, glasovi i naljepnice šifriraju se algoritmom AES-256-GCM ključem ploče generiranim u pregledniku. Ključ putuje u fragmentu URL-a (#k=) i nikad se ne šalje poslužitelju.
  • Radnje facilitatora, zaglavlje ploče i snimke stanja potpisuju se facilitatorovim ključem Ed25519. ID ploče izveden je iz tog ključa, pa klijenti otkrivaju podmetanje ključa.
  • Skrivene kartice zapečaćene su za facilitatora (X25519 sealed box) do otkrivanja i vezane soljenim obvezama (commitments), pa se otkriveni tekst ne može podmetnuti.
  • Anonimno po zadanim postavkama: operacije ne nose ID autora; glasovi i reakcije koriste nasumični ID po ploči.
  • Sudionici se nikad ne autentificiraju. Bez SDK-ova za analitiku, bez oglasa, bez skripti trećih strana osim Paddle.js na stranici za plaćanje.
  • Samo Cloudflare. Nepreuzete ploče brišu se 60 dana nakon posljednjeg posjeta.

Kako teku podaci

Fragmentom URL-a (svime iza #) upravlja preglednik i on nije dio HTTP zahtjeva. Peel ondje sprema ključ ploče.

Tok podataka: ključ se čita lokalno iz poveznice; mrežom putuju samo šifrirani tekst i minimalni metapodaci.

Model prijetnji

Sustav je osmišljen tako da potpuno kompromitiran ili znatiželjan poslužitelj, uključujući nas same, sazna što je moguće manje o tome što tim govori.

Što štitimo

  • Tekst kartica, odabrane GIF-ove i, u imenovanom načinu, ime autora.
  • Imena i avatare sudionika, naziv ploče i naslove prilagođenih predložaka.
  • Tko je za što glasao ili na što reagirao te tko je napisao koju karticu.
  • Cjelovitost retra: faze, otkrivanja i odluke facilitatora ne mogu se krivotvoriti.

Napadači koje uzimamo u obzir

  • Naši vlastiti poslužitelji, zlonamjerni insajder ili netko tko provali u našu pohranu: dobivaju šifrirani tekst i metapodatke.
  • Mrežni napadač: TLS posvuda; ključ nikad ne putuje mrežom.
  • Poslužitelj koji podmeće ključeve: ID ploče izveden je iz facilitatorova javnog ključa, a klijenti provjeravaju potpisano zaglavlje.
  • Sudionik koji želi virnuti ili krivotvoriti: skrivene kartice zapečaćene su za facilitatora; operacije facilitatora zahtijevaju facilitatorov potpis; izmjene kartice zahtijevaju ključ te kartice.
  • Facilitator koji ponovno objavljuje karticu umjesto autora koji nije na mreži: obveze (commitments) sprječavaju izmjenu teksta.

Izvan opsega, iskreno

  • Svatko tko ima poveznicu za sudionike može čitati ploču. Poveznica je kontrola pristupa. Dijelite je kao da dijelite samu ploču.
  • Kompromitiran uređaj, zlonamjerno proširenje preglednika ili netko tko gleda preko ramena.
  • Analiza prometa: poslužitelj vidi vrijeme, veličine i brojeve (v. kartu podataka).
  • Uskraćivanje usluge od strane poslužitelja: može odbaciti ili odgoditi poruke, ali ih ne može pročitati ni krivotvoriti.

Kriptografija

Sve kriptografske primitive dolaze iz preglednikova API-ja WebCrypto. Bez vlastite kriptografije, bez kriptografskih biblioteka trećih strana.

KljučAlgoritamNamjena
K_boardAES-256-GCM, nasumični IV od 96 bitaŠifrira svaku operaciju, snimku stanja i ažuriranje prisutnosti. Dodatni podaci vežu ID ploče, vrstu operacije i ID operacije, pa se šifrirani tekst ne može ponovno reproducirati u drugoj ploči ili na drugom mjestu. Nalazi se samo u fragmentu poveznice #k=.
K_ownerEd25519Ovlasti facilitatora. Potpisuje operacije facilitatora (faza, mjerač vremena, fokus, predložak, postavke, otvaranje glasova, skrivanje kartice), zaglavlje ploče i snimke stanja. Strogo rastući brojač sprječava ponavljanje. Samo u poveznici facilitatora (&o=).
ID pločeSHA-256, prvih 80 bita, base32Izveden iz facilitatorova javnog ključa, pa sam ID dokazuje koji ključ posjeduje ploču. Klijenti odbijaju zaglavlje čiji ključ ne daje taj ID kao hash.
K_facX25519 sealed box: efemerni X25519 + HKDF-SHA256 + AES-256-GCMDok ljudi pišu, skrivene kartice zapečaćene su facilitatorovim javnim ključem. Otvoriti ih može samo poveznica facilitatora (&f=).
Ključevi karticaEd25519, jedan ključ po karticiIma ga samo autor. Njime se potpisuju izmjene i otkrivanje: autentičnost bez identiteta.
Obveze (commitments)HMAC-SHA256 s nasumičnom solju od 128 bitaSkrivena kartica objavljuje obvezu na svoj sadržaj. Pri otkrivanju objavljuju se sadržaj i sol, a svaki ih klijent provjerava, pa nitko ne može podmetnuti tekst.
PrisutnostAES-256-GCM pod K_boardImena, avatari i indikatori tipkanja šifriraju se kao i sve ostalo.
Paket ključevaHKDF-SHA256 iz PRF-a pristupnog ključa ili kôda za oporavak, AES-256-GCMPrijavljeni facilitatori mogu sinkronizirati ključeve ploča između uređaja. Paket se šifrira na uređaju; poslužitelj pohranjuje samo šifrirani tekst i omotane ključeve.

Poruke za potpisivanje razdvojene su po domeni (na primjer peel/sig/v1, peel/header/v1, peel/snap/v1), pa se potpis za jednu namjenu ne može ponovno upotrijebiti za drugu.

Skrivene kartice i otkrivanje

  1. Tijekom pisanja autorov preglednik zapečati karticu facilitatorovim ključem X25519 i objavi soljenu obvezu. Otvoreni tekst ostaje na autorovu uređaju.
  2. Ostali sudionici vide skrivenu karticu: ne mogu je dešifrirati, a ne može ni poslužitelj.
  3. Facilitatorov preglednik može otvoriti zapečaćene kartice (pregled „👁 samo ti“).
  4. Pri otkrivanju svaki autor ponovno objavljuje karticu šifriranu ključem K_board, potpisanu ključem kartice, zajedno sa soli.
  5. Ako autor nije na mreži, facilitator objavljuje karticu umjesto njega. Svaki klijent provjerava obvezu, pa tekst mora odgovarati onome što je autor napisao.

Budući da facilitator tehnički može pregledati kartice, svaka ploča svima prikazuje oznaku „facilitator može pregledati“ dok su kartice skrivene. To nije postavka koja se može sakriti.

Anonimnost

  • Operacije ne nose ID autora. Poslužitelj ne može povezati karticu s osobom, a po zadanim postavkama ne može ni facilitator.
  • Glasovi i reakcije vezani su uz nasumični ID po ploči koji nije povezan s imenom.
  • Indikatori tipkanja pokazuju da netko piše, nikad što.
  • Imenovani način izričita je postavka ploče; ime autora tada putuje unutar šifrirane kartice.
  • Sudionici se nikad ne prijavljuju, pa nema računa koji bi se mogao povezati.

Karta podataka

Sve što čuvamo, gdje se nalazi, tko to može čitati i koliko dugo ostaje.

PodaciGdjeMože čitatiČuva se
Kartice, glasovi, reakcije, naljepnice, akcije, naziv ploče, naslovi prilagođenih predložakaPohrana Durable Objecta, kao šifrirani tekstOsobe koje imaju poveznicu pločeDok se ploča ne izbriše
Omotnica operacije: vrsta, redni broj i vrijeme na poslužitelju, veličina, brojač facilitatoraPohrana Durable ObjectaPeelDok se ploča ne izbriše
Imena sudionika, avatari, tipkanjeProsljeđuje se kao šifrirani tekst; u memoriji dok traje vezaOsobe koje imaju poveznicu pločeDok traje veza
Status ploče: faza, broj sudionika i kartica, ID predloška iz kataloga, oznaka zaključavanja, vrijeme izrade i istekaDurable Object, D1; poruke u Slacku/Teamsu ako je aplikacija instaliranaPeel; vaš kanal u Slacku/TeamsuZa vrijeme trajanja ploče
Račun facilitatora: ID kod pružatelja, ime, e-adresa ako je podijeljena, povezani pružatelji, datum izrade, sesijaD1PeelDok se račun ne izbriše
Paket ključeva i omotani ključeviD1, kao šifrirani tekstSamo vlasnik računa (pristupni ključ ili kôd za oporavak)Dok se račun ne izbriše
Plan, status pretplate, ID kupca i ID pretplate u PaddleuD1; PaddlePeel, PaddleKoliko to zahtijevaju porezni propisi
Radni prostor, kanal i ID-jevi poruka u Slacku/Teamsu; token bota (šifriran AES-GCM-om)D1PeelDo deinstalacije
IP adresaCloudflareov rub mreže, privremeno (isporuka, ograničenje broja zahtjeva)Cloudflare, Peelov ograničivač zahtjevaNe pohranjuje se u našim bazama podataka
Dnevni brojači (izrađene ploče, dosegnute faze)D1PeelSamo zbirno, bez identifikatora

Što naš poslužitelj može, a što ne može

Može

  • Vidjeti vrste operacija, veličine, vrijeme, fazu, broj sudionika i kartica, ID predloška iz kataloga i oznaku zaključavanja.
  • Odbaciti, odgoditi ili odbiti isporuku operacija (uskraćivanje usluge).
  • Vidjeti IP adrese na rubu mreže.
  • Zbirno brojati ploče i dosegnute faze.
  • Izbrisati ploču (istek, prijave zloupotrebe).

Ne može

  • Čitati tekst kartica, imena, naslove ploča, naslove prilagođenih predložaka, glasove ni naljepnice.
  • Čitati skrivene kartice prije otkrivanja (pa ni nakon njega).
  • Krivotvoriti radnje facilitatora: za njih je potreban facilitatorov potpis.
  • Podmetnuti vlastite ključeve: ID ploče to otkriva.
  • Promijeniti otkriveni tekst kartice: obveze i potpisi kartica to otkrivaju.
  • Znati tko je napisao koju karticu.

Kao i kod svake web-aplikacije, korisnik vjeruje kodu koji poslužujemo. Tu površinu držimo malom: stroga Content Security Policy, script-src ograničen na naše ishodište, bez skripti trećih strana, a protokol je na zahtjev otvoren za reviziju.

Slack i Microsoft Teams

  • Poruke sadrže poveznicu ploče i metapodatke (naslov, faza, brojevi). Tekst kartica šalje se samo kad facilitator objavi sažetak i potvrdi ga.
  • Kartica za pridruživanje sadrži poveznicu za sudionike, koja uključuje ključ. Pridružiti se može svatko tko može čitati taj kanal, isto kao da je poveznica ondje zalijepljena.
  • Pregledi poveznica (unfurl) prikazuju samo fazu i brojeve, nikad sadržaj.
  • Opsezi u Slacku: commands, chat:write, links:read, links:write; users:read samo kad tim uključi spominjanja.
  • Tokeni botova šifrirani su u mirovanju (AES-GCM, ključ se čuva kao tajna Workera). Potpisi zahtjeva iz Slacka i tokeni Bot Frameworka provjeravaju se pri svakom zahtjevu.
  • Deinstalacija aplikacije zaustavlja sve objave i briše njezine tokene.

Web i infrastruktura

  • Samo Cloudflare: Pages, Workers, Durable Objects, D1, R2 i KV na računu tvrtke 1801 Labs. Nema drugih poslužitelja.
  • TLS posvuda, HSTS i stroga Content Security Policy.
  • Bez SDK-ova za analitiku, bez oglasa, bez skripti trećih strana. Jedina je iznimka Paddle.js, koji se učitava samo na stranici za plaćanje.
  • Jedan kolačić, samo za prijavljene facilitatore: peel_session, httpOnly, Secure, SameSite=Lax.
  • Pretraga GIF-ova i mediji idu preko našeg API-ja, pa IP adrese sudionika nikad ne stižu do GIPHY-ja.
  • Fontovi i ostali resursi poslužuju se s naših poslužitelja. Bez fontova s CDN-a, bez piksela za praćenje.
  • Ograničenja broja zahtjeva po IP adresi i po ploči; prijave zloupotrebe i zaključavanje od strane facilitatora.

Računi i čuvanje podataka

  • Sudionici se nikad ne autentificiraju. Facilitatori se prijavljuju Googleom (ili Entra ID-om putem Teamsa) samo radi čuvanja ploča ili plaćenih značajki.
  • Račun pohranjuje ID, ime i e-adresu od pružatelja te šifrirani paket ključeva koji se otključava pristupnim ključem (WebAuthn PRF) ili kôdom za oporavak. Prijava daje vlasništvo, a ne pristup sadržaju.
  • Preuzimanje ploče dokazuje vlasništvo potpisom facilitatora. Ključevi ploča nikad se ne šalju.
  • Ploče bez računa brišu se 60 dana nakon posljednjeg posjeta; svaki posjet ponovno pokreće odbrojavanje. Alarmi Durable Objecta brišu pohranu.
  • Brisanjem računa brišu se sesije, paket ključeva i biblioteka, a pločama se vraća istek od 60 dana.

Odgovorno otkrivanje

Pronašli ste nešto? Javite nam se prvo i surađivat ćemo. Prijave potvrđujemo u roku od tri radna dana.

[email protected]

  • Molimo da nam prije objave date razumno vrijeme za popravak (ciljamo na 90 dana).
  • Testirajte na vlastitim pločama i računima. Ne pristupajte tuđim podacima i ne narušavajte rad usluge.
  • Nećemo pokretati pravne postupke protiv istraživanja u dobroj vjeri koje poštuje ova pravila.
  • Strojno čitljiv kontakt: /.well-known/security.txt.

Korisnici plana Tvrtka dobivaju paket za sigurnosnu procjenu (odgovori na upitnike, podizvršitelji obrade, tokovi podataka). DPA · Privatnost