Есть ли обходной путь для: "dtrace не может контролировать исполняемые файлы, подписанные с ограниченными правами"?
Похоже, что в OS X 10.11 El Capitan, dtruss
и dtrace
больше не могут делать то, что они предназначены. Это ошибка, которую я получаю, когда пытаюсь запустить sudo dtruss curl ...
:
dtrace: не удалось выполнить завиток: dtrace не может управлять исполняемыми файлами, подписанными с ограниченными правами
Я сталкивался с людьми, которые замечают эту проблему, но до сих пор нет решений.
Есть ли способ исправить это или обойти это?
Ответы
Ответ 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.
Для двоичных файлов, которые все еще могут нормально функционировать после копирования, это лучший вариант, поскольку он фиксирует весь срок службы процесса и не требует отключения каких-либо защит.