Spoofing di un GUID

2

Al lavoro oggi stavo discutendo sull'identificazione di un utente tra due server Web che avranno accesso allo stesso DB di back-end. Ho suggerito di utilizzare un GUID per identificare la sessione utente , ma un collega ha detto che i GUID possono essere falsificati.

Tuttavia un rapido Google ha dimostrato che i GUID della versione 1 potevano essere facilmente falsificati, ma poiché Windows 2000 è stata implementata una nuova versione utilizzando dati pseudo (casuali), ovvero GUID versione 4, poiché lavoro in un ambiente di applicazione MS quanto è vero il mio asserzione di colleghi?

    
posta Graham Harris 21.04.2017 - 19:00
fonte

3 risposte

1

Hai affermato che sei interessato a considerare entrambe le collisioni generate da mezzi e attacchi "corretti" che implicano maliziosamente generare GUID in modo improprio. Le risposte a queste due situazioni sono straordinariamente diverse.

Se tutti i GUID che entrano nel tuo sistema sono generati con mezzi adeguati (cioè generati secondo RFC 4122, allora puoi aspettarti che siano tutti unici. I GUID / UUID sono stati progettati sin dall'inizio per fornire la garanzia specifica. UUID generato ovunque sarà unico da tutti gli altri GUID / UUID senza richiedere alcuna autorità centralizzata.Ci sono server Oracle che generano milioni di UUID al secondo in giganteschi database distribuiti senza collisioni.Gli UID / GUID sono stati creati per questo .

Se sei preoccupato per gli utenti malintenzionati che creano GUID / UUID in modo improprio, hai qualche preoccupazione. Da questa risposta relativa agli UUID :

GUIDs generated by calling other people's GUID generation functions are still not suitable for use as unguessable auth tokens though, because that's not the purpose of the GUID generation function - you're merely exploiting a side effect.

Questa risposta ha colpito l'unghia sulla testa. I GUID / UUID non sono mai stati progettati per essere ingestibili. Sono stati progettati per essere unici. Se il metodo che utilizzi per generare questi GUID / UUID fornisce l'inaffidabilità, si tratta di un effetto collaterale del processo. Dovresti indagare su come funziona il tuo particolare generatore.

Come hai notato, i GUID v1 sono particolarmente ipotizzabili. La loro univocità dipende interamente da un indirizzo MAC e da un timestamp con incrementi di 100ns. Questo è relativamente facile da spoofing. Se è possibile limitare il tempo in cui è stata generata una sessione, ad esempio 1/10 di secondo, sono disponibili solo 1.000.000 di valori. L'unica altra protezione che possiedi è il campo della sequenza di clock, che non è destinato a essere non diagnosticabile, quindi è probabile che rimanga lo stesso tra i riavvii di un computer.

v4, d'altra parte, è quasi completamente definito da un numero casuale di 122 bit. Questi sono altamente inaffidabili, purché tu possa fidarti del generatore di numeri casuali sottostante. Tuttavia, ricorda che stai facendo affidamento su un effetto collaterale del processo qui. Non ci sono garanzie sulla qualità del numero casuale perché non è richiesto per generare valori univoci - è solo richiesto per l'inaffidabilità.

Pertanto, se si dipende dalla casualità degli ID di sessione come funzionalità di sicurezza, è necessario generarli autonomamente, utilizzando un generatore di crittografia affidabile. Non c'è niente di sbagliato nell'usare il formato GUID per questi numeri. Avranno ancora più di abbastanza entropia per gestire le semplici chiavi di sessione. Il trucco è che non ci si deve fidare dei generatori GUID integrati per fornire garanzie che non fanno esplicitamente parte dello scopo della generazione GUID.

    
risposta data 22.07.2017 - 23:43
fonte
1

Il problema con la determinazione della sicurezza di un UUID v4 (sappiamo che gli UUID v1 non sono in alcun modo sicuri) è che devi conoscere e capire il meccanismo sottostante per generarli nella tua applicazione specifica, poiché questo potrebbe essere diverso per ogni implementazione e potrebbe sicuramente avere un impatto sulla sicurezza.

La chiave è che non stai cercando solo casualità, ma anche imprevedibile. Sappiamo che un UUID versione 4 ha 122 bit di casualità. Questo è molto buono, e se la fonte della casualità è un CSPRNG, allora possiamo essere sicuri che sì, è abbastanza ragionevolmente sicuro da usare come identificatore di sessione. Se, tuttavia, l'RNG è non un CSPRNG, esiste una possibilità certa che mentre gli UUID hanno buone proprietà di casualità statistica, possono comunque essere abbastanza prevedibili per un attaccante che ottiene le sue mani su un numero di loro per indovinare altri identificatori di sessione validi con una probabilità non banale e solo una quantità ragionevole di lavoro.

Quindi, se si conosce il modo in cui i GUID vengono generati per la propria applicazione, è possibile stabilire con molta più chiarezza se è sicuro utilizzarli direttamente per proteggere i dati della sessione.

    
risposta data 20.07.2017 - 21:51
fonte
0

Basato sulla documentazione per UuidCreate , questa risposta sulla dimensione di un UUID di Windows (da Windows 2000) e questa risposta sulla casualità UUID , e infine la RFC relativa alla creazione un GUID da numeri casuali , sembrerebbe che tu abbia ragione che i moderni sistemi Windows genereranno GUID di default usando un generatore di numeri casuali basato su AES, il che dovrebbe renderli ugualmente impraticabili rispetto a un identificatore casuale generato da lo stesso CSPRNG con lo stesso numero di bit casuali (122 bit). Come nota la seconda risposta, però, i GUID sono destinati a essere unici, non a difendersi dallo spoofing: il fatto che lo facciano con il loro metodo di generazione è effettivamente un effetto collaterale.

Come programmatore, due cose mi riguarderebbero dall'uso dei GUID come identificatori di sessione casuali

  1. Dato che non possiamo controllare realmente il codice sorgente per le funzioni sottostanti, è possibile che abbiano una qualche forma di protezione contro la generazione dello stesso numero due volte, il che potrebbe indebolirle come veri CSPRNG. Inoltre, in linea di principio, non utilizzo GUID come numeri casuali, perché non è il loro scopo documentato.

  2. L'utilizzo di un GUID limita l'entropia che il GUID è programmato per utilizzare: 122 bit. Dovrai riscrivere il tuo codice in futuro se vuoi iniziare ad utilizzare, ad es. 256 bit invece, mentre l'utilizzo di CSPRNG ora consente di modificare facilmente le dimensioni del numero generato successivamente.

risposta data 21.04.2017 - 19:32
fonte