Apa gunanya "argumen ajaib" dalam panggilan sistem reboot Linux?

10

Ketika saya membaca kode sumber Linux, dan lebih khusus lagi kode panggilan sistem, saya menemukan sys_rebootimplementasi: 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?

lororget
sumber
Mungkin untuk panggilan tidak disengaja dari, misalnya, memori rusak atau membuat kesalahan ketik dalam nomor syscall. Apakah itu benar-benar sesuatu yang patut dikhawatirkan, tidak tahu.
derobert
@derobert Masuk akal tapi ... bukankah semua panggilan sistem memerlukan perlindungan seperti ini? Kecuali getpiddan 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, ...
lgeorget
Memang. Saya tidak yakin apakah pada suatu saat Linus mengejar bug yang membuat # $ & #! me-reboot mesinnya, atau jika seseorang menambahkannya karena mereka paranoid, dll. Apa yang seharusnya dilindungi itu cukup jelas; mengapa perlindungan dari itu diperlukan adalah pertanyaan yang bagus.
derobert
@derobert Mungkin peninggalan dari seseorang yang digunakan untuk sirkuit terintegrasi, di mana banyak chip menerapkan semacam penjaga untuk mengaktifkan fungsi shutdown (Anda harus menulis bit XYZ ke register khusus sebelum instruksi shutdown bekerja, misalnya). Tidak yakin apakah jadwal untuk itu masuk akal,
mbrig

Jawaban:

10

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

hrunting
sumber
1
Ah, saya tidak berpikir untuk memverifikasi situs lain. Saya tidak pernah mengira pertanyaan ini bisa dimiliki selain di sini. Bagaimanapun, terima kasih atas jawaban Anda. :-)
lgeorget