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

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

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

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

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


person Flimm    schedule 02.11.2015    source источник
comment
Это выглядит кстати: apple.stackexchange.com/questions/208478/   -  person Andrew Henle    schedule 02.11.2015
comment
Возможный дубликат dtruss не работает на ps в OS X 10.11   -  person kenorb    schedule 08.04.2016


Ответы (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
person Raghu Dodda    schedule 21.04.2016
comment
Другими словами, вы можете подключиться к запущенному процессу, но dtruss не запустит его. Это странно. Сорта кажется ошибкой. dtruss -n тоже работает. Это гораздо лучший способ обхода, чем копирование. - person Jason Haslam; 13.08.2016

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

person C.W.    schedule 24.01.2016
comment
просто предупреждаю, что это не работает для меня на El Capitan 10.11.4. Я пытаюсь понять, почему Picasa не запускается, поэтому скопировал его в / tmp, но вижу: ~$ sudo dtruss -f -t open sudo -u $USER /tmp/Picasa dtrace: failed to execute sudo: dtrace cannot control executables signed with restricted entitlements - person sming; 22.03.2016
comment
Это может быть причиной того, что dturss пытается отследить исполняемый файл sudo. Второй sudo там не нужен. - person Grisha Levit; 25.05.2016

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

Вы можете отключить его полностью или частично (включить только 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 к процессам с ограниченным доступом

person Alexander Ushakov    schedule 07.11.2015
comment
Обратите внимание, что в конце этих инструкций упоминается, что это не работает. Я не совсем уверен, но, учитывая, что ошибка связана с вещами, подписанными с ограниченными правами, я думаю, что на самом деле это может не иметь отношения к SIP. - person Glyph; 18.11.2015
comment
@glyph Я пробовал эту инструкцию, и она у меня работает. Уведомление в конце касается частичного отключения SIP - в этом случае, если вы включите только dtrace, вы все равно не сможете отслеживать системные процессы, которые ограничены. Но вы сможете отслеживать другие процессы. - person Alexander Ushakov; 24.11.2015
comment
Убедитесь, что вы нацелены на фактический исполняемый файл; если есть промежуточный сценарий, который в конечном итоге вызывает исполняемый файл, dtrace попытается подключиться к интерпретатору, который, скорее всего, не будет работать даже с отключенным SIP. - person Mark Reed; 14.03.2016
comment
Есть ли обходной путь, позволяющий dtrace подключаться к процессам с ограниченным доступом? - person Heath Borders; 17.09.2016
comment
Этот URL-адрес - 404. У кого-нибудь есть кеш-версия или зеркальная версия? - person Schneems; 29.09.2017
comment
@Schneems Полный текст инструкции цитируется в ответе - person Alexander Ushakov; 29.09.2017
comment
Интересно, знает ли кто-нибудь способ сообщить об этом в Apple / попросить сделать модуль dtrace / syscalls / probes совместимым с SIP. все остальное кажется немного недальновидным / склонным не работать вскоре после этого. - person Florian Heigl; 07.01.2020

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

Отключать 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.

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

person Jonathan Lynch    schedule 11.10.2017
comment
это не работает для меня. Я пытаюсь отследить свои собственные двоичные файлы, которые не ограничены, но все еще получаю ошибки от dtruss. - person horseyguy; 04.01.2018
comment
У меня не работает Мохаве с исполняемым файлом /sbin/ifconfig. Выход dtrace: failed to execute ./ifconfig: (os/kern) failure. - person Werner Henze; 29.11.2018
comment
@WernerHenze понял это! dtrace не может подключиться к ifconfig из-за процесса кодовой подписи, который использует Apple. Simplfy codesign --remove-signature ./ifconfig и он должен работать! - person Max Coplan; 10.09.2019

Похоже, что полное отключение 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
person David Mulder    schedule 15.01.2016

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

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

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

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

person Birchlabs    schedule 25.06.2017