C'è qualche modo in Java per scrivere in un file temporaneo in modo sicuro?java equivalent per mkstemp
Per quanto posso dire, l'unico modo per creare un file temporaneo (createTempFile) does't realtà aprirlo, allo stesso tempo, quindi c'è una condizione di competizione tra file aperto & scrittura file. Mi sto perdendo qualcosa? Non sono riuscito a trovare il codice sorgente C dietro createFileExclusively (String) in UnixFileSystem.java, ma dubito che possa davvero fare qualcosa dato che il file aperto si verifica nel codice Java dopo la creazione del file temporaneo (a meno che non provi a fare qualcosa con serrature di file?).
Il problema
Tra quando viene creato il file temporaneo & lo si apre, un malintenzionato potrebbe scollegare quel file temporanei & mettere roba dannoso lì. Ad esempio, un utente malintenzionato potrebbe creare una named pipe per leggere dati sensibili. Analogamente, se alla fine copi il file leggendolo, la pipa denominata potrebbe ignorare tutto ciò che è stato scritto, &, fornire contenuti dannosi da leggere.
Ricordo di aver letto numerosi esempi di attacchi di file temporanei negli ultimi 10 anni che sfruttano la condizione di competizione tra quando il nome appare nello spazio dei nomi e quando il file viene effettivamente aperto.
Speriamo che un fattore attenuante è che Java impostato è l'umask correttamente in modo che un utente con meno privilegi non può leggere/scrittura al file e in genere nella directory/tmp limita i permessi correttamente in modo che non è possibile eseguire un attacco unlink.
Ovviamente se si passa una directory personalizzata per il file temporaneo di proprietà di un utente con privilegi inferiori che è stato compromesso, l'utente potrebbe eseguire un attacco di scollegamento contro di voi. Cavolo, con inotify, è probabilmente ancora più facile sfruttare la condizione della competizione che un semplice loop di forza bruta che fa un elenco di directory.
Puoi spiegare quali condizioni di competizione esistono? –
Qualsiasi aggiornamento su questo (come in soluzioni alternative o trucchi Java7)? –
@Mr_and_Mrs_D Ho appena aggiunto una risposta reale. – OrangeDog