Che il codice "venga eseguito come root" è per lo più irrilevante. Root o non-root è una distinzione che ha senso solo localmente su una macchina, e solo se si desidera contenere un codice potenzialmente ostile (ad esempio il codice del server dirottato) senza far cadere l'intera macchina. Questo è il modello di mainframe di alcuni decenni fa. A quel tempo, si credeva che potessi avere un sistema Unix (o simile a Unix) in modo tale che il processo non-root potesse essere tenuto separato l'uno dall'altro, senza alcuna possibilità di eludere quel contenimento e raggiungere altro processo sulla stessa macchina.
Questa convinzione difficilmente vale al giorno d'oggi. Le escalation di privilegi locali sono abbondanti; è molto difficile collegarli tutti mantenendo un ambiente completamente funzionale. In generale, è più sicuro assumere che qualsiasi codice ostile in esecuzione sulla macchina, sotto qualsiasi utente, sarà in grado di assumere il controllo dell'intero sistema, a meno che non vengano applicate alcune misure di contenimento più forti, ad esempio (in crescenti livelli di complessità e contenimento). ) chroot , jail , macchine virtuali . In ogni caso, un processo che chiama mmap () su /dev/mem
può ottenere il pieno controllo sulla macchina locale (probabilmente la macchina virtuale se si va sulla VM).
La conclusione di tutto questo è che se la tua macchina viene hackerata e far sì che la connessione a Internet aumenti sicuramente tale probabilità, allora dovresti chiederti cosa potrebbe accadere se viene sovvertito da estranei ostili. Cambiare il codice da non eseguire come root e non in mmap /dev/mem
non cambia sostanzialmente le cose qui. Ciò che importa è se il codice è stato ben progettato, revisionato, testato, documentato e mantenuto.
Devo dire che un mmap()
diretto su /dev/mem
invia un segnale strong di "a questi ragazzi non dovrebbe essere permesso di avvicinarsi a una tastiera". Non so perché lo stai facendo nel tuo server (*) ma sembra davvero strano. La mappatura della RAM fisica nello spazio degli indirizzi non è un problema di sicurezza , a meno che non ti aggrappi al modello del mainframe obsoleto; tuttavia, fare cose molto strane è un problema di sicurezza perché rende molto più difficile la progettazione, la revisione, il testing, la documentazione e la manutenzione.
(*) La mia ipotesi migliore è che il server interagisca con un hardware personalizzato che non ha uno specifico driver del kernel e fa I / O mappando i suoi circuiti nello spazio degli indirizzi fisico, come, ad esempio, un scheda grafica. Sarebbe più pulito, e quindi più sicuro, scrivere effettivamente un driver del kernel appropriato.