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_reboot
implementació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í?
linux
reboot
system-calls
lgeorget
fuente
fuente
getpid
y 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 ...Respuestas:
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 quereboot()
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:
fuente