ptrace es una llamada al sistema que se encuentra en Unix y en varios sistemas operativos similares a Unix . Al usar ptrace (el nombre es una abreviatura de "proceso de seguimiento"), un proceso puede controlar a otro, lo que permite al controlador inspeccionar y manipular el estado interno de su objetivo. ptrace es utilizado por depuradores y otras herramientas de análisis de código, principalmente como ayuda para el desarrollo de software.
Usos
ptrace es utilizado por depuradores (como gdb y dbx ), por herramientas de rastreo como strace y ltrace , y por herramientas de cobertura de código . ptrace también es utilizado por programas especializados para parchear programas en ejecución, para evitar errores no corregidos o para superar las características de seguridad. Además, se puede utilizar como caja de arena [1] [2] y como un simulador de entorno en tiempo de ejecución (como emular el acceso de root para software no root [2] [3] ).
Al adjuntarse a otro proceso mediante la llamada ptrace, una herramienta tiene un control extenso sobre el funcionamiento de su objetivo. Esto incluye la manipulación de sus descriptores de archivo , memoria y registros . Puede realizar un solo paso a través del código del objetivo, puede observar e interceptar llamadas al sistema y sus resultados, y puede manipular los controladores de señales del objetivo y recibir y enviar señales en su nombre. La capacidad de escribir en la memoria del objetivo permite no solo cambiar su almacén de datos, sino también el segmento de código propio de la aplicación , lo que permite que el controlador instale puntos de interrupción y parchee el código en ejecución del objetivo. [4]
Como la capacidad de inspeccionar y alterar otro proceso es muy poderosa, ptrace puede adjuntar solo a procesos a los que el propietario puede enviar señales (generalmente solo sus propios procesos); la cuenta de superusuario puede rastrear casi cualquier proceso (excepto init en kernels anteriores a 2.6.26). En los sistemas Linux que cuentan con seguridad basada en capacidades , la capacidad de rastrear está aún más limitada por la capacidad CAP_SYS_PTRACE [5] o por el Módulo de seguridad YAMA Linux . [6] En FreeBSD , está limitado por las cárceles de FreeBSD y las políticas de control de acceso obligatorio .
Limitaciones
Las comunicaciones entre el controlador y el objetivo se llevan a cabo mediante llamadas repetidas de ptrace, pasando un pequeño bloque de memoria de tamaño fijo entre los dos (necesitando dos cambios de contexto por llamada); esto es sumamente ineficiente cuando se accede a grandes cantidades de la memoria del objetivo, ya que esto solo se puede hacer en bloques del tamaño de una palabra (con una llamada ptrace para cada palabra). [7] Por esta razón, la octava edición de Unix introdujo procfs , que permite a los procesos permitidos el acceso directo a la memoria de otro proceso - seguido de 4.4BSD, y el uso de /proc
para el soporte del depurador fue heredado por Solaris, BSD y AIX, y en su mayoría copiado por Linux. [7] Algunos, como Solaris , han eliminado por completo ptrace como una llamada al sistema, reteniéndolo como una llamada de biblioteca que reinterpreta las llamadas a ptrace en términos de los procesos de la plataforma. [8] Estos sistemas utilizan ioctls en el descriptor de archivo del archivo abierto /proc
para emitir comandos al proceso controlado. [8] FreeBSD , por otro lado, extendió ptrace para eliminar los problemas mencionados y declaró obsoletos los procfs debido a sus problemas de diseño inherentes. [ vago ] [ cita requerida ]
ptrace solo proporciona la interfaz más básica necesaria para admitir depuradores y herramientas similares. Los programas que lo utilicen deben tener un conocimiento profundo de las características específicas del sistema operativo y la arquitectura, incluido el diseño de la pila, la interfaz binaria de la aplicación , el mecanismo de llamada del sistema , la manipulación de nombres , el formato de los datos de depuración y son responsables de comprender y desensamblar el código de la máquina . Además, los programas que inyectan código ejecutable en el proceso de destino o (como gdb) permiten al usuario ingresar comandos que se ejecutan en el contexto del destino deben generar y cargar ese código ellos mismos, generalmente sin la ayuda del cargador de programas .
Apoyo
Unix y BSD
ptrace se implementó por primera vez en la versión 6 de Unix , [9] y estaba presente en las ramas SVr4 y 4.3BSD de Unix. [5] ptrace está disponible como una llamada al sistema en IRIX , [10] IBM AIX , [11] NetBSD , [12] FreeBSD , [13] OpenBSD , [14] y Linux . [5] ptrace se implementa como una llamada de biblioteca en Solaris, construido en el sistema de archivos procfs del kernel de Solaris; Sun señala que ptrace en Solaris está destinado a la compatibilidad y recomienda que las nuevas implementaciones utilicen la interfaz más rica que proporciona proc. [8] UnixWare también presenta un ptrace limitado [15] pero al igual que Sun, SCO recomienda que los implementadores usen las características subyacentes de procfs en su lugar. [16] HP-UX admitía ptrace hasta la versión 11i v3 (se desaprobó en favor de ttrace , una llamada específica del sistema operativo similar, en 11i v1). [17]
Mac OS
MacOS de Apple también implementa ptrace como una llamada al sistema. La versión de Apple agrega una opción especial PT_DENY_ATTACH: si un proceso invoca esta opción en sí mismo, los intentos posteriores de rastrear el proceso fallarán. [18] Apple usa esta función para limitar el uso de depuradores en programas que manipulan contenido con DRM , incluido iTunes . [19] PT_DENY_ATTACH on también deshabilita la capacidad de DTrace para monitorear el proceso. [20] Los depuradores en OS X suelen utilizar una combinación de ptrace y Mach VM y API de subprocesos. [21] ptrace (nuevamente con PT_DENY_ATTACH) está disponible para los desarrolladores del iPhone de Apple . [22]
Linux
Linux también brinda a los procesos la capacidad de evitar que otros procesos se adjunten a ellos. Los procesos pueden llamar al prctl
syscall y borrar su PR_SET_DUMPABLE
bandera; en kernels posteriores, esto evita que los procesos no root rastreen el proceso de llamada; el agente de autenticación de OpenSSH utiliza este mecanismo para evitar el secuestro de la sesión ssh a través de ptrace. [23] [24] [25] Las versiones posteriores de Ubuntu se envían con un kernel de Linux configurado para evitar que ptrace se adjunte desde procesos que no sean el padre del proceso rastreado; esto permite que gdb y strace continúen funcionando cuando ejecutan un proceso de destino, pero evita que se adjunten a un proceso en ejecución no relacionado. [23] El control de esta función se realiza mediante el /proc/sys/kernel/yama/ptrace_scope
ajuste. [23] En los sistemas en los que esta función está habilitada, los comandos como " gdb --attach
" y " strace -p
" no funcionarán.
A partir de Ubuntu 10.10 , solo se permite llamar a ptrace en procesos secundarios. [23]
Androide
Para algunos teléfonos Android con un cargador de arranque bloqueado, ptrace se usa para obtener control sobre el proceso de inicio para habilitar un 'segundo arranque' y reemplazar los archivos del sistema. [ cita requerida ]
Referencias
- ^ sydbox
- ^ a b PRoot
- ^ "Fakeroot NG" . Consultado el 12 de mayo de 2020 .
- ^ Por ejemplo, retty usa ptrace para alterar los descriptores de archivo de otro proceso y para inyectar código ejecutable en el segmento de texto del objetivo.
- ^ a b c "página de manual de ptrace (2)" , sección 2 del manual de Linux
- ^ Yama.txt en Linux Git
- ^ a b El diseño e implementación del sistema operativo 4.4 BSD , Marshall Kirk McKusick , Keith Bostic , Michael J. Karels, John Quarterman , Addison-Wesley, abril de 1996, ISBN 0-201-54979-4
- ^ a b c "Valores de solicitud de ptrace ()" , Guía de transición de Solaris , Sun Microsystems , 2000
- ^ http://man.cat-v.org/unix-6th/2/ptrace
- ^ "ptrace (2)" , manual de IRIX 6.5, sección 2, biblioteca de techpubs de SGI
- ^ "ptrace, ptracex, subrutina ptrace64" , Referencia técnica de IBM AIX: Sistema operativo base y extensiones, Volumen 1
- ^ ptrace (2) , netbsd manual, sección 2
- ^ [1] , manual de FreeBSD, sección 2
- ^ "ptrace (2)" , manual de OpenBSD, sección 2
- ^ ptrace (2) , manual de SCO UnixWare 7, sección 2
- ^ "Notas de compatibilidad de llamadas del sistema" Archivado el 16 de julio de 2011 en Wayback Machine , documentación de UnixWare 7
- ^ "Llamada al sistema ptrace () (obsoleta)" , Notas de la versión 3 de HP-UX 11i: HP 9000 y HP Integrity Servers, Hewlett Packard , febrero de 2007
- ^ "página de manual de ptrace (2)" , manual de Apple Darwin / OS-X
- ^ "Poseer los Fanboys: Hackear Mac OS X" , Charlie Miller,conferencia de Black Hat Briefings 2008
- ^ "Apple 'rompe' la aplicación de desarrollador Sun" , Matthew Broersma, Computerworld UK , 24 de enero de 2008
- ^ Capítulo 9, Componentes internos de Mac OS X: un enfoque de sistemas , Amit Singh, ISBN 978-0-321-27854-8 , Addison Wesley, 2006
- ^ "ptrace (2)" , Manual de llamadas del sistema BSD, Biblioteca de referencia de Apple iPhone OS
- ^ a b c d "KernelHardening" , hoja de ruta del equipo de seguridad de Ubuntu
- ^ "prctl (2)" , manual del programador de Linux, sección 2
- ^ "PATCH ptrace: permitir la restricción del alcance de ptrace" publicado por elingeniero de Canonical Ltd. Kees Cook, lista de correo del kernel de Linux, 16 de junio de 2010
enlaces externos
- Artículo de Linux Gazette sobre ptrace
- Artículo sobre ptrace en linux journal