Que el código "se ejecuta como root" es en su mayoría irrelevante. Raíz o no raíz es una distinción que tiene sentido solo localmente para una máquina, y solo si desea contener algún código potencialmente hostil (por ejemplo, un código de servidor pirateado) sin desactivar toda la máquina. Este es el modelo de mainframe de hace unas décadas. En ese momento, se creía que usted podría tener un sistema Unix (o similar a Unix) de tal manera que el proceso no root pudiera mantenerse separado el uno del otro, sin ninguna posibilidad de evadir esa contención y alcance. otro proceso en la misma máquina.
Esta creencia casi no se sostiene hoy en día. Las escaladas de privilegios locales son abundantes; es muy difícil conectarlos todos a la vez que se mantiene un entorno completamente funcional. En general, es más seguro asumir que cualquier código hostil que se ejecute en la máquina, bajo cualquier usuario, podrá tomar el control de todo el sistema, a menos que se apliquen medidas de contención más fuertes, como (en niveles crecientes de complejidad y contención). ) chroot , jail , máquinas virtuales . En cualquier caso, un proceso que llame a mmap () en /dev/mem
puede obtener el control total en la máquina local (posiblemente la máquina virtual si va por el camino de la máquina virtual).
La conclusión de todo esto es que si tu máquina es pirateada, y hacer que esté orientada a Internet aumenta esa probabilidad, entonces deberías preguntarte qué podría suceder si los forasteros hostiles la subvierten. Cambiar el código para no ejecutarse como root y no para mmap /dev/mem
no cambia sustancialmente las cosas aquí. Lo que importa es si el código ha sido bien diseñado, revisado, probado, documentado y mantenido.
Debo decir que un mmap()
directo en /dev/mem
envía una fuerte señal de que "a estos tipos no se les debe permitir acercarse a un teclado". No sé por qué lo haces en tu servidor (*) pero parece realmente extraño. La asignación de RAM física en su espacio de direcciones no es un problema de seguridad , a menos que se aferre al modelo de mainframe obsoleto; sin embargo, hacer cosas muy extrañas es un problema de seguridad porque hace que el diseño, la revisión, las pruebas, la documentación y el mantenimiento sean mucho más difíciles.
(*) Mi mejor conjetura es que su servidor interactúa con una pieza de hardware personalizada que carece de un controlador de kernel específico, y hace E / S al mapear sus circuitos en el espacio de direcciones físicas, como, por ejemplo, un tarjeta grafica. Sería más limpio, y por lo tanto más seguro, escribir un controlador de kernel apropiado.