AMBIENTE PREPROD — autovalutazione strutturata, non un audit di terza parte già eseguito.

Security assessment — Bonketiba Certified

Versione 1.0 · 2026-08-19. Quattro domini: crittografia, custodia delle chiavi, isolamento tenant, requisiti giuridici. Ogni controllo riporta come verificarlo senza fidarsi di noi; i gap sono dichiarati, non nascosti.

Controlli
20
Implementati
12
Parziali
4
Gap dichiarati
2

Nel perimetro

  • Firma e verifica dei pacchetti Certified (ECDSA P-256 / SHA-256).
  • Ciclo di vita delle chiavi: generazione, custodia, rotazione, ritiro, pubblicazione.
  • Isolamento tenant su tutte le server function e sulla coda notifiche.
  • Release Gate, catena di audit e riproducibilità delle prove.
  • Posizionamento giuridico e comunicazione pubblica di 'Certified'.

Fuori perimetro

  • Sicurezza fisica dell'infrastruttura del fornitore cloud.
  • Qualificazione eIDAS o accreditamento PEC (richiede un organismo di valutazione).
  • Codice del browser desktop Bonketiba (assessment separato).

Metodo

  1. Revisione del codice sorgente dei moduli crittografici e di governance.
  2. Analisi statica automatizzata della superficie server function (test CI).
  3. Ispezione delle policy RLS e dei GRANT su ogni tabella pubblica.
  4. Esecuzione del Release Gate e verifica del determinismo su due run consecutive.
  5. Verifica indipendente offline di un pacchetto firmato con la sola chiave pubblica.

Crittografia

Le prove sono verificabili da terzi senza fidarsi del server?

CR-1

Firma asimmetrica ECDSA P-256 / SHA-256

IMPLEMENTATO

Manifest e sigilli di catena sono firmati con ECDSA su curva P-256 e digest SHA-256 tramite WebCrypto. La chiave privata non lascia mai il server.

Come verificarlo: src/lib/certified.server.ts (SIGNATURE_ALG) e verifica browser-side su /release-evidence/verify.

CR-2

Canonicalizzazione deterministica

IMPLEMENTATO

Il payload firmato è serializzato in forma canonica: due esecuzioni con gli stessi input producono lo stesso hash normalizzato.

Come verificarlo: Prova pubblica di determinismo su /release-evidence/determinism.

CR-3

Catena di audit concatenata per hash

IMPLEMENTATO

Ogni evento contiene prev_hash ed entry_hash: la rimozione o l'alterazione di un anello rompe la catena in modo rilevabile.

Come verificarlo: Verificatore offline HTML e /release-evidence/verify ricalcolano la catena localmente.

CR-4

HMAC legacy affiancato alla firma asimmetrica

PARZIALE

La firma simmetrica storica resta calcolata per compatibilità con i pacchetti emessi prima della migrazione. Non è sufficiente per la verifica pubblica e non deve essere presentata come tale.

Come verificarlo: Il verdetto pubblico si basa sulla firma asimmetrica; l'HMAC è solo un controllo interno.

CR-5

Revisione crittografica indipendente

VERIFICA ESTERNA

Nessun laboratorio esterno ha ancora rivisto lo schema. È il prerequisito dichiarato prima di qualunque affermazione più forte.

Come verificarlo: Aperto: da assegnare a un revisore terzo.

Rischi residui

  • Assenza di marca temporale qualificata di terza parte (RFC 3161 o TSA accreditata).
  • Nessuna trasparenza append-only pubblica di tipo Certificate Transparency per i sigilli.

Cosa deve testare il revisore esterno

  • Correttezza della canonicalizzazione rispetto a input malevoli (unicode, chiavi duplicate).
  • Assenza di malleabilità delle firme e corretto uso di IEEE P1363 vs DER.
  • Resistenza a rollback della catena e a riordino degli eventi.

Custodia delle chiavi

Chi può firmare, con quale chiave, e cosa succede dopo una rotazione?

KM-1

Keyset versionato con key_id

IMPLEMENTATO

Ogni firma dichiara il key_id usato. Le chiavi ritirate restano pubblicate: le prove storiche restano verificabili dopo la rotazione.

Come verificarlo: Keyset pubblico esposto ai verificatori; console admin mostra stato ed età di ogni chiave.

KM-2

Rotazione periodica e manuale

IMPLEMENTATO

Rotazione automatica alla scadenza configurata (default 90 giorni) e rotazione manuale amministrativa, entrambe tracciate come alert persistente.

Come verificarlo: ensureKeyRotation / rotateSigningKey, con evento di audit certified.key_rotated.

KM-3

Separazione ambienti staging e produzione

IMPLEMENTATO

Prefissi di chiave distinti per PREPROD e produzione: un pacchetto di collaudo non può apparire come produttivo.

Come verificarlo: Prefissi bkc-test- e bkc-cert- nel keyset pubblico.

KM-4

Custodia in HSM / KMS gestito

GAP

La chiave privata è oggi custodita nel database sovrano dell'applicazione, non in un HSM certificato. È il gap più rilevante dell'assessment.

Come verificarlo: KEY_CUSTODY riporta il custode effettivo; il valore attuale è dichiarato in console.

KM-5

Procedura di compromissione

