Qual è il modo più sicuro per trasferire un segreto tra 2 processi in esecuzione sullo stesso sistema?

3

Come parte del mio sistema, ho molti processi, ognuno dei quali creato attraverso uno script. Uno dei processi può essere considerato un "processo principale" nel senso che questo processo comunica con il server e ottiene tutte le informazioni relative alla configurazione e alle chiavi.

Ora ho il requisito di passare la configurazione e le informazioni chiave dal "Processo principale" ad altri processi. Attualmente sto cercando di scrivere le informazioni di configurazione in un file (un file per ciascun altro processo) e gli altri processi letti da quel file designato per sé.

Il problema ora sorge perché anch'io ho una chiave e non voglio che sia scritta sul file.

Qual è il modo più sicuro per passare la chiave dal "Processo principale" ad altri processi?

Ho pensato finora al di sotto:

  • Avere una comunicazione socket protetta SSL / TLS (TCP) tra l'altro processi e processo principale. Il problema con questo approccio è che, SSL / TLS è pesante e non riesco ad aprire un socket di ascolto sul master Processi.
  • Usa pipe. Ma, non sono chiaro come posso proteggere i tubi e anche assicurare che i processi che non sono destinati a connettersi al Master Elabora e prendi la chiave, non capirla.
  • Shared-Memory - Lo stesso problema di cui sopra.

Tieni presente che questi processi non condividono una relazione Processo padre-figlio.

Qualsiasi suggerimento sarà di grande aiuto!

    
posta Jay 29.12.2017 - 12:45
fonte

4 risposte

6

Se il modello di minaccia include "processi dannosi in esecuzione come lo stesso utente del processo legittimo che richiede la chiave", è necessario tornare al tavolo da disegno e riprogettare. Non è possibile proteggersi da questo. I processi all'interno di una singola sessione utente non sono, e non dovrebbero essere previsti, sicuri l'uno dell'altro.

La preoccupazione che esprimi sulle pipe, ad esempio, si estende a qualsiasi altro tipo di meccanismo IPC. Socket TLS con autenticazione reciproca? Qualsiasi processo che può connettersi al socket può essere impersonato da un altro processo nello stesso contesto utente, leggendo gli stessi dati chiave e spoofando il processo legit. Anche se si potesse stabilire in modo sicuro l'IPC, non è possibile garantire che i dati siano sicuri. Ad esempio, alcuni sistemi operativi (Windows in particolare, ma penso anche alcuni Unix-like) consentono a qualsiasi processo in esecuzione con un determinato utilizzo di eseguire il debug di qualsiasi altro processo sotto lo stesso utente, in modo che il processo dannoso possa solo leggere il segreto direttamente dal processo legittimo 'spazio indirizzo.

OK, parliamo di scenari in cui non si presume che un altro processo sia nello stesso contesto utente di cui si è malintenzionati. Forse è perché hai (ri) ideato l'intera cosa in modo che venga eseguita in un contesto utente speciale utilizzato solo per lo scopo specifico del tuo software. Forse è perché stai lavorando su un dispositivo incorporato in cui controlli tutto il codice che viene eseguito. Forse è solo perché hai accettato di provare a difendere contro il codice malevolo con gli stessi privilegi di cui sei privo di speranza e senza senso (se i malintenzionati stanno eseguendo il codice nel tuo contesto utente, è già game over, uomo).

Non hai specificato il sistema operativo su cui è necessario eseguire il software. Tuttavia, in generale, ci sono alcune scelte decenti qui per il segreto che non vuoi mai impegnare per l'archiviazione persistente.

Su sistemi di tipo Unix:

  • socket di dominio Unix (locali). Veloce e abbastanza semplice. Supporta la comunicazione bidirezionale, se questo è importante. Per sicurezza, devi solo crearli in una posizione che non è né leggibile né scrivibile da nessun altro utente (qualcosa sotto il profilo utente è una scelta popolare). D'altra parte, hai detto che non puoi ospitare un socket di ascolto sul Master (perché no?), Quindi potrebbe non funzionare.
  • Una named pipe, detta anche FIFO. Veloce e diretto, ma solo unidirezionale (se si desidera bidirezionale, è necessario creare un paio di tubi). Come con il socket locale, assicurati che la FIFO sia creata dove nessun altro utente può accedere.

