Su Linux, il programma da riga di comando mktemp è meno sicuro della funzione C mkstemp?
-
20-08-2019 - |
Domanda
Entrambe le operazioni creano un file vuoto e restituiscono il nome file, ma mkstemp lascia il file aperto in modalità esclusiva e ti dà l'handle. C'è un vantaggio in termini di sicurezza per la funzione C? Ciò implica che esiste una falla nella versione da riga di comando?
A parte questo, è interessante che ci siano diverse funzioni correlate in API in Linux e la maggior parte di esse dice " Non usare questa funzione " (o simili) nella loro pagina man.
Soluzione
Come puoi facilmente vedere dal mktemp(1)
codice sorgente, essenzialmente non fa altro che chiamare mkstemp(3)
.
La modalità esclusiva in Linux significa che la funzione fallirà se il file esiste già, non garantisce il blocco. Un altro processo può eliminare questo file, crearlo di nuovo e riempirlo di dati, nonostante la gestione del file sia open(3)
da parte del processo.
Non esiste ulteriore sicurezza nella funzione C rispetto all'utilità della riga di comando.
Altri suggerimenti
Un trucco con file temporanei in sistemi operativi simili a Unix (inclusi Linux e Mac OS) è non appena si apre il file, lo si elimina. Puoi ancora accedere al file, ma nessun altro può vederlo o farci qualcosa, e scomparirà non appena chiudi il file, anche se il tuo programma muore in modo orribile.
La differenza più evidente tra una chiamata di sistema e una funzione della riga di comando è che le funzioni della riga di comando sono utilizzate dalle persone o dai loro script di shell, mentre le chiamate di sistema sono sempre eseguite dai programmi.
Sarebbe piuttosto difficile consegnare a una persona un file handle.
Per quanto riguarda " safety " dovresti pensare alle condizioni della gara: diverse istanze di un programma chiamano mkstemp contemporaneamente, ma ognuna ha la garanzia di avere un file temporaneo univoco. Se il programma sborsasse e chiamasse la versione da riga di comando, sarebbe quasi impossibile garantirlo.