Me gustaría implementar un entorno limitado por ptrace()
proceso que empiezo y creará todos sus hijos (incluidos nietos, etc.). El proceso principal ptrace()
, es decir, el supervisor. sería un simple programa C o Python, y conceptualmente limitaría el acceso al sistema de archivos (basado en el nombre de la ruta y la dirección de acceso (lectura o escritura) y el acceso al socket (por ejemplo, no permitir la creación del socket).¿Cómo puede Linux trazar ser inseguro o contener una condición de carrera?
¿Qué debo prestar atención? para que el proceso ptrace()
d y sus hijos (recursivamente) no puedan pasar por alto la caja de arena? ¿Hay algo especial que el supervisor debe hacer al fork()
tiempo para evitar condiciones de carrera? ¿Es posible leer los argumentos del nombre de archivo por ejemplo rename()
? desde proceso hijo sin una condición de carrera
Esto es lo que ya he planeado hacer:
PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE
para evitar (algunos) coditions carrera cuandofork()
ing- disallow todas las llamadas al sistema por defecto, y componer una lista blanca de sistema permitió llama
- asegurarse de que los
*at()
variantes llamada al sistema (comoopenat
) son adecuadamente protegido
¿A qué más debo prestar atención?
¿Entonces básicamente está tratando de replicar el back-end basado en ptrace de Systrace (http://www.systrace.org/)? – thkala
Sí, mi supervisor trabajaría de manera similar a systrace. Desafortunadamente, systrace parece no tener mantenimiento, no se compila de forma limpia, y también parece tener fallos (se colgó indefinidamente cuando guardé Sandbox GCC con GNU). – pts