Kiedy czytałem kod źródłowy Linuksa, a dokładniej kod wywołań systemowych, natknąłem się na sys_reboot
implementację: 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?
linux
reboot
system-calls
lgeorget
źródło
źródło
getpid
i 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”…Odpowiedzi:
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:
źródło