Я обнаружил, что в Linux, сделав свой собственный вызов системному вызову rt_sigqueue
, я могу поместить все, что захочу, в si_uid
и si_pid
полей, и вызов завершается успешно и успешно возвращает неверные значения. Естественно, ограничения uid на отправку сигналов обеспечивают некоторую защиту от такого рода спуфинга, но я опасаюсь, что полагаться на эту информацию может быть опасно. Есть ли хорошая документация по теме, которую я мог бы прочитать? Почему Linux допускает явно неправильное поведение, позволяя вызывающей стороне указывать параметры siginfo
, а не генерировать их в пространстве ядра? Это кажется бессмысленным, тем более что extra sys
вызовы (и, следовательно, затраты на производительность) могут потребоваться для получения uid / gid в пользовательском пространстве.
Изменить: На основе моего чтения POSIX (курсив добавлен мной):
Если si_code - SI_USER или SI_QUEUE, [XSI] или любое значение, меньшее или равное 0, то сигнал был сгенерирован процессом, и si_pid и si_uid должны быть установлены на идентификатор процесса и реальный идентификатор пользователя отправителя, соответственно.
Я считаю такое поведение Linux несоответствующим и серьезной ошибкой.