PARZIALE

La revoca di una chiave è tecnicamente possibile, ma la procedura formale di risposta a compromissione (chi decide, in quanto tempo, come si comunica) non è ancora approvata.

Come verificarlo: Da formalizzare come runbook firmato.

Rischi residui

  • Un compromesso del database di produzione consentirebbe firme arbitrarie fino alla revoca.
  • Nessuna soglia multi-parte (m-di-n) per l'uso della chiave di produzione.

Cosa deve testare il revisore esterno

  • Percorso completo della chiave privata: generazione, riposo, uso, backup, distruzione.
  • Efficacia della revoca: un pacchetto firmato con chiave revocata deve risultare NOT_VERIFIED o REVOKED.
  • Segregazione dei ruoli tra chi ruota le chiavi e chi approva le release.

Isolamento tenant

Un utente autenticato può vedere o modificare dati di un altro?

TI-1

RLS su ogni tabella pubblica

IMPLEMENTATO

Le tabelle applicative hanno RLS attiva e GRANT espliciti. Le server function autenticate operano con il client dell'utente: le policy si applicano come utente chiamante.

Come verificarlo: Policy ispezionabili; linter di piattaforma eseguito a ogni assessment.

TI-2

Superficie pubblica dichiarata e testata

IMPLEMENTATO

Ogni server function non autenticata è elencata con motivazione ed esposizione. Un endpoint pubblico nuovo e non dichiarato fa fallire la CI.

Come verificarlo: src/lib/tenant-isolation.ts e src/lib/__tests__/tenant-isolation.test.ts.

TI-3

Adesione agli Spaces solo tramite invito

IMPLEMENTATO

La policy permissiva di auto-adesione è stata rimossa: l'appartenenza si ottiene solo tramite redeem di un invito valido in funzione SECURITY DEFINER.

Come verificarlo: space_members non ha alcuna policy INSERT lato client.

TI-4

Coda notifiche admin-only e senza payload esposto

IMPLEMENTATO

Tutte le operazioni sulla coda richiedono ruolo admin; la console non può leggere il payload degli elementi; ogni aggiornamento è scoped al singolo id e legato al run-id.

Come verificarlo: Test automatici sulle sei operazioni della coda e sulle colonne selezionabili.

TI-5

Uso del client service-role confinato

IMPLEMENTATO

Il client privilegiato è importato solo dentro gli handler, mai a livello di modulo di una server function, e mai per decidere se il chiamante è admin.

Come verificarlo: Controllo automatico sul module scope di ogni file *.functions.ts.

TI-6

Test di penetrazione cross-tenant

VERIFICA ESTERNA

I controlli sono statici e di policy; manca una verifica dinamica condotta da un terzo con due tenant reali.

Come verificarlo: Aperto: da assegnare a un revisore terzo.

Rischi residui

  • I link condivisi tramite token sono accessibili a chiunque possieda il token: la protezione è la non indovinabilità, non l'identità.
  • Le funzioni SECURITY DEFINER concentrano la responsabilità: un errore in una di esse aggirerebbe la RLS.

Cosa deve testare il revisore esterno

  • Tentativi di lettura e scrittura cross-tenant su ogni endpoint autenticato.
  • Enumerazione e forza bruta dei token di condivisione e di verifica.
  • Comportamento delle funzioni SECURITY DEFINER con input ostili.

Requisiti giuridici

Cosa possiamo affermare pubblicamente, e cosa no?

LG-1

Disclaimer unico e non aggirabile

IMPLEMENTATO

Ogni pagina pubblica, report firmato e comunicazione riporta lo stesso testo: verificabilità tecnica sì, equivalenza PEC/eIDAS no.

Come verificarlo: LEGAL_DISCLAIMER in src/lib/trust-dossier.ts, riusato dalle pagine pubbliche.

LG-2

Motore di giurisdizione (OHADA, eIDAS)

PARZIALE

Il sistema distingue i requisiti per giurisdizione e li mostra, ma la mappatura non è stata validata da un legale abilitato in ciascun ordinamento.

Come verificarlo: Motore giurisdizioni nel modulo Certified; validazione legale aperta.

LG-3

Conservazione e minimizzazione dei dati

PARZIALE

I pacchetti conservano metadati e hash necessari alla prova; le politiche di retention per giurisdizione non sono ancora approvate formalmente.

Come verificarlo: Da formalizzare in una policy di conservazione approvata.

LG-4

Qualificazione come servizio fiduciario

GAP

Nessuna qualificazione richiesta né ottenuta. Qualsiasi affermazione di equivalenza legale sarebbe scorretta finché un organismo competente non si esprime.

Come verificarlo: Nessuna evidenza esiste: lo stato è dichiarato come assente.

Rischi residui

  • Rischio reputazionale se terzi interpretano 'Certified' come certificazione legale: mitigato dal disclaimer, non eliminato.
  • Divergenza tra requisiti OHADA e eIDAS su marca temporale e identificazione del firmatario.

Cosa deve testare il revisore esterno

  • Revisione legale del wording pubblico in francese, inglese e italiano.
  • Analisi di ammissibilità probatoria in almeno una giurisdizione OHADA e una UE.
  • Valutazione degli obblighi di conservazione e protezione dei dati personali.