Qual è l'uso di "argomenti magici" nella chiamata di sistema al riavvio di Linux?


10

Mentre stavo leggendo il codice sorgente di Linux, e più precisamente il codice delle chiamate di sistema, mi sono imbattuto sys_rebootnell'implementazione: 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 }

Nel mezzo, c'è questo specifico pezzo di codice:

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;

Mi chiedo che tipo di "sicurezza" in realtà fornisce. Voglio dire, è per prevenire l'abuso? In questo caso, poiché i parametri sono pubblici, qualsiasi libreria o applicazione potrebbe utilizzare in modo improprio la chiamata di sistema anche se sono tenuti a passare i parametri. Cosa mi sono perso?


Probabilmente si tratta di chiamate accidentali da, ad esempio, danneggiamento della memoria o errori di battitura in un numero syscall. Se è davvero qualcosa di cui preoccuparsi, non lo so.
derobert,

@derobert Ha senso ma ... tutte le chiamate di sistema non avrebbero bisogno di una protezione come questa? Fatta eccezione getpide simili ovviamente, possono avere conseguenze imprevedibili se utilizzate in modo improprio. O forse, tutti gli altri syscall hanno già abbastanza parametri per essere controllati per renderli innocui se vengono erroneamente chiamati. Mi sembra una strana idea di "sicurezza" per me ...
Lgeorget,

Infatti. Non sono sicuro che a un certo punto Linus stesse inseguendo un bug che manteneva # $ & #! riavviare la sua macchina, o se qualcuno l'ha appena aggiunta perché erano paranoici, ecc. Ciò che dovrebbe proteggere è abbastanza chiaro; perché è necessaria una protezione da ciò è una buona domanda.
derobert,

@derobert Probabilmente un blocco da parte di qualcuno abituato ai circuiti integrati, in cui molti chip implementano un tipo di protezione per abilitare la funzionalità di arresto (è necessario scrivere bit XYZ in un registro speciale prima che funzioni l'istruzione di arresto, per esempio). Non sono sicuro che le linee temporali per questo
abbiano

Risposte:


10

A questa domanda è stata data risposta in questa domanda Super User:

Fondamentalmente, un po 'capovolgere un indirizzo può indurre un programma a pensare che stia chiamando una chiamata di sistema quando, in effetti, sta chiamando la reboot()chiamata di sistema. Perché reboot()è un'operazione molto distruttiva e non sincronizzante che cancella lo stato del sistema - cancellando così l'evidenza del problema del bit-flip che verrebbe altrimenti esposto come errore di programma o panico - Linux include protezioni extra per il suo uso di successo .

È interessante notare che la seconda serie di numeri magici corrisponde ai compleanni di Linus e delle sue tre figlie:


1
Ah, non ho pensato di verificare gli altri siti. Non ho mai pensato che questa domanda potesse appartenere a questo. Comunque, grazie per la tua risposta. :-)
lgeorget,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.