Ptrace - Ptrace

ptrace это системный вызов нашел в Unix и несколько Unix-подобный операционные системы. Используя ptrace (название является аббревиатурой от "process trace") один обработать может управлять другим, позволяя контроллеру проверять и управлять внутренним состоянием своей цели. ptrace используется отладчики и другие инструменты анализа кода, в основном в качестве помощи при разработке программного обеспечения.

Использует

ptrace используется отладчиками (такими как GDB и dbx ), с помощью инструментов отслеживания, таких как Strace и ltrace, и по покрытие кода инструменты. ptrace также используется специализированными программами для исправления запущенных программ, чтобы избежать исправленных ошибок или преодолеть функции безопасности. В дальнейшем его можно использовать как песочница[1][2] и как симулятор среды выполнения (например, имитация корневого доступа для некорневого программного обеспечения[2][3]).

Присоединяясь к другому процессу с помощью вызова ptrace, инструмент получает полный контроль над работой своей цели. Это включает манипулирование его файловые дескрипторы, память и регистры. Он может Единственный шаг через целевой код, может наблюдать и перехватывать системные вызовы и их результаты, а также может манипулировать целевым сигнал обработчики и оба получают и отправляют сигналы от его имени. Возможность записи в память цели позволяет изменять не только ее хранилище данных, но и собственное приложение. сегмент кода, позволяя контроллеру установить контрольные точки и исправьте работающий код цели.[4]

Поскольку способность проверять и изменять другой процесс очень мощная, ptrace может подключаться только к процессам, которым владелец может отправлять сигналы (обычно только своим собственным процессам); то суперпользователь аккаунт может отслеживать практически любой процесс (кроме в этом на ядрах до 2.6.26). В системах Linux эта функция безопасность на основе возможностей, возможность ptrace дополнительно ограничивается возможностью CAP_SYS_PTRACE[5] или ЯМА Модуль безопасности Linux.[6] В FreeBSD, это ограничено Тюрьмы FreeBSD и Обязательный контроль доступа политики.

Ограничения

Связь между контроллером и целью осуществляется с помощью повторных вызовов ptrace, передавая между ними небольшой блок памяти фиксированного размера (что требует двух переключатели контекста за звонок); это крайне неэффективно при доступе к большим объемам целевой памяти, так как это можно сделать только в слово блоки размера (с вызовом ptrace для каждого слова).[7] По этой причине 8-я редакция Unix представила procfs, что позволяет разрешенным процессам прямой доступ к памяти другого процесса - 4.4BSD следует, и использование / proc Поддержка отладчика была унаследована Solaris, BSD и AIX и в основном скопирована Linux.[7] Некоторые, например Солярис, полностью удалили ptrace как системный вызов, сохранив его как вызов библиотеки, который переинтерпретирует вызовы ptrace в терминах procfs платформы.[8] Такие системы используют ioctls на дескриптор файла открытых / proc файл для выдачи команд контролируемому процессу.[8] FreeBSD, с другой стороны, расширенный ptrace для устранения упомянутых проблем и объявленный procfs устарело из-за присущих ему конструктивных проблем.[расплывчатый ][нужна цитата ]

ptrace предоставляет только самый простой интерфейс, необходимый для поддержки отладчиков и подобных инструментов. Программы, использующие его, должны досконально знать специфику ОС и архитектуры, включая структуру стека, двоичный интерфейс приложения, системный вызов механизм, искажение имени, то формат любых отладочных данных, и несут ответственность за понимание и разборку Машинный код самих себя. Кроме того, программы, которые вводят исполняемый код в целевой процесс или (например, gdb) позволяют пользователю вводить команды, которые выполняются в контексте цели, должны сами генерировать и загружать этот код, как правило, без помощи загрузчик программ.

Поддержка

Unix и BSD

ptrace был впервые реализован в Версия 6 Unix,[9] и присутствовал как в SVr4 и 4.3BSD ветки Unix.[5] ptrace доступен как системный вызов на IRIX,[10] IBM AIX,[11] NetBSD,[12] FreeBSD,[13] OpenBSD,[14] и Linux.[5] ptrace реализован как вызов библиотеки в Solaris, построенный на файловой системе procfs ядра Solaris; Sun отмечает, что ptrace в Solaris предназначена для обеспечения совместимости, и рекомендует в новых реализациях использовать более богатый интерфейс, предоставляемый proc.[8] UnixWare также имеет ограниченную трассировку[15] но, как и Sun, SCO рекомендует разработчикам использовать вместо этого лежащие в основе функции procfs.[16] HP-UX поддерживал ptrace до выпуска 11i v3 (он устарел в пользу ttrace, аналогичный вызов, специфичный для ОС, в 11i v1).[17]

macOS

