osx-elcapitan dtrace

osx elcapitan - ¿Existe una solución alternativa para: "dtrace no puede controlar ejecutables firmados con derechos restringidos"?



osx-elcapitan (6)

Como Andrew se da cuenta, se debe a la Protección de integridad del sistema , también conocida como "sin raíz".

Puede deshabilitarlo total o parcialmente (habilite solo dtrace con algunas limitaciones).

Desactivar completamente SIP

Aunque Apple no lo recomienda, puede desactivar por completo la Protección de integridad del sistema en su Mac. Así es cómo:

  1. Arranque su Mac en modo de recuperación: reinícielo y mantenga presionado cmd + R hasta que aparezca una barra de progreso.
  2. Vaya al menú de Utilidades. Elija Terminal allí.
  3. Ingrese este comando para deshabilitar la Protección de integridad del sistema:

$ csrutil disable

Le pedirá que reinicie, ¡hágalo y estará libre de SIP!

Deshabilitar parcialmente SIP

Afortunadamente, SIP no es monolítico: está construido a partir de muchos módulos diferentes que podemos deshabilitar / habilitar por separado.

Repita los pasos 1 y 2 de la sección anterior "Desactivar completamente SIP". Ahora en la Terminal ingrese estos comandos:

$ csrutil clear # restore the default configuration first $ csrutil enable --without dtrace # disable dtrace restrictions *only*

Reinicia y disfruta tu sistema operativo nuevamente.

Dtrace comienza a funcionar pero aún no puede adjuntar dtrace a procesos restringidos

Parece que en OS X 10.11 El Capitan, dtruss y dtrace ya no pueden hacer lo que deben hacer. Este es el error que obtengo cuando intento ejecutar sudo dtruss curl ... :

dtrace: error al ejecutar curl: dtrace no puede controlar ejecutables firmados con derechos restringidos

Me he encontrado con personas que notan este problema, pero hasta ahora no hay soluciones.

¿Hay alguna manera de arreglar esto o solucionar esto?


Para aquellos que deseen rastrear el sistema binario enviado después de csrutil disable , copy en un directorio que no esté "restringido", por ejemplo, /tmp

CC@~ $ csrutil status System Integrity Protection status: disabled. CC@~ $ cp /bin/echo /tmp CC@~ $ sudo dtruss /tmp/echo SYSCALL(args) = return thread_selfid(0x0, 0x0, 0x0) = 46811 0 csops(0x0, 0x0, 0x7FFF51B6CA20) = 0 0 issetugid(0x0, 0x0, 0x7FFF51B6CA20) = 0 0 shared_region_check_np(0x7FFF51B6A918, 0x0, 0x7FFF51B6CA20) = 0 0 stat64("/usr/lib/dtrace/libdtrace_dyld.dylib/0", 0x7FFF51B6BEA8, 0x7FFF51B6CA20 = 0 0

Vea el comentario de @ JJ: https://apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace-working/224731#224731


Parece que deshabilitar completamente SIP todavía bloquea dtruss para procesos restringidos:

$ /usr/bin/csrutil status System Integrity Protection status: disabled. $ sudo dtruss /bin/echo "blah" dtrace: failed to execute /bin/echo: dtrace cannot control executables signed with restricted entitlements $ sw_vers ProductName: Mac OS X ProductVersion: 10.11.2 BuildVersion: 15C50


Publicaría esto como un comentario, pero no tengo permiso.

Deshabilitar SIP no es necesario. Simplemente copie el binario en una ubicación alternativa y funciona bien:

$ sudo dtruss ping google.com dtrace: system integrity protection is on, some features will not be available dtrace: failed to execute ping: dtrace cannot control executables signed with restricted entitlements $ sudo cp $(which ping) . $ sudo dtruss ./ping google.com dtrace: system integrity protection is on, some features will not be available SYSCALL(args) = return PING google.com (172.217.10.78): 56 data bytes ^C $ csrutil status System Integrity Protection status: enabled.

Para los archivos binarios que aún pueden funcionar normalmente después de ser copiados, esta es la mejor opción, ya que captura toda la vida útil del proceso y no requiere deshabilitar ninguna protección.


Una vez que csrutil enable --without dtrace , existe una alternativa para copiar el binario: ejecute el binario en una ventana de Terminal y rastree el proceso de Terminal en otra ventana de Terminal.

En la primera ventana de terminal, encuentre su PID:

$ echo $$ 1154

En la segunda ventana de terminal, comience el rastreo:

$ sudo dtruss -p 1154 -f

Atrás, en la primera ventana de terminal, ejecute el proceso que desea rastrear:

$ ls

En este punto, debería ver el rastro en la segunda ventana. Ignore las entradas para el PID que está rastreando (por ejemplo, 1154), y el resto son para el proceso (y sus descendientes) que le interesan.

1154/0x1499: sigprocmask(0x3, 0x7FFF53E5C608, 0x0) = 0x0 0 1154/0x1499: sigprocmask(0x1, 0x7FFF53E5C614, 0x7FFF53E5C610) = 0x0 0 3100/0xa9f3: getpid(0x7FFF82A35344, 0x7FFF82A35334, 0x2000) = 3100 0 3100/0xa9f3: sigprocmask(0x3, 0x10BE32EF8, 0x0) = 0x0 0


Vea mi respuesta en la question relacionada "¿Cómo puede obtener dtrace para ejecutar el comando rastreado con privilegios no root?" [sic].

DTrace puede espiar procesos que ya se están ejecutando. Por lo tanto, inicie un proceso en segundo plano que espere 1 segundo para que DTrace se inicie (perdón por la condición de la carrera) y espíe el PID de ese proceso.

sudo true && / (sleep 1; ps) & / sudo dtrace -n ''syscall:::entry /pid == $1/ {@[probefunc] = count();}'' $! / && kill $!

Explicación completa en la respuesta vinculada.