Как заблокировать отслеживание SIGTRAP с помощью ptrace

Когда я хочу проверить системный вызов tracee, я использую PTRACE_ATTACH, затем PTRACE_SYSCALL в цикле и, наконец, PTRACE_DETACH.

Проблема в том, что если трассируемый зарегистрирован в SIGTRAP или SIGCONT, он может изменить свое поведение, пока я использую PTRACE_SYSCALL или PTRACE_DETACH, а я не хочу этого делать.

Когда я присоединяюсь к tracee с PTRACE_ATTACH, tracee получает SIGSTOP, но не может зарегистрироваться/отреагировать на этот сигнал, так что все в порядке.

Каково решение, что трассировщик не мог поймать SIGTRAP, когда я использую PTRACE_SYSCALL или SIGCONT, когда я использовал PTRACE_CONT


person Keystone    schedule 09.05.2020    source источник
comment
См. мои последние комментарии: stackoverflow.com/questions/61667231/   -  person Craig Estey    schedule 10.05.2020
comment
@CraigEstey На самом деле это звучит как полная противоположность этому. В этом вопросе спрашивающий играл роль автора вредоносного ПО и хотел знать, как удержать исследователей безопасности от использования ptrace для анализа своего вредоносного ПО. В этом вопросе спрашивающий играет роль исследователя безопасности и хочет знать, как использовать ptrace для анализа (предположительно с точками останова) вредоносных программ.   -  person Joseph Sible-Reinstate Monica    schedule 10.05.2020
comment
@JosephSible-ReinstateMonica Методы предотвращения того, что трассировщик делает что-либо, чего не хочет трассировщик, одинаковы. Если вы начинаете с PTRACE_TRACEME, tracer может изменить/подавить любой системный вызов tracee, который он хочет, прежде чем это произойдет. Если из PTRACE_ATTACH, трассировщику может потребоваться ввести код для отмены того, что трассировщик уже сделал (например, signal(SIGTRAP,SIG_IGN)).   -  person Craig Estey    schedule 10.05.2020
comment
@Catig, как трассировщик может undo signal(SIGTRAP,...), например, если трассировщик зарегистрировался на этот сигнал до того, как трассировщик подключится к трассировщику?   -  person Keystone    schedule 10.05.2020
comment
@Keystone Смысл подавления сигнала в том, что вы можете запретить запуск их обработчика сигналов, не сбрасывая его.   -  person Joseph Sible-Reinstate Monica    schedule 10.05.2020


Ответы (1)


Трассировщик всегда получает первые бабки при обработке сигнала, и он может подавить сигнал, чтобы обработчик трассируемого не запускался. Единственное, о чем вам нужно беспокоиться, это если трассируемый блокирует сигнал чем-то вроде sigprocmask или блокирующим вызовом pselect и использует что-то вроде sigpending или signalfd для его поиска, что вы можете исправить, изменив или эмулируя соответствующие системные вызовы.

Чтобы подавить сигнал, просто передайте 0 для sig при возобновлении после остановки доставки сигнала. Из man 2 ptrace:

Инжекция и подавление сигнала

После того, как трассировщик заметит остановку доставки сигнала, трассировщик должен перезапустить трассируемого вызовом

ptrace(PTRACE_restart, pid, 0, sig)

где PTRACE_restart — один из перезапускающих запросов ptrace. Если sig равно 0, то сигнал не доставляется. В противном случае доставляется сигнал sig. На этой странице руководства эта операция называется инъекцией сигнала, чтобы отличать ее от остановки доставки сигнала.

person Joseph Sible-Reinstate Monica    schedule 09.05.2020