Какая польза от «магических аргументов» в системном вызове перезагрузки Linux?

10

Когда я читал исходный код 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;

Интересно, какую «безопасность» он на самом деле обеспечивает. Я имею в виду, чтобы предотвратить злоупотребление? В этом случае, поскольку параметры являются общедоступными, любая библиотека или приложение могут неправильно использовать системный вызов, даже если они необходимы для передачи параметров. Что я пропустил?

lgeorget
источник
Вероятно, это случайные вызовы, например, из-за повреждения памяти или опечатки в системном номере. Стоит ли беспокоиться об этом, не знаю.
Дероберт
@derobert Имеет смысл, но ... не все ли системные вызовы нуждаются в такой защите? За исключением случаев getpidи тому подобного, конечно, все они могут иметь непредсказуемые последствия при неправильном использовании. Или, может быть, все другие системные вызовы уже имеют достаточно параметров для проверки, чтобы сделать их безвредными, если они вызваны неправильно. Хотя мне кажется странным представление о «безопасности» ...
lgeorget
В самом деле. Я не уверен, что когда-то Линус преследовал ошибку, которая держала # $ & #! перезагрузка его машины, или если кто-то просто добавил его, потому что он был параноиком, и т. д. То, от чего он должен защищаться, довольно ясно; Зачем нужна защита от этого - хороший вопрос.
Дероберт
@derobert Возможно удержание от кого-то, использовавшегося для интегральных микросхем, где многие микросхемы реализуют своего рода защиту для включения функции отключения (например, вы должны записать биты XYZ в специальный регистр, прежде чем сработает инструкция отключения). Не уверен, что сроки этого имеют смысл,
mbrig

Ответы:

10

На этот вопрос ответили в этом вопросе супер-пользователя:

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

Интересно, что второй набор магических чисел соответствует дням рождения Линуса и его трех дочерей:

хрунтинг
источник
1
Ах, я не думал о проверке других сайтов. Я никогда не думал, что этот вопрос может принадлежать, кроме как здесь. В любом случае, спасибо за ваш ответ. :-)
lgeorget