Tecnico13 agosto 202616 min letto

Approfondimento ingegneristico: prove di manomissione su larga scala

In che modo KLA sigilla i pacchetti di prove: hashing canonico, doppie firme ES256, inclusione Merkle, raccolta di registri impaginati e verifica offline.

Antonella Serine

Antonella Serine

Fondatrice, KLA

Fondatrice di KLA, dove sviluppa il piano di controllo indipendente per la governance a runtime degli agenti IA regolamentati dall'EU AI Act.

Unità di tenuta

Un pacchetto di prove sigillate: manifest canonico, digest di artefatti SHA-256, una radice Merkle e un JWS ES256 staccato che trasporta due firme richieste.

Contratto di completezza

La raccolta del registro viene impaginata con un cursore esplicito e non riesce a chiudersi su qualsiasi pagina duplicata, di regressione, con chiave fuori prefisso o che non avanza.

Ancore

Il digest manifest sigillato è ancorato due volte: una prova OpenTimestamps e un'ancora del registro immudb con una prova della transazione verificabile.

Verifica

Un verificatore offline esegue nuovamente cinque controlli di integrità dal solo pacchetto e segnala ciascun risultato separatamente, inclusi i limiti dichiarati.

Evidenze di manomissione su larga scala implicano tre garanzie separabili. Integrità: ogni artefatto in un'esportazione ha il valore a cui si è impegnato un manifest firmato. Completezza: la raccolta che ha prodotto l'esportazione copriva la popolazione dichiarata o si rifiutava di sigillarsi. Verificabilità indipendente: un revisore esterno può eseguire nuovamente i controlli di integrità dal solo pacchetto, offline, e vedere il confine esatto di ciò che dimostrano tali controlli. Questo post illustra il modo in cui la pipeline delle prove spedite da KLA implementa ciascuna garanzia, dalla raccolta impaginata da un registro di sola aggiunta fino alla sigillatura, all'ancoraggio e alla verifica offline.

Audit trail dell'agente AI spiega perché i record di esecuzione necessitano di questo livello di prova e cosa contiene concettualmente un evidence pack. Questo compagno rimane nella sala macchine: costruzione dell'hash, formati di firma, invarianti di impaginazione e modalità di errore che ciascuno chiude.

Cosa significa pronto per l'audit una volta che il registro è grande

Ogni azione governata in KLA finisce in un registro immudb per tenant, di sola aggiunta: voci di audit, decisioni politiche, valutazioni dei gate, istantanee dei pacchetti di politiche e ricevute di governance firmate. In un inquilino impegnato il registro cresce senza limiti e arriva una richiesta di esportazione con un ambito: un'esecuzione, una decisione, una policy o una finestra di controllo completa.

A volume ridotto, un'esportazione è una query più un archivio. A volume elevato compaiono tre modalità di guasto silenzioso. Un limite di scansione lato server tronca un set di risultati senza errori. Una raccolta di lunga durata vede le scritture correre oltre il cursore. Un'esportazione parziale sembra identica a una completa, poiché l'assenza non lascia artefatti.

La risposta progettuale è trattare la completezza come una proprietà verificabile di prima classe della raccolta e l'integrità come una proprietà verificabile di prima classe dell'output sigillato. I due sono applicati da meccanismi diversi e verificati da controlli diversi, e il resto di questo post li tiene separati.

Le tre garanzie e dove ciascuna viene applicata
GaranziaDomanda a cui rispondeImposto daControllato da
IntegritàQuesti byte sono i byte sigillati?Digest SHA-256, radice Merkle, doppie firme ES256 su un manifest canonicoVerificatore offline: firma manifest, inclusione merkle
CompletezzaLa raccolta ha coperto la popolazione dichiarata?Impaginazione verificata dal cursore che non riesce a chiudersi in caso di violazione della coperturaErrori al momento della raccolta; connettività con grafico hash; maglie della catena di ricevute
Verificabilità indipendenteUn revisore può confermarlo senza fidarsi dell'infrastruttura KLA?Materiale di verifica incorporato nel pacchetto: chiavi, prove, ancoreLa CLI @kla/evidence-verifier viene eseguita offline nella directory del bundle

