Когда я читал исходный код Linux и, в частности, системные вызовы кода, я столкнулся с sys_reboot
реализацией: http://lxr.free-electrons.com/source/kernel/reboot.c#L199 .
199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200 void __user *, arg)
201 {
202 ...
...
286 }
В середине есть этот конкретный кусок кода:
209
210 /* For safety, we require "magic" arguments. */
211 if (magic1 != LINUX_REBOOT_MAGIC1 ||
212 (magic2 != LINUX_REBOOT_MAGIC2 &&
213 magic2 != LINUX_REBOOT_MAGIC2A &&
214 magic2 != LINUX_REBOOT_MAGIC2B &&
215 magic2 != LINUX_REBOOT_MAGIC2C))
216 return -EINVAL;
Интересно, какую «безопасность» он на самом деле обеспечивает. Я имею в виду, чтобы предотвратить злоупотребление? В этом случае, поскольку параметры являются общедоступными, любая библиотека или приложение могут неправильно использовать системный вызов, даже если они необходимы для передачи параметров. Что я пропустил?
linux
reboot
system-calls
lgeorget
источник
источник
getpid
и тому подобного, конечно, все они могут иметь непредсказуемые последствия при неправильном использовании. Или, может быть, все другие системные вызовы уже имеют достаточно параметров для проверки, чтобы сделать их безвредными, если они вызваны неправильно. Хотя мне кажется странным представление о «безопасности» ...Ответы:
На этот вопрос ответили в этом вопросе супер-пользователя:
По сути, небольшое изменение адреса может заставить программу думать, что она вызывает один системный вызов, когда фактически она вызывает
reboot()
системный вызов. Посколькуreboot()
это очень деструктивная, несинхронизирующая операция, которая стирает состояние системы - и, следовательно, стирает свидетельство проблемы переворачивания битов, которая в противном случае была бы раскрыта как программная ошибка или паника, - в Linux предусмотрены дополнительные средства защиты при ее успешном использовании. ,Интересно, что второй набор магических чисел соответствует дням рождения Линуса и его трех дочерей:
источник