{
  "document": {
    "document_version": "bkc-threat-model/1.0",
    "doc_id": "BKC-TRUST-1.0.0",
    "trust_pack_version": "1.0.0",
    "dossier_version": "1.0",
    "protocol": "Bonketiba Certified 1.0",
    "threats": [
      {
        "id": "T1",
        "threat": "Alterazione di un documento già emesso",
        "category": "Tampering",
        "mitigation": "Hash SHA-256 nel manifest firmato; qualunque modifica cambia il digest.",
        "residual": "Nessuno noto se il verificatore usa la chiave pubblica corretta.",
        "controls": [
          {
            "id": "CR-1",
            "title": "Firma asimmetrica ECDSA P-256 / SHA-256",
            "status": "implemented"
          },
          {
            "id": "CR-2",
            "title": "Canonicalizzazione deterministica",
            "status": "implemented"
          }
        ]
      },
      {
        "id": "T2",
        "threat": "Rimozione o riordino di eventi nella catena di audit",
        "category": "Tampering",
        "mitigation": "Concatenamento per hash con sequenza: la catena si rompe in modo rilevabile.",
        "residual": "Troncamento dell'intera catena rilevabile solo confrontando con una copia esterna.",
        "controls": [
          {
            "id": "CR-3",
            "title": "Catena di audit concatenata per hash",
            "status": "implemented"
          }
        ]
      },
      {
        "id": "T3",
        "threat": "Firma fraudolenta con chiave privata sottratta",
        "category": "Spoofing",
        "mitigation": "Keyset versionato, rotazione periodica, revoca che porta a NOT_VERIFIED.",
        "residual": "ALTO finché la chiave non risiede in HSM: è il gap dichiarato KM-4.",
        "controls": [
          {
            "id": "KM-1",
            "title": "Keyset versionato con key_id",
            "status": "implemented"
          },
          {
            "id": "KM-2",
            "title": "Rotazione periodica e manuale",
            "status": "implemented"
          },
          {
            "id": "KM-4",
            "title": "Custodia in HSM / KMS gestito",
            "status": "gap"
          },
          {
            "id": "KM-5",
            "title": "Procedura di compromissione",
            "status": "partial"
          }
        ]
      },
      {
        "id": "T4",
        "threat": "Retrodatazione di una prova",
        "category": "Repudiation",
        "mitigation": "Timestamp server nella catena sigillata e sequenza monotona degli eventi.",
        "residual": "Senza TSA accreditata la data resta un'affermazione del sistema, non di un terzo.",
        "controls": [
          {
            "id": "CR-3",
            "title": "Catena di audit concatenata per hash",
            "status": "implemented"
          },
          {
            "id": "LG-2",
            "title": "Motore di giurisdizione (OHADA, eIDAS)",
            "status": "partial"
          }
        ]
      },
      {
        "id": "T5",
        "threat": "Accesso a pacchetti di altri tenant",
        "category": "Information disclosure",
        "mitigation": "RLS owner-scoped, verifica pubblica solo per token, controlli automatici in CI.",
        "residual": "Chi possiede il token di verifica accede al pacchetto: il token è la credenziale.",
        "controls": [
          {
            "id": "TI-1",
            "title": "RLS su ogni tabella pubblica",
            "status": "implemented"
          },
          {
            "id": "TI-2",
            "title": "Superficie pubblica dichiarata e testata",
            "status": "implemented"
          },
          {
            "id": "TI-5",
            "title": "Uso del client service-role confinato",
            "status": "implemented"
          }
        ]
      },
      {
        "id": "T6",
        "threat": "Enumerazione dei token di verifica",
        "category": "Information disclosure",
        "mitigation": "Token ad alta entropia, rate limit sulla verifica pubblica, alert su enumerazione sospetta.",
        "residual": "Rumore da scansioni automatiche: gestito come alert, non come blocco.",
        "controls": [
          {
            "id": "TI-2",
            "title": "Superficie pubblica dichiarata e testata",
            "status": "implemented"
          },
          {
            "id": "TI-6",
            "title": "Test di penetrazione cross-tenant",
            "status": "external"
          }
        ]
      },
      {
        "id": "T7",
        "threat": "Indisponibilità di Slack o email esterna",
        "category": "Denial of service",
        "mitigation": "Connettori isolati con timeout e coda con backoff: mai nel percorso critico del gate.",
        "residual": "Ritardo nelle notifiche opzionali; esito Certified invariato per costruzione.",
        "controls": [
          {
            "id": "TI-4",
            "title": "Coda notifiche admin-only e senza payload esposto",
            "status": "implemented"
          }
        ]
      },
      {
        "id": "T8",
        "threat": "Un connettore esterno altera l'esito del Release Gate",
        "category": "Elevation of privilege",
        "mitigation": "Il nucleo esegue e sigilla prima dei connettori; nessun risultato di connettore rientra nel report.",
        "residual": "Coperto da test automatici dedicati sull'isolamento dei connettori.",
        "controls": [
          {
            "id": "TI-4",
            "title": "Coda notifiche admin-only e senza payload esposto",
            "status": "implemented"
          },
          {
            "id": "TI-2",
            "title": "Superficie pubblica dichiarata e testata",
            "status": "implemented"
          }
        ]
      },
      {
        "id": "T9",
        "threat": "Un utente autenticato assume privilegi amministrativi",
        "category": "Elevation of privilege",
        "mitigation": "Ruoli in tabella dedicata con funzione SECURITY DEFINER has_role; mai ruoli nel profilo.",
        "residual": "Errore in una funzione SECURITY DEFINER aggirerebbe la RLS: superficie da rivedere in audit.",
        "controls": [
          {
            "id": "TI-1",
            "title": "RLS su ogni tabella pubblica",
            "status": "implemented"
          },
          {
            "id": "TI-3",
            "title": "Adesione agli Spaces solo tramite invito",
            "status": "implemented"
          },
          {
            "id": "TI-5",
            "title": "Uso del client service-role confinato",
            "status": "implemented"
          }
        ]
      },
      {
        "id": "T10",
        "threat": "Interpretazione di 'Certified' come valore legale",
        "category": "Misrepresentation",
        "mitigation": "Disclaimer unico su ogni superficie pubblica e testi approvati per la comunicazione.",
        "residual": "Rischio comunicativo residuo: mitigato, non eliminato.",
        "controls": [
          {
            "id": "LG-1",
            "title": "Disclaimer unico e non aggirabile",
            "status": "implemented"
          },
          {
            "id": "LG-4",
            "title": "Qualificazione come servizio fiduciario",
            "status": "gap"
          }
        ]
      }
    ],
    "controls": [
      {
        "domain": "crypto",
        "title": "Crittografia",
        "controls": [
          {
            "id": "CR-1",
            "title": "Firma asimmetrica ECDSA P-256 / SHA-256",
            "status": "implemented",
            "evidence": "src/lib/certified.server.ts (SIGNATURE_ALG) e verifica browser-side su /release-evidence/verify."
          },
          {
            "id": "CR-2",
            "title": "Canonicalizzazione deterministica",
            "status": "implemented",
            "evidence": "Prova pubblica di determinismo su /release-evidence/determinism."
          },
          {
            "id": "CR-3",
            "title": "Catena di audit concatenata per hash",
            "status": "implemented",
            "evidence": "Verificatore offline HTML e /release-evidence/verify ricalcolano la catena localmente."
          },
          {
            "id": "CR-4",
            "title": "HMAC legacy affiancato alla firma asimmetrica",
            "status": "partial",
            "evidence": "Il verdetto pubblico si basa sulla firma asimmetrica; l'HMAC è solo un controllo interno."
          },
          {
            "id": "CR-5",
            "title": "Revisione crittografica indipendente",
            "status": "external",
            "evidence": "Aperto: da assegnare a un revisore terzo."
          }
        ],
        "residual_risks": [
          "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."
        ]
      },
      {
        "domain": "keys",
        "title": "Custodia delle chiavi",
        "controls": [
          {
            "id": "KM-1",
            "title": "Keyset versionato con key_id",
            "status": "implemented",
            "evidence": "Keyset pubblico esposto ai verificatori; console admin mostra stato ed età di ogni chiave."
          },
          {
            "id": "KM-2",
            "title": "Rotazione periodica e manuale",
            "status": "implemented",
            "evidence": "ensureKeyRotation / rotateSigningKey, con evento di audit certified.key_rotated."
          },
          {
            "id": "KM-3",
            "title": "Separazione ambienti staging e produzione",
            "status": "implemented",
            "evidence": "Prefissi bkc-test- e bkc-cert- nel keyset pubblico."
          },
          {
            "id": "KM-4",
            "title": "Custodia in HSM / KMS gestito",
            "status": "gap",
            "evidence": "KEY_CUSTODY riporta il custode effettivo; il valore attuale è dichiarato in console."
          },
          {
            "id": "KM-5",
            "title": "Procedura di compromissione",
            "status": "partial",
            "evidence": "Da formalizzare come runbook firmato."
          }
        ],
        "residual_risks": [
          "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."
        ]
      },
      {
        "domain": "tenant",
        "title": "Isolamento tenant",
        "controls": [
          {
            "id": "TI-1",
            "title": "RLS su ogni tabella pubblica",
            "status": "implemented",
            "evidence": "Policy ispezionabili; linter di piattaforma eseguito a ogni assessment."
          },
          {
            "id": "TI-2",
            "title": "Superficie pubblica dichiarata e testata",
            "status": "implemented",
            "evidence": "src/lib/tenant-isolation.ts e src/lib/__tests__/tenant-isolation.test.ts."
          },
          {
            "id": "TI-3",
            "title": "Adesione agli Spaces solo tramite invito",
            "status": "implemented",
            "evidence": "space_members non ha alcuna policy INSERT lato client."
          },
          {
            "id": "TI-4",
            "title": "Coda notifiche admin-only e senza payload esposto",
            "status": "implemented",
            "evidence": "Test automatici sulle sei operazioni della coda e sulle colonne selezionabili."
          },
          {
            "id": "TI-5",
            "title": "Uso del client service-role confinato",
            "status": "implemented",
            "evidence": "Controllo automatico sul module scope di ogni file *.functions.ts."
          },
          {
            "id": "TI-6",
            "title": "Test di penetrazione cross-tenant",
            "status": "external",
            "evidence": "Aperto: da assegnare a un revisore terzo."
          }
        ],
        "residual_risks": [
          "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."
        ]
      },
      {
        "domain": "legal",
        "title": "Requisiti giuridici",
        "controls": [
          {
            "id": "LG-1",
            "title": "Disclaimer unico e non aggirabile",
            "status": "implemented",
            "evidence": "LEGAL_DISCLAIMER in src/lib/trust-dossier.ts, riusato dalle pagine pubbliche."
          },
          {
            "id": "LG-2",
            "title": "Motore di giurisdizione (OHADA, eIDAS)",
            "status": "partial",
            "evidence": "Motore giurisdizioni nel modulo Certified; validazione legale aperta."
          },
          {
            "id": "LG-3",
            "title": "Conservazione e minimizzazione dei dati",
            "status": "partial",
            "evidence": "Da formalizzare in una policy di conservazione approvata."
          },
          {
            "id": "LG-4",
            "title": "Qualificazione come servizio fiduciario",
            "status": "gap",
            "evidence": "Nessuna evidenza esiste: lo stato è dichiarato come assente."
          }
        ],
        "residual_risks": [
          "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."
        ]
      }
    ],
    "generated_at": "2026-09-29T06:58:01.504Z",
    "legal_disclaimer": "Bonketiba Certified è un sistema tecnico di evidenza: produce prove verificabili di integrità, sequenza temporale e firma. Non è PEC, non è un servizio fiduciario qualificato eIDAS, non è una firma elettronica qualificata e non attribuisce automaticamente valore legale ai messaggi. Il valore probatorio dipende dall'ordinamento applicabile e dalla valutazione dell'autorità competente.",
    "verification": {
      "keyset_url": "https://navigator.bonketiba.com/api/public/certified-keys",
      "trust_pack_pdf": "https://navigator.bonketiba.com/api/public/trust-pack",
      "offline_verifier_url": "https://navigator.bonketiba.com/release-evidence/verify",
      "procedure": "SHA-256 sulla forma canonica di `document` e verifica ECDSA P-256 di `signature` con la chiave `key_id`."
    }
  },
  "integrity": {
    "sha256": "99eb38e8e5b9f6d23765f9d62818b2e5aae0b1b53ba2f7e7b0191c7537104d86",
    "signature": "ecdsa-p256-sha256:01dde7d4f64d676d333968721d217fa668ce0524bcb45e195f76dc129160fda2c308d7f0525cdfdfba67d6990cc60014296101d42aeb30e4901b1d95c91afb53",
    "key_id": "bkc-test-20260819-59c490",
    "alg": "ECDSA_P256_SHA256"
  }
}