Могу ли я убить другой процесс из обработчика SIGSEGV?
Предыстория: я размываю долгоживущий процесс с помощью afl-fuzz, передавая ему имя файла для обработки из заглушки, которую afl-fuzz запускает для каждого образца.
Когда через SIGSEGV происходит сбой долгоживущего процесса, я хочу, чтобы заглушка также генерировала SIGSEGV, чтобы afl-fuzz пометил образец как интересный.
Будет звонить kill(stub_pid, SIGSEGV)
из работы обработчика SIGSEGV долгоживущего процесса?
3 ответа
Будет ли работать вызов kill(stub_pid, SIGSEGV) из обработчика SIGSEGV долгоживущего процесса?
Если процесс заканчивается в SIGSEGV
- обработчик чего-то очень плохого, что может включать в себя полностью разрушенный стек и / или управление памятью.
На данном этапе не стоит больше полагаться на что-либо, а просто на то, что процесс затихает.
Попытка вызвать любое функционально за пределами этой точки, скорее всего, потерпит неудачу, что ненадежно.
Гораздо более безопасный подход к этому состоял бы в том, чтобы вызывающий процесс отслеживал своего дочернего элемента, и если дочерний процесс завершается неожиданно (обычно через SIGSEGV
) начать соответствующие действия.
Посмотрите на обработку сигналов внутри сценариев оболочки (seach-key: "trap
"), так как такой сценарий может быть родительским для процесса, который вы хотите отслеживать.
Не рекомендуется делать это через SIGSEGV, но вы можете сделать это, если у вас есть соответствующее разрешение.
Вместо того, чтобы задаваться вопросом, как вызвать ошибку сегментации в вашей программе, чтобы AFL заметил что-то странное, просто вызовите abort()
, SIGABRT также попадает в AFL, и его гораздо легче вызвать.