Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Для тех, кто хочет, чтобы система dtrace отправила двоичный код после csrutil disable, copy в каталог, который не является "ограниченным", например, /tmp

[email protected]~ $ csrutil status
System Integrity Protection status: disabled.
[email protected]~ $ cp /bin/echo /tmp
[email protected]~ $ 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

Ответ 2

Как только вы 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

Ответ 3

Как Андрей замечает это из-за System Integrity Protection, также известного как "rootless".

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

Отключение 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.

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