Vai al contenuto principale

Panoramica

Gli avvisi nel report di rilevamento della vitalità segnalano ogni condizione rilevata da Didit durante l’esecuzione del controllo di vitalità. Vengono inseriti nell’array warnings[] di ogni elemento di liveness_checks[] (vedi Report di rilevamento della vitalità), con feature impostato su "LIVENESS". Ogni voce segue la struttura condivisa dell’oggetto avviso: feature, risk, additional_data, log_type, short_description, long_description, node_id. Ogni avviso è composto da tre livelli:
  1. Il codice risk — un identificatore stabile che puoi verificare nel tuo codice (i codici sono elencati di seguito).
  2. Il log_type — uno tra information, warning o error. I rischi di rifiuto automatico presentano sempre error. Per i rischi configurabili viene ricavato dall’azione configurata: Nessuna azione → information, Revisione → warning, Rifiuta → error. Per i rischi basati su soglie (LOW_LIVENESS_SCORE, LOW_FACE_QUALITY) è error quando il valore raggiunge o scende al di sotto della soglia di rifiuto e warning quando raggiunge o scende al di sotto solo della soglia di revisione.
  3. L’impatto sulla decisione — lo stesso routing determina lo status del report di rilevamento della vitalità: un’azione Revisione lo sposta su In Review, un’azione Rifiuta (o qualsiasi rischio di rifiuto automatico) su Declined, mentre Nessuna azione lo lascia invariato.
Alcuni rischi vengono emessi solo quando il metodo di rilevamento della vitalità è PASSIVE (controlli su volti multipli, qualità e luminanza). Le tabelle seguenti elencano la serie completa di codici di rischio di vitalità e i relativi livelli di gravità — non esistono altri codici di rischio per la vitalità.

Condizioni di rifiuto automatico

I seguenti rischi impostano sempre il report di rilevamento della vitalità (e la sessione) su Declined, con log_type: "error": Quando si attiva NO_FACE_DETECTED, LOW_LIVENESS_SCORE viene soppresso (non c’è alcun volto a cui assegnare un punteggio).

Impostazioni di verifica configurabili

Nella console Didit, i rischi di vitalità sono raggruppati nelle seguenti impostazioni del workflow:

Avvisi generati

Vitalità principale

Integrità del canale di acquisizione

Segnali di attacco di iniezione segnalati dal client al momento dell’acquisizione. A differenza degli attacchi di presentazione (un artefatto posto davanti a una fotocamera reale), questi descrivono la sostituzione o l’intercettazione del feed della fotocamera stesso. Ciascuno è configurabile per workflow e l’impostazione predefinita è nessuna azione, quindi l’abilitazione della funzionalità non modifica alcuna decisione finché non attivi esplicitamente la funzionalità.
I browser non espongono alcuna attestazione a livello di sistema operativo sull’origine della fotocamera a nessun fornitore, quindi sul web questi segnali costituiscono prove a supporto piuttosto che prove certe. Sul web, un verdetto pari a null indica non determinato (le etichette dei dispositivi non sono disponibili finché non viene concesso il permesso per la fotocamera) e non genera mai un rischio.
Una fotocamera virtuale viene identificata dal nome del dispositivo, quindi una fotocamera che il sistema operativo presenta con un nome comune non viene riconosciuta in questo modo. All’interno di un emulatore Android la fotocamera rimappata viene etichettata come una qualsiasi integrata, motivo per cui il caso dell’hardware emulato viene segnalato tramite FRAME_INJECTION_SUSPECTED: viene rilevato dall’ambiente del dispositivo (lo stack di rendering e il modello del dispositivo segnalati nello user agent) anziché dal nome della fotocamera. I rilievi generati dall’ambiente del dispositivo contengono additional_data.reason: "emulated_capture_device", distinguendosi così dall’analisi dei frame eseguita dal modello di liveness stesso.
Il rilevamento della macchina da un browser costituisce una prova indiziaria, non un’attestazione, e un utente malintenzionato determinato può interferire con esso. Gli SDK nativi per dispositivi mobili segnalano segnali di integrità più solidi a livello di sistema operativo che un browser non può rilevare (emulatore, dispositivo sottoposto a root o jailbreak, hooking del runtime, debugger collegato), ciascuno con la propria azione configurabile in Integrità del runtime e del dispositivo. Questi segnali aumentano notevolmente i costi per l’attaccante, ma da soli non provano che un’acquisizione provenga da un dispositivo autentico. I segnali di integrità del dispositivo sono indipendenti dal metodo di liveness, pertanto si combinano con qualsiasi modalità tra Passiva, 3D Flash o 3D Action & Flash.

Analisi forense dell’integrità della registrazione

LIVENESS_VIDEO_ANOMALY viene calcolato lato server sulla registrazione di liveness archiviata, indipendentemente dal modello di liveness. Rileva una sequenza in movimento ripetuta su più cicli, compatibile con un feed riprodotto in loop. Imposta l’azione sul tuo nodo Rilevamento della vitalità o Stima dell’età: NO_ACTION registra un rilievo informativo, REVIEW può far passare una verifica con decisione presa allo stato In revisione, e DECLINE può farla passare a Rifiutata. Il controllo viene eseguito in modo asincrono, quindi un’escalation può arrivare dopo il risultato iniziale. Una decisione esistente più severa non viene declassata e le decisioni di revisione manuale vengono mantenute. I rilievi della versione 2 includono forensics_version: 2, prove di repeated_sequence e repeated_moving_sequence in anomaly_reasons. Le misurazioni di consegna come unique_frame_ratio, static_pair_ratio, decoded_fps_ratio e max_frame_gap_seconds rimangono diagnostiche; non possono da sole dimostrare che si tratta di un replay. I rilievi più datati descrivono la versione del rilevatore utilizzata all’epoca e non vengono riclassificati retroattivamente.
Si tratta di un segnale aggiuntivo prudenziale, non di un rilevamento completo di media sintetici o video iniettati. Una registrazione senza anomalie non costituisce una prova di vitalità. Acquisizioni brevi o ambigue e acquisizioni prive di prove di replay utilizzabili non vengono contrassegnate da questo controllo. Le registrazioni mancanti o illeggibili non producono alcun rilievo da questo controllo; continuano ad applicarsi gli altri controlli di verifica.

