¿Cuál es el uso de "argumentos mágicos" en la llamada al sistema de reinicio de Linux?

10

Mientras leía el código fuente de Linux, y más específicamente el código de llamadas del sistema, me encontré con la sys_rebootimplementación: 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 }

En el medio, está este código específico:

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;

Me pregunto qué tipo de "seguridad" realmente proporciona. Quiero decir, ¿es para evitar el mal uso? En este caso, como los parámetros son públicos, cualquier biblioteca o aplicación podría hacer un mal uso de la llamada del sistema a pesar de que están obligados a pasar los parámetros. ¿Qué me perdí?

lgeorget
fuente
Es probable que sea por llamadas accidentales, por ejemplo, por daños en la memoria o por hacer un error tipográfico en un número de syscall. Si eso es realmente algo por lo que vale la pena preocuparse, no lo sé.
derobert
@derobert Tiene sentido pero ... ¿no necesitarían todas las llamadas al sistema una protección como esta? Excepto getpidy similares, por supuesto, todos pueden tener consecuencias impredecibles si se usan incorrectamente. O tal vez, todas las demás llamadas al sistema ya tienen suficientes parámetros para ser verificados para que sean inofensivos si se llaman incorrectamente. Se siente como una extraña idea de "seguridad" para mí, aunque ...
lgeorget
En efecto. ¡No estoy seguro si en algún momento Linus estaba persiguiendo un error que mantenía # $ & #! reiniciando su máquina, o si alguien simplemente la agregó porque eran paranoicos, etc. Lo que se supone que debe proteger es bastante claro; por qué se necesita protección contra eso es una buena pregunta.
derobert
@derobert Posiblemente un remanente de alguien acostumbrado a circuitos integrados, donde muchos chips implementan algún tipo de protección para permitir la funcionalidad de apagado (debe escribir bits XYZ en un registro especial antes de que la instrucción de apagado funcione, por ejemplo). No estoy seguro si los plazos para que haga sentido sin embargo,
mbrig

Respuestas:

10

Esta pregunta ha sido respondida en esta pregunta de Superusuario:

Básicamente, un pequeño cambio en una dirección puede hacer que un programa piense que está llamando a una llamada del sistema cuando, de hecho, está llamando a la llamada del reboot()sistema. Debido a que reboot()es una operación muy destructiva y no sincronizada que borra el estado del sistema, borrando así la evidencia del problema de volteo de bits que de otro modo estaría expuesto como un error del programa o pánico, Linux incluye protecciones adicionales en torno a su uso exitoso .

Curiosamente, el segundo conjunto de números mágicos corresponde a los cumpleaños de Linus y sus tres hijas:

cazando
fuente
1
Ah, no pensé en verificar los otros sitios. Nunca pensé que esta pregunta podría pertenecer a otra parte que no sea aquí. De todos modos, gracias por tu respuesta. :-)
lgeorget