Apple macOS также реализует ptrace как системный вызов. Версия Apple добавляет специальную опцию PT_DENY_ATTACH - если процесс вызовет эту опцию на себе, последующие попытки ptrace процесса потерпят неудачу.[18] Apple использует эту функцию, чтобы ограничить использование отладчиков в программах, которые манипулируют DRM -ed контент, в том числе iTunes.[19] PT_DENY_ATTACH также отключает DTrace умение следить за процессом.[20] Отладчики в OS X обычно используют комбинацию ptrace и Мах API виртуальных машин и потоков.[21] ptrace (снова с PT_DENY_ATTACH) доступен разработчикам для Apple iPhone.[22]

Linux

Linux также дает процессам возможность предотвращать присоединение к ним других процессов. Процессы можно назвать prctl syscall и очистить их PR_SET_DUMPABLE флаг; в более поздних ядрах это не позволяет некорневым процессам отслеживать вызывающий процесс; то OpenSSH Агент аутентификации использует этот механизм для предотвращения перехвата сеанса ssh через ptrace.[23][24][25] Более поздние версии Ubuntu поставляются с ядром Linux, настроенным для предотвращения присоединения ptrace от процессов, отличных от родительского отслеживаемого процесса; это позволяет gdb и strace продолжать работу при выполнении целевого процесса, но предотвращает их подключение к несвязанному запущенному процессу.[23] Управление этой функцией осуществляется через / proc / sys / ядро ​​/ яма / ptrace_scope настройка.[23] В системах, где включена эта функция, такие команды, как "gdb --attach" и "ремень -p" не будет работать.

Начиная с Ubuntu 10.10, ptrace разрешено вызывать только для дочерних процессов.[23]

Android

Для некоторых Android На телефонах с заблокированным загрузчиком ptrace используется для получения контроля над процессом инициализации, чтобы включить «вторую загрузку» и заменить системные файлы.[нужна цитата ]

использованная литература

  1. ^ sydbox
  2. ^ а б PRoot
  3. ^ "Fakeroot NG". Получено 2020-05-12.
  4. ^ Например Retty использует ptrace для изменения файловых дескрипторов другого процесса и для внедрения исполняемого кода в целевой текстовый сегмент
  5. ^ а б c "ptrace (2) страница руководства", Руководство по Linux, раздел 2
  6. ^ Yama.txt в Linux Git
  7. ^ а б Разработка и реализация операционной системы BSD 4.4, Маршалл Кирк МакКьюсик, Кейт Бостик, Майкл Дж. Карелс, Джон Куортерман, Аддисон-Уэсли, апрель 1996 г., ISBN  0-201-54979-4
  8. ^ а б c "Значения запроса ptrace ()", Руководство по переходу на Solaris, Sun Microsystems, 2000
  9. ^ http://man.cat-v.org/unix-6th/2/ptrace
  10. ^ "ptrace (2)", Руководство по IRIX 6.5, раздел 2, библиотека SGI techpubs
  11. ^ "ptrace, ptracex, ptrace64 подпрограмма", Технический справочник IBM AIX: Базовая операционная система и расширения, Том 1
  12. ^ ptrace (2), руководство по netbsd, раздел 2
  13. ^ [1], Руководство FreeBSD, раздел 2
  14. ^ "ptrace (2)", Руководство OpenBSD, раздел 2
  15. ^ ptrace (2), Руководство SCO UnixWare 7, раздел 2
  16. ^ «Примечания по совместимости системных вызовов» В архиве 2011-07-16 на Wayback Machine, Документация по UnixWare 7
  17. ^ "ptrace () Системный вызов (Устарело)", Примечания к выпуску HP-UX 11i версии 3: серверы HP 9000 и HP Integrity, Hewlett Packard, Февраль 2007 г.
  18. ^ "страница руководства ptrace (2)", Руководство Apple Darwin / OS-X
  19. ^ «Владение фанатами: взлом Mac OS X», Чарли Миллер, Брифинги Black Hat конференция 2008
  20. ^ «Apple ломает приложение для разработчиков Sun», Мэтью Броерсма, Computerworld Великобритания, 24 января 2008 г.
  21. ^ Глава 9, Внутреннее устройство Mac OS X: системный подход, Амит Сингх, ISBN  978-0-321-27854-8, Эддисон Уэсли, 2006
  22. ^ "ptrace (2)", Руководство по системным вызовам BSD, Справочная библиотека Apple iPhone OS
  23. ^ а б c d «ЯдроЗароднение», Дорожная карта группы безопасности Ubuntu
  24. ^ "prctl (2)", Руководство программиста Linux, раздел 2
  25. ^ "PATCH ptrace: разрешить ограничение области ptrace" размещение Canonical Ltd. инженер Кис Кук, список рассылки ядра Linux, 16 июня 2010 г.

внешние ссылки