Poftim

Arhitectura de securitate

Ce este protejat—și ce nu

Poftim creează o conexiune autentificată și temporară între două browsere. Conținutul fișierelor și metadatele sunt criptate înainte de a intra în transportul WebRTC. Serviciul nu a trecut încă printr-un audit de securitate independent, așa că această pagină documentează proiectarea și limitele ei, în loc să prezinte o insignă de audit.

Rezumat

Pe scurt

  • Conținutul fișierelorCriptat cap-la-cap
  • Numele, tipurile și dimensiunile declarate ale fișierelorCriptate
  • Cheile de sesiuneDerivate pe dispozitive
  • Autentificarea parteneruluiSecret QR + frază de potrivire
  • Transport directPreferat când este disponibil
  • Transport prin releuCriptat și nestocat
  • Evaluare independentăNefinalizată

Model de amenințare

Limita promisiunii

Conceput să protejeze împotriva

Un server de semnalizare sau un releu care citește ori modifică conținutul fișierelor; un observator pasiv al rețelei care citește fișierele transferate; cadre criptate reluate sau reordonate; și un al treilea dispozitiv care intră într-o sesiune deja revendicată.

În afara protecției

Un dispozitiv, browser, extensie sau pagină compromise; un destinatar care salvează ori redistribuie un fișier; analiza traficului; fișiere nesigure acceptate de la altcineva; și defecțiuni de tip refuz de serviciu sau de disponibilitate.

Fraza de potrivire ajută la depistarea unei conexiuni care nu derivă aceleași chei de sesiune. Compar-o pe ambele ecrane înainte să continui.

Asociere și chei

Chei noi pentru fiecare conexiune

Secret de asociere
32 de octeți aleatori creați de browserul gazdă și purtați în fragmentul adresei din codul QR. Fragmentul nu este inclus în cererea HTTP obișnuită.
Semnalizare
Secretul derivă o cheie AES-256-GCM care sigilează SDP-ul, candidații ICE și cheile publice efemere înainte ca serverul de semnalizare să le transmită mai departe.
Stabilirea cheii
Perechi noi de chei ECDH P-256 stabilesc un secret comun. HKDF-SHA-256 derivă chei separate gazdă-către-invitat și invitat-către-gazdă.
Verificare umană
Ambele dispozitive derivă aceeași frază scurtă din cheile de sesiune. O nepotrivire înseamnă că se renunță la conexiune.
Durata de viață a cheii
Secretul de asociere este șters după stabilirea cheii. Cheile de sesiune rămân în memoria browserului pe durata conexiunii temporare.
Protocol
QRCABLE/1. Schimbările care afectează interoperabilitatea necesită o actualizare a versiunii de protocol.

Protecția fișierelor

Criptate înainte de transport

AES-256-GCM sigilează fiecare mesaj de control și fiecare bucată de fișier cu un contor monoton. Cel care primește respinge cadrele repetate, impune ordinea bucăților și verifică o amprentă SHA-256 cap-la-cap înainte de a raporta un fișier ca primit.

Un cadru pe fir. Nouă octeți de antet de rutare — un octet de tip și opt de contor — pot fi citiți de orice transportă cadrul. Tot ce urmează după ei este text cifrat AES-256-GCM plus tag, opac pentru releu și pentru server. SIGILAT · ILIZIBIL ÎN TRANZIT TIP CONTOR 1 OCTET 8 OCTEȚI TEXT CIFRAT AES-256-GCM + TAG
Metadate
Numele, tipurile MIME, dimensiunile declarate, datele de modificare și amprentele fișierelor călătoresc în interiorul unor cadre de control criptate.
Transport
Un canal de date WebRTC ordonat adaugă protecție DTLS sub criptarea de la nivelul aplicației.
Stocare
Serviciul de semnalizare nu transportă niciodată bucăți de fișiere. Un releu TURN transmite mai departe pachete criptate și nu este folosit ca stocare de fișiere.
Fișiere riscante
Interfața care primește avertizează pentru extensiile obișnuite de fișiere executabile și cu conținut activ. Nu scanează fișierele de programe malițioase.

Metadate vizibile

Criptarea nu ascunde conexiunea în sine

  • Conținutul fișierelorNu ajunge în formă lizibilă
  • Numele și tipurile fișierelorCriptate
  • Cheile de criptareNu ajung la server
  • Identificator de sesiune opac și rolVăzute de semnalizare
  • Adrese IPProcesate de infrastructura de conexiune
  • Momentul conexiunii și volumul aproximativObservabile
  • Istoric al transferurilorNu este creat de aplicație

