2011-04-18 9 views
6

Estoy trabajando en una aplicación que necesita usar dd (hago esto con un script de shell en el paquete de la aplicación, que recopila parámetros de la aplicación, realiza algunas comprobaciones y luego inicia dd)NSTask, herramientas de línea de comandos y raíz

Para realizar esta operación necesito llamar a dd con root, y ya he visto varias soluciones en StackOverflow. El más simple de implementar me pareció este http://www.sveinbjorn.org/STPrivilegedTask

El problema es que mi NSTask realiza algunas operaciones complejas de lectura/escritura (no está presente en STPrivilegedTask) y no necesita tener todos los privilegios.

Así que escribí una pequeña herramienta auxiliar en c que llama a mi script con los parámetros correctos de mi aplicación. La solución que pensé es usar STPrivilegedTask para SUID una vez que se ejecuta mi pequeña herramienta de ayuda, para poder ejecutarla (y mi script y dd) con root, y poco después del lanzamiento exitoso reestablecí la herramienta auxiliar a no SUID (y hago lo mismo si ocurre algún error, al salir de la aplicación, al inicio de la aplicación, etc. para estar más seguro).

Lo implementé y funciono bastante bien, tal vez no sea perfecto, pero creo que estar dentro del paquete, y trabajar con la herramienta auxiliar en SUID solo para el lanzamiento suena lo suficientemente seguro.

¿Alguna idea?

Gracias!

Respuesta

1

Se puede utilizar una caja de arena para ejecutar el nuevo proceso en su NSTask

sandbox-exec -f <profile> <command> 
sandbox-exec -f my_profile.sb "/bin/dd -if=/dev/disks01 of=/dev/target" 

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/sandbox-exec.1.html

Usted tiene algunos ejemplos perfil aquí

/usr/share/sandbox/ 

usted tiene que dar acceso suficiente para dd para trabajar, no he probado o comprobado lo que dd requiere, comenzaría con algo como esto:

(version 1) 
(deny default) 
(debug deny) 
(import "system.sb") 
(allow file-read-data file-write-data file-ioctl     (regex #"^/dev/.*$")) 
(allow process-exec (literal "/usr/sbin/helper")) 

Actualización: Vale la pena mencionar, puede utilizar caja de arena-exec comando -p

+1

Hola JSMP, probé el sistema de caja de arena como lo hacía en el pasado, pero no es lo que necesito, sólo necesito para ejecutar la tarea como root (también para otros comandos que necesito, como mount y umount, etc.). ¿Alguien con alguna sugerencia sobre mi solución SUID temporal helperTool? Posibles agujeros y alternativas? – opoloko

+0

Agregado a esto, implementé en helperTool también el código para cambiar de "suided" a "no suided" al final de su propio proceso. Por lo tanto, obtiene SUID de la aplicación, inicia la secuencia de comandos con los parámetros correctos y no se convierte en SUID justo después de forma automática. Parece un buen paso de seguridad añadido. – opoloko

+0

Hola opoloko, veo que solo quieres una forma de mantener el archivo a salvo. Desde mi punto de vista todavía existe el caso cuando un usuario puede matar la aplicación dejándola con SUID antes de que la desate. – jsmp

Cuestiones relacionadas