Skip to content
reader.me

Notes tècniques

Model de seguretat

Què protegeix reader.me i què no, i com es van prendre decisions com ara "usar AES-128 en lloc d'AES-128" o "mantenir 'unsafe-inline' al CSP". Escrit per a reviewers de seguretat i lectors escèptics — sense màrqueting.

Model d'amenaces

reader.me és una single-page web app que s'executa dins del navegador de l'usuari. La superfície d'amenaça està modelada per aquest fet.

defensem contra

  • Fuita del document via upload. Tota l'arquitectura està construïda per fer estructuralment impossible pujar documents.
  • Fuita via JS de tercers. El CSP restringeix script-src a 'self' + una petita allowlist.
  • PDFs maliciosos contra PDF.js. Fixat a ≥4.2.67 (fix de CVE-2024-4367) amb isEvalSupported: false i enableXfa: false.
  • Brute-force de contrasenya a PDF Protegir. AES-128 amb IV aleatòria — elecció conservadora enfront d'AES-128 amb debilitats conegudes (Cryptanalysis of PDF Security Handler, 2020).
  • XSS via nom de fitxer. Filenames renderitzats com a text; metadata escrita com PDFHexString.fromText.
  • Pressió de memòria en fitxers grans. Operacions >20 MB dispatch a Comlink Web Worker amb transferables zero-copy.

No defensem contra

  • Extensions del navegador amb keylogger / screen recorder. Una extensió amb activeTab pot llegir tot el que llegim. Fora del nostre perímetre.
  • Compromís a nivell OS. Si la màquina està rootejada, l'atacant ja té el fitxer.
  • Operador de xarxa fent MitM amb CA col·laboradora. Un actor estat-nació pot fer coses dolentes a qualsevol HTTPS.
  • Side channels de CPU. Spectre/Meltdown — confiem en mitigacions del navegador.

Content Security Policy

El CSP de Reader viu a reader-web/public/_headers i l'aplica Cloudflare Pages a cada resposta. Highlights:
  • default-src 'self' — tot fetch va per defecte al first-party.
  • script-src 'self' 'wasm-unsafe-eval' 'unsafe-inline' + orígens d'analytics. La relaxació 'unsafe-inline' és requerida per la hidratació d'Astro; triada a la Fase 1 perquè fer el hash dels inlines costava ~600 ms de LCP al mòbil.
  • connect-src restringit a 'self' + analytics + CDN de Tesseract. Cap endpoint accepta dades de documents.
  • frame-ancestors 'none' — clickjacking impossible.
  • upgrade-insecure-requests — tot HTTP forçat a HTTPS.

Política de dependències i resposta a CVE

Tres motors són crítics per a la seguretat: PDF.js, pdf-lib i Tesseract.js. La nostra política:
  • Rangs fixats a package.json amb titlla, patch releases via Dependabot.
  • SLA de pegat per a CVE crítica: 72 h des de la divulgació pública quan la CVE afecta camins de codi que exercitem.
  • Tesseract WASM i worker self-hosted a /tesseract/ per evitar dependència de CDN extern en bytes crítics. Les trained data d'OCR per idioma es descarreguen de l'host fixat tessdata.projectnaptha.com en el primer ús i queden a la cau per a ús offline — el teu document mai no toca la xarxa en cap cas.
  • Verifica la promesa de privacitat al teu navegador — DevTools → Network mentre s'executa qualsevol tool. Zero peticions de document. Vegeu la recepta de 30 segons.

Quality gates a CI

  • Engine purity check — força que pdf-engine/core/** mai no toqui DOM, fetch, window, navigator.
  • Tests unitaris — Vitest cobreix cada funció pura al 97% línies / 100% funcions.
  • Tests end-to-end — Playwright en flows reals de browser per cada PR.
  • Accessibilitat — axe-core asserta zero violacions WCAG 2.1 / 2.2 AA en 8 rutes (incl. RTL).
  • Lighthouse CI — perf ≥95, a11y =100, SEO =100 a cada push a main.

Reportar una vulnerabilitat

Si trobes un issue de seguretat, divulga'l responsablement via email per no posar en risc els usuaris amb un report públic:

[email protected] — inclou descripció i passos mínims de reproducció.

Apuntem a confirmar en 48 h i pegar les crítiques en 72 h. Es dóna crèdit al changelog tret que prefereixis anonimat.

Relacionat

reader.me és una idea de David Carrero, construït a Color Vivo Internet S.L.