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 では、これに正常に追加の保護が提供されます。
興味深いことに、2番目の魔法の数字セットは、Linusと彼の3人の娘の誕生日に対応しています。