La funzione reboot() di Linux ha una signature interessante:
int reboot(int magic, int magic2, int cmd, void *arg);
Questa funzione può essere richiamata solo da un uid 0 (ovvero quello del root), ma è necessario anche indicare due “magic numbers” per fare eseguire la funzione. Perchè?
Se per qualche motivo, un processo con uid 0 impazzisce e per problemi di puntatori finisce per caso nella locazione di memoria della funzione di reboot(), la farebbe avviare facendo accadere qualcosa di spiacevole.
Per evitare questo, i magic numbers aggiungono una rete di sicurezza aggiuntiva. E’ infatti molto difficile che il programma esegua un salto in quella locazione di memoria ed abbia nello stack o nei registri quegli esatti numeri magici, come spiegato nel sorgente del kernel:
273 * Reboot system call: for obvious reasons only root may call it, 274 * and even root needs to set up some magic numbers in the registers 275 * so that some mistake won't make this reboot the whole machine. 276 * You can also set the meaning of the ctrl-alt-del-key here. 277 * 278 * reboot doesn't sync: do that yourself before calling this. 279 */
Ecco una cosa interessante riguardo ai vari numeri magic2: questi hanno un significato speciale. In esadecimale, sono le date di compleanno di Torvalds e delle sue figlie
#define LINUX_REBOOT_MAGIC1 0xfee1dead #define LINUX_REBOOT_MAGIC2 672274793 // 0x28121969 #define LINUX_REBOOT_MAGIC2A 85072278 // 0x05121996 #define LINUX_REBOOT_MAGIC2B 369367448 // 0x16041998 #define LINUX_REBOOT_MAGIC2C 537993216 // 0x20112000
Uno qualunque fra questi numeri, viene accettato come magic2 e fare effettuare il reboot del sistema:
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;
Fonte: forthescience