Su Windows:

  • Una named pipe. A differenza delle pipe denominate da Unix, le pipe di Windows non vanno nel file system standard; c'è uno speciale "named pipe file system" per loro. Ciò significa che è necessario assicurarsi di creare il tubo con l'elenco di controllo di accesso (ACL) corretto. Una volta creato, però, l'uso della pipe è veloce e semplice.
  • Una mappatura della memoria con nome. L'API CreateFileMapping può essere utilizzata per creare una mappatura della memoria che non sia supportata da alcun file normale, ma dal file di paging del sistema. Mentre il file di paging è supportato da dati persistenti e quindi potrebbe portare al segreto che viene memorizzato su disco, questo è un rischio con qualsiasi processo; non si può garantire che il segreto non verrà mai cancellato dalla memoria di lavoro a meno che la piattaforma non offra (e si usi) una sorta di buffer protetto dal kernel. Nel frattempo, un utente malintenzionato non saprebbe dove cercare il segreto nel file di paging, quindi probabilmente sei al sicuro. I mapping di memoria con nome, come i named pipe, devono essere protetti utilizzando un ACL che impedisca ai processi in esecuzione con altri utenti di aprire il mapping. Una volta che entrambe le parti hanno aperto la mappatura, tuttavia, è molto veloce.
  • Accesso diretto alla memoria (leggi, molto probabilmente) tra i processi. Il processo client legge semplicemente il segreto dallo spazio degli indirizzi virtuali del genitore. Ciò richiede un modo per passare l'indirizzo rilevante all'altro processo, ma è OK se tale indirizzo è esposto; gli altri utenti non possono accedere alla memoria del processo, anche se sanno dove cercare, perché i processi hanno sempre un ACL che impedisce ad altri utenti di leggere la loro memoria.
risposta data 29.12.2017 - 14:48
fonte
2

Dove sono archiviati gli eseguibili per entrambi i processi? Perché se entrambi sono memorizzati nella macchina e non si desidera dover immettere manualmente i segreti all'avvio del processo, chiunque possa leggere l'eseguibile sarebbe in grado di falsificare qualsiasi metodo di autenticazione. Si può anche mantenere il sistema attuale ma memorizzare il file di configurazione nello stesso posto con le stesse autorizzazioni (/ forse bloccare per essere leggibile solo dall'utente che esegue i processi).

Se i file eseguibili non sono memorizzati sulla macchina, puoi semplicemente crittografare il file di configurazione con una chiave codificata all'interno degli eseguibili (o leggere da un file non memorizzato sulla macchina all'avvio).

Con SLS / TLS come sai che stai parlando con il vero server e non un altro processo in ascolto su quella porta? Solitamente si usa un certificato per autenticarsi, ma come sopra se è memorizzato sulla macchina chiunque può leggerlo può impersonare il vero server.

E hai già detto che pipe e memoria condivisa hanno lo stesso problema.

    
risposta data 29.12.2017 - 14:30
fonte
2

Manca Un * x socket :

  • Il Processo principale crea semplicemente uno (o più) un * x socket , situato nelle directory protette, con 'srw-rw- corretto --- ' attributi (tutti i processi sono in esecuzione con utenti diversi, ma sono membri dello stesso gruppo).

  • Il Processo principale rimani listenning su questo socket (server)

  • Tutti i processi, in esecuzione sullo stesso host, con accesso sufficiente a destra (membro del gruppo selezionato) potrebbero comunicare con Processo principale utilizzando il socket già creato (client ).

  • Naturalmente, Processo principale che crea il socket deve utilizzare il proprio protocollo e correttamente disinfettare gli input dei socket!

Nota: Processo principale potrebbe essere membro di molti gruppi e aprire tanti socket, uno per ogni gruppo, quindi considerare la differenza da quale socket viene utilizzato per qualsiasi richiesta ...

Da lì, poiché non ci sono connessioni di rete, devi solo organizzare correttamente la configurazione di utenti / gruppi e preoccuparti delle autorizzazioni abount sul socket (e sul suo percorso).

L'uso della crittografia su un * un socket x è possibile, ma sembra eccessivo ...

Ma per favore, dai un'occhiata alla risposta di CBHacking : Potresti dover tornare al tavolo da disegno e riprogettazione ...

Ad ogni modo, il mio significato è:

That's the correct way for communicate between two process... and if this won't work under window, use BSD or Linux!

    
risposta data 29.12.2017 - 14:44
fonte
1

Penso che tu possa eseguire "processo master" come debugger e usarlo per creare altri processi come debuggee. Quindi puoi inviare messaggi tra di loro con l'evento di debug. Così puoi essere sicuro che nessun altro processo ti rubi il tuo segreto.

    
risposta data 11.06.2018 - 05:44
fonte

Leggi altre domande sui tag