Могу ли я убить другой процесс из обработчика SIGSEGV?

Предыстория: я фаззинг долгоживущего процесса с помощью afl-fuzz, передавая ему имя файла для обработки из заглушки, которую afl-fuzz запускает для каждого образца.

Когда долгоживущий процесс падает из-за SIGSEGV, я хочу, чтобы заглушка также генерировала SIGSEGV, чтобы afl-fuzz помечал образец как интересный.

Будет ли работать вызов kill(stub_pid, SIGSEGV) из обработчика SIGSEGV долгоживущего процесса?


person patraulea    schedule 01.10.2015    source источник
comment
Попробуйте. Почему бы и нет?   -  person cadaniluk    schedule 01.10.2015
comment
Согласно руководству по kill, любой процесс будет уничтожен, если вы иметь на это разрешение.   -  person Enzo Ferber    schedule 01.10.2015
comment
Согласно справочной странице signal.7 (man7.org/linux/man -pages/man7/signal.7.html), kill() безопасен для асинхронных сигналов, поэтому он будет работать из обработчика сигнала так же, как и в обычном коде. Но заменив обработчик SIGSEGV, вы не сгенерируете основной файл, если хотите, если каким-либо образом не вызовете обработчик SIGSEGV по умолчанию.   -  person Andrew Henle    schedule 01.10.2015
comment
Вы можете, но убедитесь, что обработчик не возвращает значение, поскольку возврат из обработчика SIGSEGV является UB.   -  person Filipe Gonçalves    schedule 01.10.2015
comment
Это не проблема. Ответ: не разбиваться.   -  person wildplasser    schedule 14.10.2015
comment
@wildplasser: что ты имеешь в виду? Пользователь хочет вызвать сбой своей программы, чтобы используемый им фаззер заметил, что данный входной образец интересен. Что в этом плохого?   -  person d33tah    schedule 14.10.2015


Ответы (3)


Будет ли работать вызов kill(stub_pid, SIGSEGV) из обработчика SIGSEGV долгоживущего процесса?

Если процесс попадает в SIGSEGV-обработчик, происходит что-то очень плохое, что может включать в себя полностью уничтоженный стек и/или управление памятью.

На данный момент не рекомендуется полагаться на что-либо еще, кроме как на то, что процесс идет вниз.

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


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

Взгляните на обработку сигналов внутри сценариев оболочки (ключ поиска: «trap»), поскольку такой сценарий может быть родительским для процесса, который вы хотите отслеживать.

person alk    schedule 04.10.2015
comment
Это на самом деле не отвечает на вопрос. - person d33tah; 14.10.2015

не рекомендуется делать это через SIGSEGV, но вы можете сделать это, если у вас есть надлежащее разрешение.

person incompetent    schedule 01.10.2015

Вместо того, чтобы думать, как вызвать ошибку сегментации в вашей программе, чтобы AFL заметил что-то странное, просто вызовите abort(). SIGABRT также перехватывается AFL, и его гораздо проще запустить.

person d33tah    schedule 13.10.2015
comment
Любой способ сбоя был бы в порядке, у меня были проблемы с распространением сбоя из долгоживущего процесса (инициализация занимала секунды, каждый образец занимал мс) обратно на заглушку, которую вызывает AFL. - person patraulea; 14.10.2015
comment
Ах! Думаю, теперь я это понимаю. Я предположил, что вы хотели бы сигнализировать о сбое изнутри заглушки. - person d33tah; 14.10.2015
comment
@patraulea: с другой стороны, не возникнет ли у вас проблем с определением пути таким образом? - person d33tah; 14.10.2015