Il bundle su disco

Un Sealed Evidence Bundle è un archivio zip con un layout fisso. Tutto ciò di cui un verificatore ha bisogno viaggia al suo interno: il manifest, la firma distaccata, le chiavi pubbliche, entrambe le prove di ancoraggio, e gli artefatti stessi.

Il manifest registra l'identità e l'ambito dell'esportazione, l'entità richiedente, gli snapshot delle policy con gli hash dei pacchetti, l'elenco completo degli artefatti con digest e dimensioni SHA-256 per file, la radice Merkle su tale elenco, il profilo di redazione, le omissioni dichiarate e un blocco di integrità che nomina gli algoritmi di hash e firma e il set di ancoraggi.

Layout del bundle canonico
<bundle-dir>/
  bundle.json          seal summary: digests, signer set, anchor references
  manifest.json        full manifest: population, artifacts, integrity block
  manifest.jws.json    detached ES256 JWS over the manifest digest
  keys/jwks.json       public verification keys embedded for offline use
  timestamp.ots        OpenTimestamps proof over the manifest digest
  ledger_anchor.json   immudb anchor record for the sealed digest
  artifacts/
    exports/...        exported evidence files
    index/artifact_index.json

Sigillatura: byte canonici, un digest, due firme

La firma JSON in modo sicuro richiede una rappresentazione stabile in byte. L'esportatore canonicalizza il manifest con JSON canonico in stile JCS (RFC 8785): chiavi ordinate per punto di codice, nessun valore indefinito, nessun numero non finito. I campi che possono essere compilati solo dopo la firma, come l'hash manifest stesso e l'hash del valore di ancoraggio del registro, vengono cancellati prima della digestione in modo che i byte impegnati siano ben definiti. Lo SHA-256 di quei byte canonici è il digest manifest e ogni impegno downstream si lega ad esso.

Sono necessarie due firme su quel digest, prodotte come ES256 JWS distaccato. La chiave dell'ambiente di servizio (SEK) afferma quale ambiente KLA ha sigillato il pacchetto. La chiave di prova dell'inquilino (TEK) vincola il sigillo a un inquilino; il suo ID chiave porta l'identificatore del tenant. L'esportatore impone che le due chiavi siano distinte e che in produzione risiedano entrambe in HashiCorp Vault Transit come chiavi ECDSA P-256 non esportabili, quindi la firma avviene all'interno di Vault e il materiale privato non raggiunge mai il processo di esportatore.

L'integrità dell'artefatto utilizza una costruzione Merkle dedicata, kla-merkle-v1. Ogni foglia ha un byte di separazione del dominio, il percorso dell'artefatto e il digest dell'artefatto; l'elenco delle foglie è ordinato per byte di percorso; i nodi interni hanno un prefisso distinto sui loro figli. Il manifest sigilla la radice e il bundle contiene una prova di inclusione per artefatto, in modo che un revisore possa confermare che un singolo file appartiene al set sigillato senza rielaborare l'intero archivio.

Le ricevute di governance arrivano nel pacchetto già firmato. Durante un'esecuzione governata, ogni passaggio sigilla una ricevuta firmata ed25519- il cui contenuto include prevReceiptHash, l'indirizzo del contenuto della ricevuta precedente. L'hash risiede all'interno del payload firmato, quindi la firma copre l'anello stesso della catena. Le voci di controllo contengono una seconda catena di hash a livello di applicazione: ogni record memorizza l'hash del suo predecessore, calcolato al momento della scrittura rispetto all'ultimo hash del registro del tenant.

