Есть ли обходной путь для: "dtrace не может управлять исполняемыми файлами, подписанными с ограниченными правами"?

Это похоже на OS X 10.11 El Capitan, dtruss а также dtrace больше не может делать то, что должен. Это ошибка, которую я получаю при попытке запустить sudo dtruss curl ...:

dtrace: не удалось выполнить curl: dtrace не может управлять исполняемыми файлами, подписанными с ограниченными правами

Я сталкивался с людьми, замечающими эту проблему, но пока нет решений.

Есть ли способ исправить это или обойти это?

6 ответов

Однажды ты csrutil enable --without dtraceСуществует альтернатива копированию двоичного файла: запустить двоичный файл в одном окне терминала и отследить сам процесс терминала в другом окне терминала.

В первом окне терминала найдите его PID:

$ echo $$
1154

Во втором окне терминала начните трассировку:

$ sudo dtruss -p 1154 -f

Назад, в первом окне терминала запустите процесс, который вы хотите отследить:

$ ls

На этом этапе вы должны увидеть след во втором окне. Игнорируйте записи для PID, который вы отслеживаете (например, 1154), а остальные относятся к процессу (и его потомкам), который вас интересует.

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

Для тех, кто хочет, чтобы dtrace система отправляла двоичный файл после csrutil disable, copy это каталог, который не является "ограниченным", например, /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

См. Комментарий @JJ: https://apple.stackexchange.com/questions/208762/now-that-el-capitan-is-rootless-is-there-any-way-to-get-dtrace-working/224731

Как замечает Эндрю, это из-за защиты целостности системы, также известной как "без корневого доступа".

Вы можете отключить его полностью или частично (включите только dtrace с некоторыми ограничениями).

Полностью отключить SIP

Хотя это не рекомендуется Apple, вы можете полностью отключить защиту целостности системы на своем Mac. Вот как:

  1. Загрузите ваш Mac в режиме восстановления: перезагрузите его и удерживайте cmd+R, пока не появится индикатор выполнения.
  2. Зайдите в меню Утилиты. Выберите терминал там.
  3. Введите эту команду, чтобы отключить защиту целостности системы:

$ csrutil disable

Он попросит вас перезагрузиться - сделайте это, и вы свободны от SIP!

Частично отключить SIP

К счастью, SIP не монолитен: он построен из множества различных модулей, которые мы можем отключить / включить отдельно.

Повторите шаги 1 и 2 из раздела "Полностью отключить SIP" выше. Теперь в Терминале введите эти команды:

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

Перезагрузитесь и наслаждайтесь вашей ОС снова.

Dtrace начинает работать, но вы все еще не можете прикрепить dtrace к ограниченным процессам

Источник инструкций: http://internals.exposed/blog/dtrace-vs-sip.html

Я бы опубликовал это как комментарий, но мне не разрешено.

Отключение SIP не обязательно. Просто скопируйте двоичный файл в другое место, и он прекрасно работает:

$ 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.

Для двоичных файлов, которые могут нормально функционировать после копирования, это лучший вариант, поскольку он фиксирует весь срок службы процесса и не требует отключения каких-либо средств защиты.

Похоже, что полное отключение SIP все еще блокирует dtruss для ограниченных процессов:

$ /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

Смотрите мой ответ на связанный вопрос "Как заставить dtrace запускать трассированную команду с привилегиями не-root?" [Так в оригинале].

DTrace может отслеживать процессы, которые уже запущены. Итак, запустите фоновый процесс, который ждет 1 с для запуска DTrace (извините за состояние гонки), и отследите PID этого процесса.

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

Полное объяснение в связанном ответе.

Другие вопросы по тегам