Estoy escribiendo un demonio que supervisa algo en el sistema operativo y cambia los permisos de ejecución en un archivo en / run / back and forward. El archivo tiene contenido estático y el nombre del archivo está codificado en el demonio. Hice que el demonio se ejecute como root para que pueda escribir en / run /.
Se supone que el demonio se utiliza en una gran cantidad de máquinas Linux de escritorio, por lo que quiero asegurarme de que no sea explotable. Sin embargo, no estoy particularmente preocupado por los ataques DDoS porque el demonio no es de misión crítica. Sin embargo, todas las formas de hacer un archivo ejecutable o no ejecutable parecen tener una falla de seguridad.
Forma # 1: chmod () de ida y vuelta
Crea el archivo y chmod()
de un lado a otro. No estoy de acuerdo con la idea porque si un atacante logra reemplazar el archivo con un enlace simbólico a otra cosa, un archivo o carpeta arbitrario se convertirá en legibilidad y posiblemente en ejecutabilidad. Sin embargo, el atacante necesitaría permisos de root para eso.
Forma # 2: elimine el archivo y vuelva a crearlo de forma atómica con open ()
Primero elimine el archivo y luego cree de forma atómica uno nuevo con los permisos correctos usando open(path, O_CREAT|O_WRONLY|O_TRUNC|O_EXCL, permissions)
, luego escriba el contenido en la secuencia y ciérrelo. Me gusta este uno más porque lo único que se puede explotar es eliminar un archivo con un nombre codificado sustituyendo el directorio de destino con un enlace simbólico a algún otro directorio, y si puede sobrescribir los directorios raíz no debería necesitar engañar a los demonios para eliminar un archivo con un nombre de archivo codificado de todos modos.
¿Qué sucede si el archivo se elimina mientras el demonio está escribiendo para transmitir en este caso?
Está utilizando g_remove () bien o debo usar unlink () solamente y abortar si falla?
¿Me estoy perdiendo algo o simplemente estoy siendo paranoico y la forma # 2 es lo suficientemente segura?