Riepilogo dei sigilli bundle.json (valori rappresentativi)
{
  "bundleSpec": "evidence-room-bundle-v1",
  "manifestDigestSha256": "4b7f0e0d2b9a51c6f3e8d1a07c5b2e94a6d803f1c2e75b09d4a1f6c8e3b25a70",
  "merkleRootSha256": "a1c9f2d84e07b6531f8c0d2ae95b47c6d310e8f2a7c54b90e6d1a3f8c2b7e415",
  "artifactCount": 214,
  "requiredSigners": [
    "sek",
    "tek"
  ],
  "timestamping": {
    "type": "opentimestamps-bitcoin-mainnet",
    "receiptPath": "timestamp.ots"
  },
  "ledger": {
    "type": "immudb",
    "anchorPath": "ledger_anchor.json"
  }
}

Ancoraggio della guarnizione all'esterno dell'impianto

Una firma prova chi ha sigillato la lista. Ancoraggi vincolati quando e registrazione del sigillo in sistemi che l'esportatore non controlla successivamente.

Il primo ancoraggio è una prova OpenTimestamps sul manifest digest, impegnata nei confronti della blockchain di Bitcoin. Il timestamp è fail-closed: un'esportazione con timestamp disabilitato o un timbro non riuscito si rifiuta di sigillare e una distribuzione può inoltre richiedere che la prova sia attestata da Bitcoin prima del completamento dell'esportazione.

La seconda ancora riscrive il digest manifest nel registro immudb con una chiave derivata dal tenant e dagli ID di esportazione, utilizzando una scrittura verificabile. Il record di ancoraggio nel pacchetto contiene l’ID della transazione e la prova della transazione del server, e il verificatore offline verifica successivamente che la prova leghi effettivamente quella chiave e quel valore a quella transazione. Se la scrittura dell'ancora fallisce, l'esportazione fallisce.

Gli errori di ancoraggio e gli errori di prova non mascherano mai un'azione eseguita. Un percorso di scrittura danneggiato viene registrato come danneggiato e un bundle sigillato che non è riuscito a ottenere l'ancoraggio richiesto viene segnalato in uno stato di errore con un motivo denominato.

Raccolta sotto carico: impaginazione come protocollo verificato

Il server immudb limita la scansione del prefisso alle voci 1,000 per pagina. Un'ingenua scansione senza pagine di un grande registro degli inquilini tronca silenziosamente, il che è il peggior fallimento possibile come prova: un fascio plausibile a cui manca la coda. Il collector pertanto tratta l'impaginazione come un protocollo con invarianti e ogni violazione di invarianti interrompe l'esportazione con un IncompleteLedgerCoverageError.

Ogni pagina viene richiesta con una chiave di ricerca esplicita, l'ultima chiave consegnata dalla pagina precedente. Le pagine scorrono attraverso un gestore non appena arrivano; nulla si accumula illimitatamente nella memoria. Una scansione termina solo quando una pagina non raggiunge il limite o viene superato il limite configurato dell'intervallo e ogni pagina viene controllata prima che le sue righe vengano considerate coperte.

Per scansioni estese e di volume elevato, i corpi dei record candidati si riversano sul disco come JSON delimitato da nuova riga durante la scansione e vengono reidratati successivamente in batch limitati con un budget ponderato in byte, mantenendo in memoria al massimo una pagina di corpi di dimensione massima alla volta. Budget fissi legati a letture, byte, concorrenza e tempo di clock, inclusa una scadenza di inattività che viene reimpostata da una pagina di avanzamento verificata e una scadenza assoluta che non viene reimpostata da nulla. Raggiungere un budget significa rifiutarsi di sigillarlo, con il budget indicato nell'errore.

  • Pagina di grandi dimensioni: una pagina con più righe di quelle richieste interrompe la scansione.
  • Riga senza chiave: ogni riga deve contenere la chiave da cui dipende l'impaginazione.
  • Chiave fuori dal prefisso: una chiave restituita all'esterno del prefisso scansionato viene interrotta.
  • Chiave di regressione: le chiavi devono rigorosamente avanzare in ordine di byte tra le pagine.
  • Chiave duplicata: una chiave vista due volte in una scansione viene interrotta.
  • Cursore che non avanza: una pagina incompleta il cui ultimo tasto non riesce a spostare la posizione di ricerca viene interrotta, chiudendo contemporaneamente i casi di ciclo infinito e di troncamento silenzioso.

