Come inviare in modo sicuro una password da un'app a un'altra app?

1

Vedi prima questa domanda / risposta: Quando si chiama un processo da un altro processo, l'invio di password stdin è più sicuro rispetto all'invio di una variabile ENV?

Sono uno sviluppatore Java che sta costruendo un'app in cui è necessario chiamare un processo C # dall'interno. Nella mia situazione, l'app Java chiama questo programma C # link .

Abbiamo stabilito che questo non è sicuro per inviare la password tramite variabili d'ambiente o con stdin.

Qual è la migliore pratica per fornire la password a questa app?

    
posta Nicholas DiPiazza 23.02.2018 - 18:23
fonte

2 risposte

3

Da quanto ho capito, questo è il tuo modello di minaccia: hai due programmi, uno eseguirà l'altro. Il primo programma deve passare un po 'di segreto al secondo programma. Un avversario non deve essere in grado di registrare, intercettare o modificare questo segreto. Entrambi i processi si fidano l'un l'altro e funzionano sullo stesso sistema.

La risposta dipende dal fatto che l'eseguibile sia scrivibile o meno da un avversario. Se è conservato in un percorso di sistema privilegiato o ha almeno lo stesso livello di integrità dell'eseguibile genitore, si può essere certi di poterlo considerare non manomesso. Quando entrambi i processi sono affidabili, il modo più semplice di inviare dati tra due processi è una pipe, come stdin . Sarebbe anche possibile usare la memoria condivisa, che è una regione di memoria che un processo genitore può creare e che sarà condiviso dal figlio, consentendo una comunicazione più efficiente rispetto a un tubo. Le parti non autorizzate non saranno in grado di intercettare o modificare il contenuto della comunicazione, a meno che non siano in grado di:

  • Modifica direttamente gli eseguibili padre o figlio.
  • Trucchi il tuo programma nell'esecuzione dell'eseguibile errato, ad es. abusando di PATH .
  • Esegui come lo stesso utente del tuo programma, rendendo possibile comprometterli.
  • Modifica l'ambiente (ad esempio LD_PRELOAD ) del genitore o del figlio.

Suggerirei di non utilizzare una variabile ambientale. L'ambiente non è pensato per essere segreto e spesso altri utenti sono in grado di visualizzare l'ambiente di vari processi sul sistema. Su Linux, ad esempio, è possibile ottenere l'ambiente di qualsiasi processo leggendo il file /proc/<pid>/environ .

    
risposta data 24.02.2018 - 05:22
fonte
1

Mentre la risposta di Forest è globalmente corretta, non ha menzionato un modo importante per migliorare il livello di protezione tra le tue istanze.

In Windows, puoi usare CryptProtectMemory (e CryptProtectData) per crittografare i nostri dati con una chiave che è collegata all'utente corrente (e, nel caso di CryptProtectMemory, la chiave viene cambiata ogni volta che si riavvia la macchina).

Ciò consente di aggiungere un livello di protezione al tuo sistema: puoi usare CryptProtectMemory (specificando il flag CRYPTPROTECTMEMORY_SAME_LOGON) per limitare l'accesso alla chiave di decodifica per elaborare in esecuzione sulla stessa macchina e lo stesso utente come tuo.

Non proteggerà il tuo codice da esecuzione nello stesso contesto del tuo ma, in definitiva, non c'è nulla che ti protegga da questo.

Modifica : desidero sottolineare il fatto che dovresti utilizzare CryptProtectMemory, non CryptProtectData. CryptProtectData è inteso per i dati che devono essere trasmessi in streaming alla memoria (e quindi dovrà essere recuperato e decrittografato da un'altra sessione di windows in blocco).

    
risposta data 27.02.2018 - 09:06
fonte

Leggi altre domande sui tag