Есть ли обходной путь для: "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. Вот как:
- Загрузите ваш Mac в режиме восстановления: перезагрузите его и удерживайте cmd+R, пока не появится индикатор выполнения.
- Зайдите в меню Утилиты. Выберите терминал там.
- Введите эту команду, чтобы отключить защиту целостности системы:
$ 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 $!
Полное объяснение в связанном ответе.