Affermare la completezza alla fine

Sopravvivere alla scansione è necessario e non sufficiente. Quando una raccolta con ambito termina, il raccoglitore asserisce che ogni selettore richiesto (ID di esecuzione, ID di record di derivazione, ID di richiesta di decisione, ID di policy, framework, controlli) è stato effettivamente soddisfatto dalle voci raccolte e interrompe con i selettori mancanti elencati se non lo erano.

Ogni voce raccolta deve inoltre contenere un'attestazione attendibile: proviene dalla fonte immudb, la risposta del server è stata verificata rispetto allo stato di attendibilità mantenuto localmente e la prova di inclusione verificata rispetto alla root della risposta. Le voci che non soddisfano tale predicato vengono escluse e registrate come omissioni con un codice motivo stabile anziché esportate come se fossero affidabili. Il manifest riporta quindi la copertura per sezione come completa, parziale, mancante o non applicabile, con le motivazioni per qualsiasi cosa non sia completa.

Due controlli strutturali chiudono i casi che l'impaginazione non può vedere. Il grafico hash di audit deve essere connesso: poiché gli autori concorrenti possono competere con il puntatore dell'hash più recente, il registro forma un grafico aciclico diretto anziché una linea rigorosa e il verificatore richiede esattamente una radice; una seconda radice indica che manca un membro nell'esportazione o che esiste una seconda genesi. Le catene di ricevute verificano i loro collegamenti prevReceiptHash dalla genesi all'ultimo; una catena non può rilevare il troncamento alla sua estremità solo dai collegamenti, quindi la completezza è il contratto del chiamante e il verificatore accetta un hash terminale previsto per colmare quel divario finale quando il chiamante ne ha uno.

I meccanismi di completezza e il fallimento si chiudono ciascuno
MeccanismoModalità di errore chiusaEsito in caso di violazione
Impaginazione verificata dal cursoreTroncamento lato server, pagine saltate o ripetuteErrore di copertura del registro incompleto; l'esportazione si interrompe
Asserzione del selettore di fine scansioneUn record richiesto, silenziosamente assente dalla scansione del registroErrore nell'elenco di tutti i selettori insoddisfatti
Predicato di fiducia dell'attestazioneUna risposta del server contraffatta o non verificata che entra nel bundleVoce omessa con codice motivo stabile
Connettività con grafico hash (radice singola)Un membro rimosso dal centro del registro esportatoil controllo della catena hash del registro non riesce offline
Collegamenti della catena di ricevute + hash terminale previstoUn percorso governato troncato a metà del corso d'acqua o alla sua fineil controllo delle firme delle ricevute non riesce offline

Verifica indipendente: cosa esegue effettivamente un revisore

Il pacchetto @kla/evidence-verifier fornisce una CLI che prende una directory del bundle ed esegue nuovamente i controlli di integrità offline, solo dal contenuto del bundle, senza alcun servizio KLA nel ciclo. Ogni report di controllo supera o fallisce con i propri errori e il processo esce con un valore diverso da zero in caso di errore, quindi l'esecuzione passa direttamente a uno script o a un lavoro CI. Una modalità JSON emette il risultato completo leggibile dalla macchina. Un controllo opzionale analizza il pacchetto alla ricerca di indicatori vietati forniti dal chiamante, segnalando le corrispondenze solo come prefissi hash.

