当我阅读 Linux 源代码,更具体地说是系统调用代码时,我遇到了sys_reboot
实现: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 }
中间有一段具体的代码:
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;
我想知道它实际上提供了什么样的“安全”。我的意思是,这是为了防止滥用吗?在这种情况下,由于参数是公共的,任何库或应用程序都可能滥用系统调用,即使它们需要传递参数。我错过了什么?
答案1
这个问题已在此超级用户问题中得到回答:
基本上,地址中的一位翻转可能会导致程序认为它正在调用一个系统调用,而实际上它正在调用该reboot()
系统调用。因为reboot()
这是一个非常具有破坏性的非同步操作,它会擦除系统的状态 - 从而擦除位翻转问题的证据,否则这些问题可能会作为程序错误或恐慌而暴露 - Linux 围绕其成功使用提供了额外的保护。
有趣的是,第二组神奇数字对应于莱纳斯和他的三个女儿的生日: