I segreti possono essere resi sicuri nella memoria?

8

Supponiamo che eseguo un'applicazione su un server cloud come AWS. Supponiamo che fornisca una chiave in fase di esecuzione (quindi non è memorizzata da nessuna parte a fianco / all'interno del codice), esiste un modo per proteggere questa chiave in memoria?

Quindi, se un utente malintenzionato accede al server remoto in un secondo momento, non dovrebbe essere in grado di estrarre la chiave dalla memoria. Ci sono dei modi per raggiungere questo obiettivo? O è noto per essere teoricamente impossibile?

La tecnica discussa qui , la sicurezza di runtime trasparente, viene richiesta per renderla" difficile ", ma potrebbe comunque essere calcolabile.

EDIT: anche le soluzioni basate su hardware sono ok.

    
posta Jus12 03.05.2016 - 08:51
fonte

5 risposte

6

Ho risposto a una domanda simile qui . Per una normale soluzione hardware, un modulo di sicurezza hardware (HSM) fa questo. Per il software, .NET offre la stringa protetta meccanismo per crittografare e proteggere i dati sensibili nella RAM. Altre piattaforme possono offrire qualcosa di simile. Per una soluzione AWS, Amazon offre CloudHSM fare praticamente quello che chiedi, credo.

Da AWS:

HSM is short for Hardware Security Module. It is a piece of hardware — a dedicated appliance that provides secure key storage and a set of cryptographic operations within a tamper-resistant enclosure. You can store your keys within an HSM and use them to encrypt and decrypt data while keeping them safe and sound and under your full control. You are the only one with access to the keys stored in an HSM.

The AWS CloudHSM service brings the benefits of HSMs to the cloud. You retain full control of the keys and the cryptographic operations performed by the HSM(s) you create, including exclusive, single-tenant access to each one. Your cryptographic keys are protected by a tamper-resistant HSM that is designed to meet a number of international and US Government standards including NIST FIPS 140-2 and Common Criteria EAL4+.

    
risposta data 03.05.2016 - 20:14
fonte
3

Mentre tutti gli altri hanno suggerito una soluzione hardware, suggerirò una soluzione software (anche se non intendo implicare che sia migliore o peggiore dell'utilizzo di un HSM - che dovrai decidere autonomamente per i tuoi bisogni). Questa soluzione è una patch del kernel che crittografa i processi.

RamCrypt è un progetto che crittografa la maggior parte della memoria dei singoli processi con AES128 in modalità XEX, quindi tutti i segreti nei processi sono sicuri nella memoria, anche se tutta la memoria è acquisita in modo forense. La memoria è crittografata con TRESOR, quindi la chiave di crittografia non è mai presente nella RAM. Mantiene la chiave nei registri di debug di x86, quindi non ha memoria e fa tutto il calcolo AES utilizzando AES-NI, registri generali e registri SSE, quindi non entra mai nella memoria principale o nella cache della CPU. La chiave viene quindi utilizzata per crittografare e decrittografare le pagine di memoria per un intero processo. Solo 4 pagine vengono mantenute non crittografate e tutte le altre sono crittografate. Quando è necessario accedere a una pagina crittografata, viene decodificata utilizzando il tasto AES e una delle 4 pagine non crittografate è crittografata. RamCrypt viene fornito come patch del kernel e puoi regolare il numero di pagine che rimangono non criptate per scegliere un compromesso tra prestazioni e sicurezza. Vedi la pagina principale del progetto e il associato documento di ricerca .

    
risposta data 04.05.2016 - 00:17
fonte
1

Non sono sicuro se ti capisco bene. Ma a un certo punto il semplice segreto deve essere in una sorta di memoria (molto probabilmente la RAM). Se l'attaccante può leggere la memoria a quel punto e se è in grado di trovare il segreto, può decrittografare i dati in seguito.

Penso che teoricamente non ci possa essere un modo (magari con qualche speciale modulo di sicurezza che contiene il codice del tuo programma) per salvare il segreto in memoria senza che l'aggressore possa trovarlo. C'è sempre un algoritmo che può trovare la chiave (deve esserci perché vuoi usare la chiave nel tuo codice). Ma come sottolineato nel documento, può essere davvero difficile trovare la chiave.

Solo una nota a margine: non vedo nemmeno il caso d'uso di generare un segreto casuale che nessuno conosce e quindi non lo memorizza da nessuna parte.

Saluti

    
risposta data 03.05.2016 - 09:21
fonte
1

Fondamentalmente, non c'è nulla che possa risolvere questo problema in assoluto. Ti stai imbattendo nel problema del DRM, ovvero che hai bisogno dell'accesso in testo normale ad alcuni dati su un sistema per soddisfare alcune funzionalità, ma stai anche ponendo il sistema sotto il controllo di una parte che non è affidabile. Il meglio che puoi fare è renderlo incredibilmente difficile per tutti tranne che per gli attaccanti più determinati e abili, il che li rende essenzialmente un cattivo rapporto costo / beneficio per loro.

In termini di soluzioni che lo rendono difficile, dispositivi come Hardware Security Modules (HSM) dovrebbero essere più o meno in cima alla tua lista. Utilizzano una serie di funzionalità progettate per rendere estremamente difficile il recupero delle informazioni da loro illegittimamente. Ad esempio, una caratteristica comune è quella di crittografare i dati con una chiave memorizzata nella memoria volatile (ad esempio DRAM) su una scheda separata, fisicamente collegata alla parte superiore del dispositivo. Le connessioni di alimentazione e dati per questa scheda vengono fornite tramite un connettore di contatto (spesso realizzato in polimero conduttivo o schiuma) tramite pastiglie sulla scheda principale, che è fisicamente collegata alla parte inferiore del dispositivo. Se si tenta di aprire il dispositivo, si separano le schede, scollegando quindi l'alimentazione dalla DRAM e perdendo le chiavi. Possono essere presenti sensori aggiuntivi come luce, temperatura, pressione, accelerazione e posizione (incluso GPS) e persino campi magnetici o radiazioni per rilevare diversi tipi di manomissione.

Un altro potenziale sistema che potrebbe, in alcune circostanze, essere utile per te è il concetto di sistemi di crittografia omomorfici . L'omomorfismo, in parole povere, è essenzialmente di proprietà di un crittosistema che consente di eseguire determinate operazioni sui dati in forma crittografata, senza dover prima decodificare i dati. Esistono vari schemi disponibili, alcuni dei quali sono addirittura pratici per determinati tipi di scenari, ma sono di solito piuttosto complessi e possono essere particolarmente lenti. Sono inconsapevole di qualsiasi crittosistema esistente che fornisce l'omomorfismo in modo da favorire le applicazioni di cloud storage.

    
risposta data 03.05.2016 - 21:20
fonte
1

Dipende.

Altri poster suggeriscono un HSM. Questa può essere una buona soluzione per un insieme limitato di scopi in cui è necessario accedere temporaneamente a una chiave, viene cancellata dalla memoria attiva in seguito e la chiave per HSM non viene archiviata in memoria a lungo termine.

Sembra che tu abbia bisogno del segreto per essere sempre attivo nella memoria e non archiviato in un HSM la maggior parte del tempo. In tal caso, non vedo molto valore nelle capacità di memorizzazione delle chiavi di un HSM, dal momento che non può proteggere le chiavi già memorizzate.

E HSM può anche eseguire le funzioni crittografiche nel modulo stesso. Se questo ti sia utile o meno dipenderebbe dalla tua applicazione.

    
risposta data 03.05.2016 - 23:09
fonte

Leggi altre domande sui tag