Confronto facciale tra sessioni

Per le corrispondenze con volti importati o voci di elenco (che non hanno una sessione), i valori di *_session_id, *_session_number e api_service in additional_data sono null. I volti appartenenti allo stesso utente (stesso vendor_data, o lo stesso utente vendor quando disponibile) sono esclusi dall’intera ricerca nell’indice — sia dal rilevamento dei duplicati sia dallo screening delle blocklist. L’ordine di precedenza delle corrispondenze è: blocklist esatta → allowlist esatta → duplicato esatto → blocklist possibile → allowlist possibile → duplicato possibile — solo uno di questi sei codici mutuamente esclusivi compare per ciascun report. DUPLICATED_FACE_NAME_MISMATCH non fa parte di questo gruppo di precedenza: è un codice aggiuntivo emesso in aggiunta a DUPLICATED_FACE quando fallisce anche il controllo dell’identità, mai al suo posto. additional_data.name_match_score non include mai i nomi messi a confronto — solo gli ID e un punteggio, evitando così l’inclusione di PII nel payload dell’avviso. Un nome scritto in un sistema di scrittura diverso su ciascun documento (ad esempio ebraico su uno e latino sull’altro) può ottenere un punteggio inferiore alla soglia anche se entrambe le sessioni appartengono alla stessa persona. In questo caso specifico, DUPLICATED_FACE_NAME_MISMATCH non viene emesso se i documenti d’identità delle due sessioni si confermano a vicenda su tutti i seguenti elementi:
  • Entrambi i documenti riportano lo stesso stato emittente.
  • Un identificativo corrisponde esattamente tra i due documenti. document_number e personal_number sono intercambiabili, poiché lo stesso numero nazionale può comparire in entrambi i campi a seconda del tipo di documento.
  • Laddove entrambi i documenti riportino una data di nascita, questa corrisponde alla stessa data.
Se i nomi utilizzano lo stesso sistema di scrittura, se l’identificativo o lo stato emittente differiscono o sono assenti, oppure se le date di nascita sono in contrasto tra loro, l’avviso viene comunque emesso come descritto in precedenza.

Qualità della vitalità passiva (solo quando method = "PASSIVE")

LOW_FACE_LUMINANCE e HIGH_FACE_LUMINANCE sono mutuamente esclusivi — la luminanza è o inferiore al minimo o superiore al massimo, mai entrambi.

Stima dell’età (workflow adattivi e nodi AGE_ESTIMATION)

Stringhe di descrizione esatte

L’API restituisce queste stringhe esatte di short_description e long_description per ciascun rischio:

API autonoma di rilevamento passivo della vitalità

La Liveness API standalone riutilizza gli stessi codici di rischio con alcune differenze di comportamento:
  • NO_FACE_DETECTED e LOW_LIVENESS_SCORE si escludono a vicenda: il controllo del punteggio viene eseguito solo se viene trovato un volto. LOW_LIVENESS_SCORE si attiva rispetto al valore di face_liveness_score_decline_threshold della richiesta (predefinito 30) e restituisce sempre log_type: "error".
  • POSSIBLE_FACE_IN_BLOCKLIST viene gestito come un rifiuto (log_type: "error") invece che come revisione.
  • MULTIPLE_FACES_DETECTED restituisce log_type: "warning", mentre i rischi legati a volti duplicati rimangono informativi. Solo gli avvisi di livello error impostano il campo status della risposta standalone su Declined.
  • Le voci di avviso standalone includono feature ma nessun node_id.

Esempi

Rifiuto automatico su attacco rilevato

Avvisi configurabili su un’acquisizione passiva

Volto duplicato con payload

In questo caso l’azione per il volto duplicato è impostata su Review, quindi l’avviso include log_type: "warning" e lo stato del report di rilevamento della vitalità è In Review. Con l’impostazione predefinita (No action) includerebbe invece log_type: "information". api_service è null perché il volto corrispondente proveniva da una sessione di workflow e non da una chiamata API autonoma.

Volto duplicato con un nome diverso

DUPLICATED_FACE mantiene l’azione configurata (qui, No action — log_type: "information"), mentre DUPLICATED_FACE_NAME_MISMATCH riporta la propria azione, che per impostazione predefinita è Review (log_type: "warning"). Lo stato del report di rilevamento della vitalità assume il livello più grave tra i due: qui In Review, anche se la sola impostazione del volto duplicato non lo avrebbe segnalato.

Anomalia di integrità della registrazione con le relative misurazioni

Questo esempio mostra le prove di replay provenienti da una registrazione contenente tre copie di una sequenza in movimento. log_type è information perché l’azione configurata è NO_ACTION. La diagnostica della consegna dei frame, omessa in questo esempio per brevità, non attiva la segnalazione.

Tipi di avviso

A ciascun rischio viene assegnata una gravità in base alla configurazione della tua applicazione. I tre livelli di gravità sono:

Correlati

Ultima modifica il 7 novembre 2026