Sto scrivendo un daemon che controlla qualcosa nel sistema operativo e capovolge i permessi di esecuzione su un file in / run / back and forth. Il file ha contenuti statici e il nome del file è hardcoded nel demone. Ho reso il demone eseguito come root per renderlo in grado di scrivere in / run /.
Il daemon dovrebbe essere usato su un gran numero di macchine Linux desktop, quindi voglio assicurarmi che non sia sfruttabile. Non sono particolarmente preoccupato dagli attacchi DDoS anche perché il daemon non è mission-critical. Tuttavia, tutti i modi per rendere un file eseguibile o non eseguibile sembrano avere un difetto di sicurezza.
Way # 1: chmod () avanti e indietro
Crea il file e chmod()
avanti e indietro. Non mi piace l'idea, perché se un utente malintenzionato riesce a sostituire il file con un collegamento simbolico a qualcos'altro, un file o una cartella arbitraria sarà codificato in leggibilità e possibilmente eseguibilità. Tuttavia, l'autore dell'attacco avrebbe bisogno delle autorizzazioni di root.
Way # 2: rimuovi il file e ricominciamo a ricrearlo atomicamente con open ()
Elimina prima il file e poi ne crea atomicamente uno nuovo con le autorizzazioni corrette usando open(path, O_CREAT|O_WRONLY|O_TRUNC|O_EXCL, permissions)
, quindi scrivi i contenuti nello stream e chiudilo. Mi piace questo perché l'unica cosa che può essere sfruttata è la rimozione di un file con un nome hardcoded sostituendo la directory di destinazione con un link simbolico ad un'altra directory, e se è possibile sovrascrivere le directory di root non è necessario aver bisogno di demoni ingannevoli per rimuovere un file con un nome file hardcoded comunque.
Cosa succede se il file viene eliminato mentre il daemon sta scrivendo in streaming in questo caso?
Sta usando g_remove () okay o devo usare solo unlink () e abortire se fallisce?
Mi manca qualcosa o sto solo diventando paranoico e il modo # 2 è abbastanza sicuro?