Могу ли я убить другой процесс из обработчика 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, и его гораздо легче вызвать.

Другие вопросы по тегам