Come posso creare e accedere in sicurezza ai file temporanei dagli script della shell?


14

Ho letto che il reindirizzamento dell'output su un file con nome fisso /tmppuò essere un rischio per la sicurezza, perché se un utente malintenzionato (o malcontento) nota che un file /tmp/tmpfileformyscript.tmpviene creato quando eseguo il mio script (anche se non ha accesso in lettura al mio script), ad esempio può creare un collegamento simbolico ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmpche mi farà distruggere il mio .bashrcfile quando eseguo il mio script.

Quindi invece posso usare qualcosa del genere filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename".

Tuttavia, mi piacerebbe usare un file tmp per la memorizzazione nella cache a volte, nel qual caso vorrei sapere se "tmpfile.tmp. *" Corrisponde a qualsiasi cosa in /tmpe in tal caso, utilizzare quel file anziché crearne uno nuovo. Purtroppo , per quanto ne so, testl'equivalente [ -f filename ]non supporta il globbing dei file.

Quindi la mia domanda è duplice:

  1. Come posso creare in modo sicuro un tempfile? È"predictablename.$RANDOM" una pratica accettabile o esiste un modo migliore (più sicuro, più semplice)?
  2. Come posso accedere facilmente al file e / o stabilirne successivamente l'esistenza controllando predictablename?

Risposte:


13

Utilizzare l' mktemputilità per creare un file temporaneo con un nome imprevedibile. Non è standardizzato da POSIX, ma è disponibile su * BSD e su Linux.

> /tmp/predictable.$RANDOMnon è una buona scelta perché è per lo più prevedibile¹, che apre lo script a un attacco in cui l'attaccante può ingannare il tuo script per sovrascrivere un file a cui hai accesso in scrittura o dare loro accesso al file temporaneo. Questa è una vulnerabilità di file temporanea non sicura. mktempnon ha questa vulnerabilità perché crea il file in modo sicuro (non sovrascriverà un file esistente, anche se sono coinvolti collegamenti simbolici) e utilizza un nome sufficientemente imprevedibile per evitare una negazione del servizio.

Se creare un file temporaneo e utilizzarlo non è abbastanza buono, crea una directory temporanea con mktemp -de lavora lì.

mktempsi occupa anche di utilizzare $TMPDIRse la variabile è impostata, tornando a /tmpse non è impostata.

Sempre più distribuzioni impostato TMPDIRper essere una directory privata, ad esempio, /run/1234/tmpdove 1234è il tuo UID. Ciò elimina il rischio di vulnerabilità dei file temporanei, al costo di non poter più condividere file temporanei tra utenti (che è occasionalmente utile, ma non molto spesso; /tmpè ancora disponibile, semplicemente no TMPDIR).

Se hai bisogno di un nome di file riproducibile, crea un file con un nome ben definito (senza componente casuale) nella home directory dell'utente. La convenzione moderna è la specifica della directory utente XDG . Se il file può essere rimosso senza causare la perdita di dati, utilizzare la XDG_CACHE_HOMEvariabile di ambiente, per impostazione predefinita ~/.cache. Probabilmente dovresti creare una sottodirectory con il nome dell'applicazione e lavorare lì.

CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"

¹ Non solo $RANDOMaccetta 32767 valori possibili, ma è facile prevedere senza nemmeno provare molti valori. Il generatore di numeri casuali di Bash è un LCG seminato dal PID e dal momento del primo utilizzo. Zsh è la piattaforma randseminata dal tempo di avvio. ATT Ksh è la piattaforma randseminata da PID. Mksh è un LCG con un seme più complesso, ma non di qualità. Tutti possono essere previsti da un altro processo con una probabilità abbastanza grande di successo.


In realtà la tua discussione su $TMPDIRed ~/.cacheè esattamente ciò di cui avevo bisogno. Dopo qualche altro pensiero mi sono reso conto che l'unica ragione per cui lo volevo /tmpera il partizionamento, quindi la cache non poteva riempire la /homepartizione. Ma per questo caso d'uso è davvero un non-problema completo, quindi una sottodirectory ~/.cacheadatta perfettamente alle mie esigenze ed evita il problema di sicurezza.
Carattere jolly

mktempnon è disponibile su AIX o sulla shell Git su Windows. Sembra che file.$RANDOM$RANDOMsia la soluzione portatile. Il $RANDOM$RANDOMdovrebbe aumentare lo spazio a 2 ^ 32, assumendo Bash risultati casuali sono indipendenti e non debole.

I risultati casuali di @jww Bash sono deboli: è un LCG, che è prevedibile tanto quanto lo è mentre è abbastanza buono per molte applicazioni che non richiedono imprevedibilità.
Gilles 'SO- smetti di essere malvagio' il

9

mktemp è stato progettato per questo. Dalla pagina man:

TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE

mktemp creerà il file o uscirà con uno stato di uscita diverso da zero. La logica o (||) garantisce che lo script verrà chiuso se mktemp non è in grado di creare il file. Dopo questo comando, puoi essere sicuro che il file è disponibile. Non è necessario ricontrollarlo. L'unica cosa che potresti dover aggiungere è la pulizia del file alla fine dello script.

E possibilmente anche quando lo script è terminato da un segnale. Se ciò è necessario o meno è qualcosa che devi decidere.

Entrambi possono essere fatti usando il trap comando.


Ah! Questo è molto utile; quindi non ho bisogno di chiamare $RANDOM. Ma poi parte 2 della mia domanda: come posso accedere a quel file in un secondo momento o verificare se esiste già in una successiva esecuzione dello script? (Per implementare una cache molto semplice.)
Wildcard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.