Enquanto lia o código fonte do Linux, e mais especificamente o sistema chama o código, me deparei com a sys_reboot
implementação: 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 }
No meio, há este trecho de 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;
Eu me pergunto que tipo de "segurança" ele realmente oferece. Quero dizer, é para evitar uso indevido? Nesse caso, como os parâmetros são públicos, qualquer biblioteca ou aplicativo pode usar indevidamente a chamada do sistema, mesmo que seja necessário passar os parâmetros. Do que eu senti falta?
linux
reboot
system-calls
lgeorget
fonte
fonte
getpid
e similares, é claro, todos eles podem ter consequências imprevisíveis se mal utilizados. Ou talvez, todos os outros syscalls já tenham parâmetros suficientes para serem verificados para torná-los inofensivos se forem chamados incorretamente. Parece uma idéia estranha de "segurança" para mim, ...Respostas:
Esta pergunta foi respondida nesta pergunta de superusuário:
Basicamente, um pequeno toque em um endereço pode fazer com que um programa pense que está chamando uma chamada de sistema quando, na verdade, está chamando a
reboot()
chamada de sistema. Comoreboot()
é uma operação muito destrutiva e sem sincronização, que apaga o estado do sistema - apagando assim as evidências do problema de inversão de bits que, de outra forma, seria exposto como um erro ou pânico no programa - o Linux inclui proteções extras ao seu uso bem-sucedido .Curiosamente, o segundo conjunto de números mágicos corresponde aos aniversários de Linus e suas três filhas:
fonte