Alors que je lisais le code source de Linux, et plus spécifiquement le code des appels système, je suis tombé sur l' sys_reboot
implémentation: 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 }
Au milieu, il y a ce morceau de code spécifique:
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;
Je me demande quel genre de «sécurité» cela procure réellement. Je veux dire, est-ce pour éviter les abus? Dans ce cas, comme les paramètres sont publics, toute bibliothèque ou application peut mal utiliser l'appel système, même si elle doit transmettre les paramètres. Qu'est-ce que j'ai raté?
linux
reboot
system-calls
lgeorget
la source
la source
getpid
et similaires, bien sûr, ils peuvent tous avoir des conséquences imprévisibles s'ils sont mal utilisés. Ou peut-être que tous les autres appels système ont déjà suffisamment de paramètres à vérifier pour les rendre inoffensifs s'ils sont appelés à tort. Cela ressemble à une étrange idée de "sécurité" pour moi, cependant ...Réponses:
Cette question a été répondue dans cette question de super utilisateur:
Fondamentalement, un petit flip dans une adresse peut faire croire à un programme qu'il appelle un appel système alors qu'en fait, il appelle l'
reboot()
appel système. Parce quereboot()
c'est une opération très destructrice et non synchrone qui efface l'état du système - effaçant ainsi la preuve du problème de basculement de bits qui serait autrement exposé comme une erreur de programme ou une panique - Linux inclut des protections supplémentaires autour de son utilisation réussie .Chose intéressante, le deuxième ensemble de nombres magiques correspond aux anniversaires de Linus et de ses trois filles:
la source