Linux yeniden başlatma sistem çağrısında “sihirli argümanlar” ne kullanılır?


10

Linux kaynak kodunu ve daha özel olarak sistem kodunu okurken, sys_rebootuygulama ile karşılaştım: 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 }

Ortada, bu özel kod parçası vardır:

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;

Gerçekten ne tür bir "güvenlik" sağladığını merak ediyorum. Yani, yanlış kullanımı önlemek mi? Bu durumda, parametreler herkese açık olduğundan, herhangi bir kütüphane veya uygulama, parametreleri iletmeleri gerekse bile sistem çağrısını kötüye kullanabilir. Ne kaçırdım?


Muhtemelen, örneğin bellek bozulmasından veya sistem çağrı numarasında yazım hatası yapmaktan yanlışlıkla yapılan çağrılardır. Bunun endişelenmeye değer bir şey olup olmadığını bilmiyorum.
derobert

@derobert Mantıklı ama ... tüm sistem çağrılarının böyle bir korumaya ihtiyacı olmaz mı? getpidElbette ve benzerleri dışında , yanlış kullanıldıklarında hepsinin öngörülemeyen sonuçları olabilir. Ya da belki diğer tüm sistem çağrıları, yanlış çağrıldıklarında zararsız hale getirmek için kontrol edilecek yeterli parametreye sahiptir. Bana garip bir "güvenlik" fikri gibi geliyor ...
lgeorget

Aslında. Linus'un bir noktada # $ & # tutan bir hatayı takip edip etmediğinden emin değilim! makinesini yeniden başlatırsa ya da paranoyak oldukları için birisini eklediyse, vs. Koruyacağı şey oldukça açıktır; bundan korunmanın neden iyi bir soru olduğu.
derobert

@ derobert Muhtemelen, birçok çipin kapatma işlevini etkinleştirmek için bir tür koruma uyguladığı entegre devreler için bir engel (örneğin, kapatma talimatı çalışmadan önce XYZ bitlerini özel bir kayıt defterine yazmalısınız). Bunun için zaman çizelgelerinin anlamlı olup olmadığından emin değilim,
mbrig

Yanıtlar:


10

Bu soru şu Süper Kullanıcı sorusunda cevaplanmıştır:

Temel olarak, bir adresteki biraz çevirme, bir programın aslında sistem çağrısını çağırdığında bir sistem çağrısı çağırdığını düşünmesine neden olabilir reboot(). Çünkü reboot()böylece aksi bir program hatası olarak maruz veya panik olurdu bit çevirme sorunun kanıt silme - - Linux başarılı kullanımı etrafında ekstra korumaları içerir sisteminin durumunu siler çok yıkıcı olmayan senkronizasyon operasyondur .

İlginçtir, ikinci sihirli sayılar seti Linus ve üç kızının doğum günlerine karşılık gelir:


1
Ah, diğer siteleri doğrulamayı düşünmedim. Bu sorunun buradakinden farklı olabileceğini hiç düşünmemiştim. Her neyse, cevabınız için teşekkür ederim. :-)
lgeorget
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.