Esecuzione del verificatore (output rappresentativo)
$ evidence-verifier ./export-2026-08 --json > result.json
$ evidence-verifier ./export-2026-08
Evidence bundle: ./export-2026-08
PASS  manifest-signature    SEK and TEK ES256 signatures verify over the manifest digest
PASS  receipt-signatures    41 receipt chains verify from genesis to last
PASS  ledger-hash-chain     1,842 ledger records recompute; hash graph resolves to one root
PASS  merkle-inclusion      214 artifacts match their digests and inclusion proofs
PASS  ots-anchor            timestamp.ots commits to the manifest digest
Result: PASS (5/5 checks passed)
I cinque controlli sempre attivi
ControlloCosa ricalcolaCiò che stabilisce un passaggio
firma-manifestoDigest manifesto canonico; Firme SEK e TEK ES256; identità di ancoraggio del registro, hash del valore e prova della transazioneI byte manifest sono i byte firmati da entrambe le chiavi e la prova di ancoraggio lega il digest sigillato a una transazione del registro
firme di ricevutaOgni firma di ricevuta ed25519 su byte di ricevuta canonici; collegamenti prevReceiptHash, dalla genesi all'ultimoLa ricevuta di ogni passaggio regolato è autentica e l'ordine di esecuzione è l'ordine firmato
ledger-hash-chainL'hash memorizzato di ciascun record del registro; connettività del grafico nel set esportatoNessun record di controllo esportato è stato modificato e non manca alcun membro all'interno del grafico
inclusione di MerkleOgni manufatto viene riassunto e dimensionato; ogni prova di inclusione fino alla radice Merkle sigillataOgni file nell'archivio è il file su cui è stato eseguito il commit del manifest, senza aggiunta o sostituzione di nessuno
ots-ancoraIl digest impegnato della prova OpenTimestamps rispetto al digest manifest ricalcolatoLa prova del timestamp si impegna a questo manifest esatto

I limiti dichiarati della prova offline

Una storia di verifica onesta definisce il proprio confine e il confine del verificatore è dichiarato nella sua documentazione e nella pagina pubblicata prove a prova di manomissione.

La verifica offline dimostra la coerenza interna. Le chiavi pubbliche viaggiano all'interno del pacchetto, quindi per legarle a KLA è necessario fissarle fuori banda rispetto a un set di chiavi pubblicato da KLA; senza questo passaggio, una falsificazione effettuata da zero con chiavi nuove si autoverificherebbe. L'attestazione Bitcoin all'interno della prova del timestamp porta un'altezza di blocco che il controllo offline accetta come richiesta; confermarlo o aggiornare una ricevuta del calendario in sospeso richiede la catena live. La prova di ancoraggio di immudb lega il digest sigillato a una transazione del registro e la conferma dell'inclusione della transazione rispetto allo stato firmato del registro richiede un controllo in rete.

Questi limiti sono modellati piuttosto che vaghi: ognuno corrisponde a una verifica specifica che un revisore motivato può eseguire con l’infrastruttura pubblica, e nessuno di essi indebolisce ciò che l’esecuzione offline dimostra sui byte in mano.

Percorsi negativi: la suite antimanomissione

La suite di test del verificatore costruisce un bundle di dispositivi valido e poi lo suddivide un byte alla volta, affermando che ogni superficie trasforma esattamente il segno di spunta rosso giusto: un byte capovolto in un file di prova fallisce l'inclusione di Merkle; in una firma di ricevuta o nel corpo della ricevuta, firme di ricevuta; in un record di registro o nel suo hash archiviato, ledger-hash-chain; nella radice Merkle sigillata o nel digest dichiarato, il corrispondente controllo del sigillo; nella prova timestamp, ots-anchor.

Gli attacchi alla forma della firma sono coperti insieme alla manomissione del contenuto: una variante malleabile con S alta di una firma ECDSA valida viene rifiutata, così come una firma RSA valida presentata sotto un'intestazione ES256 e qualsiasi firma che non sia esattamente la codifica 64-byte P-1363. Il comportamento di chiusura in caso di errore ottiene una propria suite: una prova di timestamp mancante, chiavi mancanti, un'ancora del registro mancante, una ricevuta firmata da una chiave revocata e un percorso di artefatto che sfugge alla directory del bundle falliscono tutti e il percorso di fuga viene rifiutato senza leggere il file esterno.

