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.
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č | Algoritam | Namjena |
|---|---|---|
| K_board | AES-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_owner | Ed25519 | Ovlasti 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če | SHA-256, prvih 80 bita, base32 | Izveden 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_fac | X25519 sealed box: efemerni X25519 + HKDF-SHA256 + AES-256-GCM | Dok ljudi pišu, skrivene kartice zapečaćene su facilitatorovim javnim ključem. Otvoriti ih može samo poveznica facilitatora (&f=). |
| Ključevi kartica | Ed25519, jedan ključ po kartici | Ima ga samo autor. Njime se potpisuju izmjene i otkrivanje: autentičnost bez identiteta. |
| Obveze (commitments) | HMAC-SHA256 s nasumičnom solju od 128 bita | Skrivena 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. |
| Prisutnost | AES-256-GCM pod K_board | Imena, avatari i indikatori tipkanja šifriraju se kao i sve ostalo. |
| Paket ključeva | HKDF-SHA256 iz PRF-a pristupnog ključa ili kôda za oporavak, AES-256-GCM | Prijavljeni 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.
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.
| Podaci | Gdje | Može čitati | Čuva se |
|---|---|---|---|
| Kartice, glasovi, reakcije, naljepnice, akcije, naziv ploče, naslovi prilagođenih predložaka | Pohrana Durable Objecta, kao šifrirani tekst | Osobe koje imaju poveznicu ploče | Dok se ploča ne izbriše |
| Omotnica operacije: vrsta, redni broj i vrijeme na poslužitelju, veličina, brojač facilitatora | Pohrana Durable Objecta | Peel | Dok se ploča ne izbriše |
| Imena sudionika, avatari, tipkanje | Prosljeđuje se kao šifrirani tekst; u memoriji dok traje veza | Osobe koje imaju poveznicu ploče | Dok traje veza |
| Status ploče: faza, broj sudionika i kartica, ID predloška iz kataloga, oznaka zaključavanja, vrijeme izrade i isteka | Durable Object, D1; poruke u Slacku/Teamsu ako je aplikacija instalirana | Peel; vaš kanal u Slacku/Teamsu | Za vrijeme trajanja ploče |
| Račun facilitatora: ID kod pružatelja, ime, e-adresa ako je podijeljena, povezani pružatelji, datum izrade, sesija | D1 | Peel | Dok se račun ne izbriše |
| Paket ključeva i omotani ključevi | D1, kao šifrirani tekst | Samo 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 Paddleu | D1; Paddle | Peel, Paddle | Koliko to zahtijevaju porezni propisi |
| Radni prostor, kanal i ID-jevi poruka u Slacku/Teamsu; token bota (šifriran AES-GCM-om) | D1 | Peel | Do deinstalacije |
| IP adresa | Cloudflareov rub mreže, privremeno (isporuka, ograničenje broja zahtjeva) | Cloudflare, Peelov ograničivač zahtjeva | Ne pohranjuje se u našim bazama podataka |
| Dnevni brojači (izrađene ploče, dosegnute faze) | D1 | Peel | Samo 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:readsamo 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.
- 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