Partenerii conectați direct pot afla adresa de rețea unul altuia. „Ascunde-mi adresa de rețea” forțează transportul prin releul TURN, astfel încât partenerul nu primește o rută directă, dar infrastructura releului tot procesează ambele adrese.

Limitare importantă

Browserul trebuie să aibă încredere în pagina livrată

Fragmentul din codul QR nu este trimis în cererea HTTP, dar codul JavaScript care rulează în pagină îl poate citi. O instalare, un browser sau o extensie compromise ar putea citi materialul de asociere, cheile de sesiune sau fișierele în clar.

Pagina de transfer folosește o politică de securitate a conținutului restrictivă, cu script-src 'self', resurse doar din aceeași origine, HTTPS cu HSTS, protecție împotriva încadrării și o politică no-referrer. Niciun script terț, niciun cod de publicitate sau de analiză nu are voie să se execute acolo — politica livrată împreună cu pagina refuză orice origine externă, așa că este o proprietate a instalării, nu o promisiune despre ce am ales noi să includem.

Paginile de documentare pe care le citești acum — aceasta, cum funcționează, confidențialitatea și restul — sunt livrate sub o politică separată, mai permisivă, care permite Google Analytics după consimțământ. Ele nu conțin material de sesiune, nici chei și niciun fel de date de fișiere. Pagina de transfer și paginile care o descriu nu sunt, în mod intenționat, aceeași suprafață de securitate.

Aceste măsuri reduc expunerea; nu elimină nevoia de a avea încredere în codul livrat de poftim.app.

Sesiuni și infrastructură

De scurtă durată și intenționat sărace

Cod nescanat
Sesiunea de semnalizare din memorie expiră după cinci minute.
Sesiune conectată inactivă
Termenul de inactivitate de pe server este de cincisprezece minute și este reînnoit de semnalizarea activă.
Intrare de unică folosință
Doar primul invitat poate revendica o sesiune. Închiderea gazdei invalidează codul ei QR.
Linkuri de conexiune trimise
Un link creat cu „Trimite conexiunea” poartă același secret de unică folosință ca și codul QR și este revendicat în același fel. Forțează ambele dispozitive pe releul criptat, așa că niciunul nu primește o rută de rețea directă către celălalt. Tratează linkul ca pe secretul care este: oricine îl citește înaintea destinatarului vizat poate revendica sesiunea.
Fișiere primite după deconectare
Fișierele care au terminat de sosit sunt ținute de pagina care primește, nu de conexiune. Închiderea conexiunii — din oricare parte — nu le poate retrage, iar destinatarul rămâne pe ecranul cu rezultate până când părăsește pagina.
Starea serverului
Id-urile de sesiune opace, rolurile, starea conexiunii și expirarea sunt ținute în memorie. Metadatele și conținutul fișierelor nu sunt stocate acolo.
Jurnale de acces web
Șirurile de interogare sunt excluse, iar adresele IP sunt trunchiate înainte de a fi scrise în jurnalul de acces configurat.
Terți
În pagina aplicației nu rulează niciun script terț, niciun serviciu de analiză, de publicitate sau de conturi, iar politica ei de securitate a conținutului nu permite nicio origine externă care ar putea face asta. Numărătorile de parcurs sunt trimise chiar către poftim.app, fără cookie-uri și fără vreun identificator. Paginile de documentare separate folosesc Google Analytics după consimțământ.

Compatibilitatea browserelor

Browsere actuale, cu diferențe practice

Poftim are nevoie de canale de date WebRTC, de suport Web Crypto pentru ECDH P-256, HKDF și AES-GCM, de module JavaScript și de descărcări de tip blob.

Este conceput pentru Safari actual pe iPhone și macOS, pentru browserele Chromium actuale pe Android, Windows, macOS și Linux și pentru Firefox actual. Salvarea fișierelor mari, suspendarea în fundal și comportamentul memoriei diferă de la o platformă la alta.

O matrice formală de testare, versiune cu versiune, pentru browsere și pentru dimensiunea maximă a fișierelor nu a fost încă finalizată. Până atunci, ține ambele pagini deschise și ecranele aprinse și evită să consideri garantată o anumită dimensiune maximă.

Începe o conexiune