I Magic Number di Reboot()

Linus Torvalds

I Magic Number di Reboot()

0

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.

 

Linus Torvalds- studente dell'università di Helsinki ha dato il via allo sviluppo del kernel di Linux

Linus Torvalds- studente dell’università di Helsinki ha dato il via allo sviluppo del kernel di Linux

 

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

 

About the Author

Federico PonziStudente, Webmaster ed appassionato di tutto ciò che è informatico con una spruzzata di scienza.View all posts by Federico Ponzi

Leave a Reply