Jaki jest pożytek z „magicznych argumentów” w wywołaniu systemowym restartu systemu Linux?

10

Kiedy czytałem kod źródłowy Linuksa, a dokładniej kod wywołań systemowych, natknąłem się na sys_rebootimplementację: 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 }

Pośrodku znajduje się ten konkretny fragment kodu:

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;

Zastanawiam się, jakie to „bezpieczeństwo” faktycznie zapewnia. To znaczy, czy ma to zapobiec niewłaściwemu użyciu? W takim przypadku, ponieważ parametry są publiczne, każda biblioteka lub aplikacja może niewłaściwie używać wywołania systemowego, nawet jeśli są wymagane do przekazania parametrów. Co mnie ominęło?

lgeorget
źródło
Jest to prawdopodobnie przypadkowe połączenia, na przykład z powodu uszkodzenia pamięci lub literówki w numerze systemowym. Czy tak naprawdę warto się martwić, nie wiem.
derobert
@derobert Ma sens, ale ... czy wszystkie połączenia systemowe nie potrzebują takiej ochrony? Z wyjątkiem getpidi tym podobnych, wszystkie mogą mieć nieprzewidywalne konsekwencje, jeśli zostaną niewłaściwie wykorzystane. A może wszystkie inne wywołania systemowe mają już wystarczającą liczbę parametrów, aby je sprawdzić, aby były nieszkodliwe, jeśli zostaną źle wywołane. Wydaje mi się to jednak dziwnym pomysłem „bezpieczeństwa”…
lgeorget,
W rzeczy samej. Nie jestem pewien, czy w pewnym momencie Linus ścigał błąd, który utrzymywał # $ i #! restartuje swoją maszynę lub jeśli ktoś ją właśnie dodał, ponieważ był paranoikiem itp. To, przed czym ma chronić, jest dość jasne; dlaczego potrzebna jest ochrona przed tym, to dobre pytanie.
derobert
@derobert Możliwe, że jest to relacja kogoś, kto jest przyzwyczajony do układów scalonych, gdzie wiele układów scalonych stosuje pewien rodzaj zabezpieczenia, aby umożliwić funkcjonalność zamykania (na przykład musisz zapisać bity XYZ w specjalnym rejestrze, zanim zadziała instrukcja zamykania). Nie jestem jednak pewien, czy harmonogramy tego mają sens,
mbrig

Odpowiedzi:

10

Odpowiedzi na to pytanie udzielono na pytanie superużytkownika:

Zasadniczo odrobina odwrócenia adresu może powodować, że program myśli, że wywołuje jedno wywołanie systemowe, podczas gdy w rzeczywistości wywołuje wywołanie reboot()systemowe. Ponieważ reboot()jest to bardzo destrukcyjna, niezsynchronizowana operacja, która kasuje stan systemu - usuwając w ten sposób dowody na problem z odwracaniem bitów, który w innym przypadku zostałby ujawniony jako błąd programu lub panika - Linux zawiera dodatkowe zabezpieczenia wokół jego pomyślnego użycia .

Co ciekawe, drugi zestaw magicznych liczb odpowiada urodzeniom Linusa i jego trzech córek:

polowanie
źródło
1
Ach, nie myślałem o weryfikacji innych stron. Nigdy nie myślałem, że to pytanie może należeć inaczej niż tutaj. W każdym razie dziękuję za odpowiedź. :-)
lgeorget