Cuando los programas que se ejecutan en Linux quieren usar los recursos administrados por el sistema operativo (leer archivos, crear procesos, etc.), realizan llamadas al sistema operativo. Las llamadas al sistema funcionan a nivel de kernel y realizan las operaciones necesarias, dejando el control al programa que llama. La herramienta strace brinda la capacidad de rastrear estas llamadas al sistema en Linux.
Uso típico del comando strace
Para monitorear las llamadas del sistema para una aplicación, simplemente invoque el comando con rastro en el siguiente formato:
seguimiento ls /tmp
Sin embargo, a menudo hay procesos que comienzan mucho antes y continúan funcionando en segundo plano. Debido a cualquier problema, es posible que desee recopilar información adicional asociada con dichos procesos. Puedes adjuntar rastro a cualquier aplicación en ejecución dando el ID de proceso del proceso a la -pag parámetro:
strace -p 2759
Producción:
Realice un seguimiento de los subprocesos y bifurcaciones de una aplicación
Con strace, puede verificar todos los subprocesos y otros procesos secundarios que son una bifurcación de la aplicación utilizando el -F bandera.
strace -f -p 2759
Producción:
Verifique ciertas llamadas del sistema con strace
La salida de strace predeterminada puede estar bastante concurrida a veces. Si solo desea rastrear ciertas llamadas al sistema, puede hacerlo con el -mi parámetro:
strace -f -e trace=abrir, escribir, cerrar, conectar,Seleccione -pag 19770
Para rastrear solo llamadas al sistema relacionadas con operaciones de archivos, use -e rastreo=archivo:
seguimiento -e seguimiento=archivo -p 19770
Para filtrar solo las llamadas al sistema relacionadas con la red, especifique -e rastreo=red en el comando:
strace -e trace=red -p 19770
Obtenga información de tiempo en segundos
Al enviar llamadas al sistema, puede usar el -t parámetro para obtener información de tiempo con precisión en segundos. La mayoría de las veces la precisión no será suficiente para sus necesidades. En tales situaciones, puede utilizar el -tt parámetro para obtener información de tiempo con precisión de microsegundos:
strace -tt ls /tmp
Recopilar estadísticas sobre las llamadas al sistema
Con el -C parámetro, puede recopilar estadísticas sobre las llamadas al sistema durante el tiempo que desee:
strace -f -c -p 19770
Guardar registros en un archivo
Si ejecuta strace durante mucho tiempo y desea examinar los registros resultantes con más detalle más adelante, deberá guardar los registros. Con el -o parámetro puede especificar el archivo en el que strace debe guardar los registros:
strace -f -o /tmp/strace.log -e trace=archivo ls /tmp
Proceso de bloqueo de ptrace
Usando la llamada al sistema prctl, cualquier aplicación bajo Linux puede evitar que sea controlada por usuarios no root usando ptrace. Si la aplicación borra el PR_SET_DUMPABLE flag por sí mismo a través de prctl, los usuarios que no sean root no podrán controlar esta aplicación con ptrace, incluso si tienen el derecho de señalar la aplicación.
Uno de los usos más típicos de esta característica se ve en el software del agente de autenticación OpenSSH. Así, el control de la aplicación por otra aplicación con rastrear se impide en la autenticación del usuario.
seguimiento y seguridad
Debido a la instalación de ptrace establecida en el modelo de proceso tradicional de Linux, cualquier software que ejecute en su sistema con su usuario tiene la autoridad para insertar código malicioso en él. Desde la herramienta xterm más simple hasta aplicaciones avanzadas de navegador web, dicho malware puede tomar el control de todas sus otras aplicaciones en ejecución, gracias a la llamada al sistema ptrace, y copiar información importante sin que usted se dé cuenta.
Ante esta situación, de la que muchos usuarios no son conscientes, se ha desarrollado un mecanismo de protección con el módulo de seguridad denominado Yama en el kernel de Linux.
Puede controlar la respuesta a la llamada del sistema ptrace a través del /proc/sys/kernel/yama/ptrace_scope expediente. Por defecto, este archivo escribe un valor de 0.
Los siguientes valores son aceptables:
Valor | Significado |
0 | Comportamiento convencional: Todas las aplicaciones que tienen derecho a rastrear se puede comprobar |
1 | Seguimiento restringido: Solo el padre directo de la aplicación o las aplicaciones de depuración permitidas por la aplicación con el PR_SET_PTRACER opción tiene el control. Así, los usos de gdb nombre_del_programa y strace nombre_del_programa seguirá funcionando, pero no podrá adjuntar una aplicación en ejecución después. |
2 | Ptrace al administrador del sistema: Solo aplicaciones con definido CAP_SYS_PTRACE propiedad o procesos secundarios que definen la PTRACE_TRACEME opción con prctl puede ser controlado |
3 | Completamente deshabilitado: No rastrear está permitido bajo cualquier circunstancia. Si esta propiedad se define una vez, no puede volver a cambiarla en tiempo de ejecución. |
Muchos desarrolladores no saben que las aplicaciones pueden deshabilitar ptrace a través de prctl, excepto para el usuario root. Aunque el software relacionado con la seguridad, como el agente OpenSSH, realiza estas operaciones, no sería correcto esperar el mismo comportamiento de todo el software que se ejecuta en el sistema.
Hace poco, algunas distribuciones de Linux han comenzado a establecer el valor predeterminado de la ptrace_scope archivo, descrito anteriormente, para 1. Por lo tanto, con las operaciones de seguimiento restringidas, se proporciona un entorno de trabajo más seguro en todo el sistema.
Usando una traza de ejemplo
Registre la aplicación de muestra a continuación con el nombre ministrace.c. Luego puedes compilarlo con el siguiente comando:
CCG-oministerioministerio.C
Código:
#incluir <sys/ptrace.h>
#incluir <sys/reg.h>
#incluir <sys/esperar.h>
#incluir <sys/tipos.h>
#incluir <unistd.h>
#incluir <stdlib.h>
#incluir <stdio.h>
#incluir <errno.h>
#incluir <cadena.h>
En twait_for_syscall(pid_t niño)
{
En t estado;
mientras (1) {
ptrace (PTRACE_SYSCALL, hijo, 0, 0);
waitpid (niño, &estado, 0);
si (WIFSTOPPED(estado) && WSTOPSIG(estado) & 0x80)
devolver0;
si (ESPOSA SALIDA (estado))
devolver1;
}
}En tdo_child(En t argc, carbonizarse **argv)
{
carbonizarse * argumentos [argc+1];
memcpy (args, argv, argc * tamaño de (carbonizarse*));
argumentos[argumento] = NULO;
ptrace (PTRACE_TRACEME);
matar(getpid(), SIGSTOP);
devolver execvp (argumentos[0], argumentos);
}En thacer_trazar(pid_t niño)
{
En t estado, llamada al sistema, recuperación;
waitpid (niño, &estado, 0);
ptrace (PTRACE_SETOPTIONS, hijo, 0, PTRACE_O_TRACESYSGOOD);
mientras(1) {
Si (wait_for_syscall (hijo) != 0) romper;syscall = ptrace (PTRACE_PEEKUSER, niño, tamaño de (largo)*ORIG_RAX);
fprintf (stderr, "llamada al sistema(%d) = ", llamada al sistema);Si (wait_for_syscall (hijo) != 0) romper;
retval = ptrace (PTRACE_PEEKUSER, niño, tamaño de (largo)*RAX);
fprintf (stderr, "%d
", recuperación);
}
devolver0;
}
En tprincipal(En t argc, carbonizarse **argv)
{
si (argc < 2) {
fprintf (stderr, "Uso: %s argumentos prog.
",argv[0]);
salida(1);
}
pid_t hijo = tenedor();
si (niño == 0) {
devolver do_child (argc-1, argv+1);
} demás {
devolver do_trace (hijo);
}
}
Después de compilar la aplicación, puede ejecutar cualquier comando con ministerio y examinar la salida:
Puede usar strace para muchos propósitos
strace puede ayudar a encontrar errores en los programas que utilizan innecesariamente los recursos del sistema. Asimismo, la característica que exhibe un programa mientras usa los recursos del sistema operativo también puede revelarse con strace.
Dado que strace escucha directamente las llamadas del sistema, puede revelar la dinámica del tiempo de ejecución independientemente de si el código del programa que se ejecuta está abierto o cerrado. Es posible hacerse una idea de por qué los programas arrojan un error cuando comienzan a usar strace.
De manera similar, strace lo ayuda a comprender por qué un programa finaliza inesperadamente. Por lo tanto, estar familiarizado con strace es muy importante en el desarrollo del kernel de Linux y la administración del sistema.
Cree su propio sistema operativo con Linux desde cero [Linux]
Leer siguiente
Temas relacionados
- linux
- Comandos Linux
- Núcleo de Linux
Sobre el Autor
Ingeniero y desarrollador de software aficionado a las matemáticas y la tecnología. Siempre le ha gustado la informática, las matemáticas y la física. Ha desarrollado proyectos de motores de juegos, así como aprendizaje automático, redes neuronales artificiales y bibliotecas de álgebra lineal. Además continúa trabajando en aprendizaje automático y matrices lineales.
Suscríbete a nuestro boletín
¡Únase a nuestro boletín para obtener consejos técnicos, reseñas, libros electrónicos gratuitos y ofertas exclusivas!
Haga clic aquí para suscribirse