Dal lato della raccolta, i test dell'esportatore spingono il cercapersone oltre il limite di scansione del server, riproducono chiavi duplicate e regredenti, forzano i budget di byte oltre i loro limiti e affermano che le raccolte con ambito non vengono chiuse quando un intervallo non può stabilire un'impaginazione completa. Il meccanismo della completezza si esercita come comportamento in prova, sugli stessi percorsi di codice che percorrono le esportazioni di produzione.

Domande frequenti

Cosa contiene un pacchetto di prove sigillate?

Un manifest che elenca l'ambito dell'esportazione, gli snapshot delle policy e ogni artefatto con il relativo digest SHA-256; un ES256 JWS separato con le firme del servizio e dell'inquilino sul digest canonico del manifest; le chiavi pubbliche di verifica; una prova OpenTimestamps e un'ancora di registro immudb sullo stesso digest; e gli artefatti con una prova di inclusione Merkle ciascuno.

In che modo l'esportazione dimostra la completezza anziché solo l'integrità?

La completezza viene applicata durante la raccolta: l'impaginazione verificata dal cursore si interrompe su qualsiasi pagina troncata, duplicata, regredita o che non avanza; le asserzioni di fine scansione richiedono che ogni selettore richiesto sia soddisfatto; e l'output sigillato comporta controlli strutturali (un grafico hash a radice singola e catene di ricevute firmate) che falliscono offline se un membro viene rimosso.

Un revisore può verificare un pacchetto senza accedere ai sistemi KLA?

SÌ. La CLI @kla/evidence-verifier esegue nuovamente i controlli offline della firma del manifest, della firma della ricevuta, della catena di hash del registro, dell'inclusione di Merkle e dell'ancoraggio del timestamp solo dalla directory del bundle ed esce con un valore diverso da zero in caso di errore. L'associazione delle chiavi incorporate a KLA richiede un passaggio fuori banda: fissarle a un set di chiavi pubblicato da KLA.

Cosa succede quando la raccolta non riesce a coprire la popolazione richiesta?

L'esportazione si rifiuta di sigillare. Le violazioni della copertura generano un errore nella denominazione dell'invariante violato o dei selettori insoddisfatti, l'esaurimento del budget genera un errore nella denominazione del budget e le voci prive di un'attestazione attendibile vengono omesse con un codice motivo stabile registrato nel manifest.

Cosa non può stabilire la verifica offline?

Tre cose, ciascuna chiudibile con un passaggio in rete: provenienza della chiave (appuntare le chiavi incorporate su un set pubblicato), l'altezza del blocco dell'attestazione Bitcoin (confermare contro la catena) e l'inclusione dell'ancora immudb nello stato firmato del registro (un controllo del registro in rete).

Perché il registro di revisione viene verificato come un grafico anziché come una linea retta?

Gli scrittori simultanei possono competere con il puntatore dell'hash più recente, quindi due record possono fare legittimamente riferimento allo stesso predecessore. Il verificatore quindi controlla la connettività: l’hash predecessore di ogni record non di genesi deve risolversi all’interno dell’esportazione e il grafico deve avere esattamente una radice. Una seconda radice significa che manca un membro o che è presente una seconda genesi.

Punti chiave

Il controllo su larga scala si decompone in meccanismi ciascuno dei quali fallisce clamorosamente: byte canonici sotto due firme, una radice Merkle su ogni artefatto, due ancoraggi indipendenti sul digest sigillato, impaginazione che tratta ogni violazione della copertura come un rifiuto di sigillare e un verificatore offline che esegue nuovamente i controlli e definisce i propri limiti. Per il livello concettuale sopra questa pipeline, iniziare con audit trail dell'agente AI e la definizione di evidence pack; per valutare un processo di prova rispetto a queste proprietà, utilizzare l'elenco di controllo del pacchetto di prove e il riferimento record di esecuzione dell'agente AI.

Guardalo in azione

Pronti ad automatizzare la raccolta delle evidenze di compliance?

Prenotate una demo di 20 minuti per scoprire come KLA vi aiuta a dimostrare la supervisione umana e ad esportare documentazione Annex IV pronta per l'audit.

Approfondimento ingegneristico: prove di manomissione su larga scala | KLA Blog