Ketika saya membaca kode sumber Linux, dan lebih khusus lagi kode panggilan sistem, saya menemukan sys_reboot
implementasi: 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 }
Di tengah, ada potongan kode khusus ini:
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;
Saya bertanya-tanya "keamanan" macam apa yang sebenarnya disediakan. Maksud saya, apakah itu untuk mencegah penyalahgunaan? Dalam hal ini, karena parameter bersifat publik, pustaka atau aplikasi apa pun dapat menyalahgunakan panggilan sistem meskipun harus melewati parameter. Apa yang saya lewatkan?
linux
reboot
system-calls
lororget
sumber
sumber
getpid
dan sejenisnya tentu saja, mereka semua dapat memiliki konsekuensi yang tidak terduga jika disalahgunakan. Atau mungkin, semua syscalls lain sudah memiliki cukup parameter untuk diperiksa agar tidak berbahaya jika salah dipanggil. Rasanya seperti ide aneh tentang "keselamatan" bagiku, ...Jawaban:
Pertanyaan ini telah dijawab dalam pertanyaan Pengguna Super ini:
Pada dasarnya, sedikit membalikkan suatu alamat dapat menyebabkan suatu program menganggap itu memanggil satu panggilan sistem ketika, pada kenyataannya, itu memanggil
reboot()
panggilan sistem. Karenareboot()
ini adalah operasi yang sangat merusak, tidak menyinkronkan yang menghapus keadaan sistem - sehingga menghapus bukti dari masalah bit-flip yang jika tidak akan diekspos sebagai kesalahan atau kepanikan program - Linux menyertakan perlindungan ekstra di sekitar keberhasilan penggunaannya .Yang cukup menarik, rangkaian angka ajaib yang kedua sesuai dengan hari ulang tahun Linus dan ketiga putrinya:
sumber