PTRACE_SYSCALL и orig_eax - PullRequest
       1

PTRACE_SYSCALL и orig_eax

2 голосов
/ 05 февраля 2012

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

Я скомпилировал пустую тестовую дочернюю (мгновенно завершающуюся) программу, а также у меня есть родительский процесс, который разветвляется, включает трассировку и выполняет дочернюю программу. Родительский процесс использует PTRACE_SYSCALL и каждый раз проверяет orig_eax. Моя тестовая программа сообщает, что ребенка останавливали 49 раз (что, я полагаю, означает 48/2 + 1 системные вызовы).

Я хотел знать, всегда ли последовательность системных вызовов (инициализация) и / или можно узнать, когда я могу начать и когда остановить kill-on-syscall в моем родителе?

1 Ответ

3 голосов
/ 27 ноября 2012

Однажды у меня была похожая проблема (см. мой вопрос по теме ).Когда программа запускается, она выполняет много системных вызовов при инициализации приложения (например, загрузка общих библиотек) перед вызовом main().Я просто разрешил несколько дополнительных системных вызовов и использовал другие средства безопасности (например, chroot), чтобы приложение не получало доступа к нежелательным файлам.

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

После нахождения точки входа есть другой способ запретить программе делать определенные системные вызовы.Вместо использования PTRACE_SYSCALL для проверки каждого системного вызова, выполняемого программой, введите prctl(PR_SET_SECCOMP, ...) вызов программы (используя ptrace()), а затем просто оставьте программу работающей.

...