Quelle est l'utilisation des «arguments magiques» dans l'appel système de redémarrage Linux?

10

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_rebootimplé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é?

lgeorget
la source
Il s'agit probablement d'appels accidentels provenant, par exemple, d'une corruption de mémoire ou d'une faute de frappe dans un numéro d'appel système. Que ce soit réellement quelque chose qui mérite d'être inquiété, je ne sais pas.
derobert
@derobert C'est logique mais ... tous les appels système n'auraient-ils pas besoin d'une telle protection? Sauf getpidet 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 ...
lgeorget
En effet. Je ne sais pas si à un moment donné Linus était en train de pourchasser un bogue qui gardait # $ & #! redémarrer sa machine, ou si quelqu'un l'a simplement ajoutée parce qu'elle était paranoïaque, etc. Ce contre quoi elle est censée se protéger est assez clair; pourquoi une protection contre cela est nécessaire est une bonne question.
derobert
@derobert Peut-être un maintien de quelqu'un habitué aux circuits intégrés, où de nombreuses puces implémentent une sorte de garde pour activer la fonctionnalité d'arrêt (vous devez écrire des bits XYZ dans un registre spécial avant que l'instruction d'arrêt fonctionne, par exemple). Je ne sais pas si les délais pour cela ont du sens,
mbrig

Réponses:

10

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 que reboot()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:

chasse
la source
1
Ah, je n'ai pas pensé à vérifier les autres sites. Je n'ai jamais pensé que cette question pourrait appartenir ailleurs qu'ici. Quoi qu'il en soit, merci pour votre réponse. :-)
lgeorget