Quando si eseguono script di shell, è più sicuro passare informazioni sensibili usando stdin o un'opzione di stringa?

4

Sto creando una serie di script automatici che verranno eseguiti in un ambiente crittografato (crittografia completa del disco).

Molti comandi in Windows e * nix hanno due modi per inserire informazioni sensibili come le password. In una modalità, il programma richiede all'utente la password e nell'altra la password viene specificata utilizzando un argomento di opzione.

Durante la scrittura di uno script di shell, il comando può essere automatizzato utilizzando uno di questi processi. Nel primo caso, il comando viene eseguito, quindi lo standard in (stdin) viene reindirizzato e la password viene convogliata nel programma quando richiesto. Nel secondo caso, la password viene specificata come argomento per il programma.

Uno di questi è intrinsecamente più rischioso dell'altro? Ci sono dei compromessi di cui essere a conoscenza? In entrambi i casi, sto chiedendo in particolare il metodo di fornitura della password, non la rischiosità o la vulnerabilità associata alla memorizzazione della password sul disco.

Ecco un esempio in Python, usando la versio CLI di VeraCrypt:

Reindirizzamento dello stdin:

cmd = ['veracrypt', "--text", partition, mount_point]
input_file = open_file()
vc_call = subprocess.run(cmd, stdin=input_file)
vc_call.wait()

Passaggio della password come argomento:

password = get_password_from_file():
cmd = ['veracrypt', "--text", "--non-interactive", "--password", password, partition, mount_point]
vc_call = subprocess.run(cmd)

Nota:

Non sono sicuro che sia importante, ma su * nix, i comandi possono essere eseguiti direttamente come chiamate di sistema. Nel codice precedente, a nessuna delle chiamate a subprocess.run() è stata assegnata un'opzione shell=True , che causava l'esecuzione del comando all'interno della shell predefinita. La mia comprensione è che su Windows, tutti i comandi devono essere eseguiti attraverso la shell cmd . Questo potrebbe fare la differenza tra le due opzioni, ma non sono sicuro di come.

    
posta BrianHVB 21.07.2018 - 06:28
fonte

2 risposte

6

Passarlo tramite stdin è più sicuro, poiché gli argomenti sono visibili nell'albero del processo.

Passare un valore segreto come argomento è in genere più rischioso. Ogni qualvolta qualcosa viene passato come argomento, tutti gli altri processi in esecuzione nello stesso utente (e talvolta in tutti i processi, periodi di altri utenti) saranno in grado di visualizzare gli argomenti per ciascun processo. Questo è il motivo per cui puoi visualizzare gli argomenti eseguendo ps aux . Passando un valore via stdin, d'altra parte, lo invia attraverso un descrittore di file. Questo descrittore non sarà leggibile da processi non privilegiati. Se il tuo modello di minaccia coinvolge altri processi locali dannosi, devi inviare il materiale sensibile tramite stdin.

Il passaggio di dati tramite stdin comporta il passaggio attraverso un descrittore di file che il programma può leggere utilizzando le chiamate IO standard. In questo caso, sarà altrettanto sicuro quanto aprire un file per leggerlo. Gli argomenti della riga di comando, d'altra parte, vengono mantenuti in un processo ' argv in memoria. Un programma deve semplicemente accedere a quell'indirizzo di memoria per visualizzare gli argomenti. Questi dati, tuttavia, sono visibili ad altri utenti tramite quel processo ' /proc/<pid>/cmdline . Questo è in realtà anche il caso delle variabili ambientali su alcuni sistemi (specialmente i vecchi sistemi * nix), quindi passare segreti attraverso l'ambiente non è necessariamente una buona idea.

    
risposta data 21.07.2018 - 10:18
fonte
4

Sui sistemi di tipo Unix, gli argomenti della riga di comando possono perdere in vari modi. Di solito sono visibili ad altri processi, anche a processi che non sono in esecuzione come lo stesso utente. (Alcune varianti di Unix, ad esempio certe configurazioni Linux consolidate, possono nascondere gli argomenti della riga di comando ad altri utenti.) Possono essere archiviati nei log di controllo.

Non so per certo su Windows, ma i rischi sono gli stessi.

Il passaggio di informazioni attraverso una pipe (in modo che il processo lo riceva su un input standard) non si verifichi all'esterno del processo di invio e ricezione a meno che non si adottino misure speciali come eseguire lo script in un debugger.

Data una scelta, vi è un ordine molto chiaro dei rischi di perdita di dati che si stanno esaurendo: le pipe sono sicure, le variabili di ambiente di solito sono sicure se il sottoprocesso non genera altri sottoprocessi, gli argomenti della riga di comando non dovrebbero essere trattati come confiential.

    
risposta data 21.07.2018 - 10:18
fonte

Leggi altre domande sui tag