- Aprender
- Informática
- Ciencias de la computación
- Sistemas operativos
- Protección del sistema operativo
Protección del sistema operativo y máquinas virtuales
IntermedioUnidad 9 de 9 del curso Curso de Sistemas operativos
Lo que aprenderás
- Describe los modos del procesador, los puntos de entrada controlados y las protecciones de memoria que impiden que los programas dañen a otros o al núcleo, así como los mecanismos que dificultan los ataques contra ellos.
- Separa el modo usuario del modo núcleoExplica los niveles de privilegio y las instrucciones privilegiadas, y qué ocurre cuando un programa intenta hacer algo que solo puede hacer el núcleo.
- Accede al núcleo de forma segura mediante llamadas al sistemaSigue una llamada al sistema desde la trampa hasta la comprobación de permisos y explica por qué el núcleo debe desconfiar de todos los argumentos que recibe.
- Protege la memoria y los dispositivosUsa los permisos de las tablas de páginas, los mapeos exclusivos del núcleo y la IOMMU para explicar cómo el núcleo mantiene a cada proceso dentro de su propia memoria.
- Dificulta los ataques contra los programas y el núcleoExplica cómo la memoria no ejecutable, la aleatorización de direcciones, los filtros de llamadas al sistema, el arranque seguro y los registros de auditoría elevan el coste de los exploits y dejan constancia de ellos.
- Separa el modo usuario del modo núcleo
- Explica cómo un sistema operativo comprueba quién es un usuario, almacena las contraseñas de forma segura, usa otros factores de autenticación y transmite la identidad resultante a cada proceso.
- Asocia identidades a los procesosSigue un inicio de sesión desde la solicitud de contraseña hasta un intérprete de comandos en ejecución y explica los identificadores de usuario, los grupos, la herencia y los programas que cambian de privilegios, como los programas setuid y sudo.
- Almacena y verifica contraseñas de forma seguraExplica los hashes, las sales y las funciones lentas de cálculo de hashes de contraseñas, y calcula cómo modifican el coste de los ataques de adivinación.
- Autentícate con lo que tienes y lo que eresCompara contraseñas, tokens y biometría, combínalos en la autenticación multifactor y autentica servicios y máquinas que no tienen a una persona frente al teclado.
- Asocia identidades a los procesos
- Representa los derechos como una matriz de acceso, impleméntalos con listas de control de acceso o capacidades, interpreta y configura los permisos de Unix y Windows, y compara los modelos discrecional, obligatorio y basado en roles.
- Compara las listas de control de acceso y las capacidadesAlmacena los mismos derechos por objeto o por sujeto, y valora ambos enfoques para comprobar, revisar, delegar y revocar el acceso.
- Interpreta y configura los permisos de Unix y WindowsInterpreta los bits de permisos y los modos octales, aplica las reglas de comprobación de Unix a archivos y directorios, e interpreta las ACL POSIX y las entradas de control de acceso de Windows.
- Compara el control de acceso discrecional, obligatorio y basado en rolesDistingue los modelos en los que deciden los propietarios de aquellos en los que decide una política para todo el sistema, y usa roles para gestionar los derechos de muchos usuarios.
- Compara las listas de control de acceso y las capacidades
- Explica cómo un hipervisor comparte el procesador, la memoria y los dispositivos de un equipo entre varios sistemas operativos completos mientras los mantiene aislados.
- Describe las máquinas virtuales y los hipervisoresDefine las máquinas virtuales y los hipervisores, distingue los diseños de tipo 1 y tipo 2, y explica para qué se usa la virtualización y cuáles son los límites de su aislamiento.
- Virtualiza el procesadorExplica la intercepción y emulación, por qué x86 clásico no podía usarla directamente y cómo la traducción binaria, la paravirtualización y el soporte de hardware resolvieron el problema.
- Virtualiza la memoriaTraduce una dirección virtual del invitado a una dirección real de la máquina y compara las tablas de páginas sombra con la paginación anidada por hardware.
- Virtualiza dispositivos y mantén aisladas las máquinas virtualesCompara los dispositivos emulados, paravirtuales y asignados directamente, y explica las ventajas y los límites del aislamiento entre máquinas virtuales.
- Describe las máquinas virtuales y los hipervisores
- Construye un contenedor a partir de funciones del núcleo (espacios de nombres para lo que un proceso puede ver, grupos de control para lo que puede usar y límites de privilegios para lo que puede hacer) y decide cuándo usar un contenedor o una máquina virtual.
- Limita lo que ve un proceso mediante espacios de nombresExplica los tipos de espacios de nombres de Linux, crea espacios de nombres y únete a ellos, e interpreta los espacios de nombres de PID, montajes, red y usuarios.
- Limita los recursos que utiliza un proceso mediante grupos de controlOrganiza procesos en grupos de control y establece límites de CPU, memoria, número de procesos y entrada/salida, e interpreta los valores de esos límites.
- Aplica restricciones a los contenedores y elige entre contenedores y máquinas virtualesReduce lo que puede hacer un proceso en un contenedor, explica el riesgo de un núcleo compartido y elige contenedores, máquinas virtuales o ambos para una carga de trabajo determinada.
- Limita lo que ve un proceso mediante espacios de nombres
Guía de estudio de Protección del sistema operativo
1Explica cómo el hardware y el núcleo protegen el sistema
Los programas funcionan con rapidez porque las instrucciones ordinarias se ejecutan directamente en el procesador. Los permisos del hardware y los puntos de entrada controlados al núcleo hacen que esa libertad sea lo bastante segura para compartir una máquina. Sigue el límite desde los privilegios de la CPU, pasando por las comprobaciones de las llamadas al sistema, hasta el acceso a la memoria y los dispositivos; después, descubre cómo las restricciones de ejecución, la aleatorización, la verificación del arranque y los registros limitan los ataques contra los programas y el núcleo.
1.1 Separa el modo usuario del modo núcleo
Un programa necesita suficiente libertad para calcular rápidamente sin obtener el control de todo el equipo. El modo usuario le permite ejecutar instrucciones ordinarias directamente. El modo núcleo, también llamado modo supervisor, da al sistema operativo acceso a las instrucciones que controlan la máquina.
Deja que el hardware haga cumplir los privilegios
La CPU tiene un nivel de privilegio en cada momento. Las sumas, lecturas, escrituras y saltos normalmente se ejecutan a máxima velocidad, sujetos a los permisos de memoria. El núcleo no inspecciona cada instrucción mediante software. Esto es la ejecución directa limitada: ejecutar directamente hasta que una operación protegida o una interrupción requiera al núcleo.
Una instrucción privilegiada provoca una trampa si el código de usuario intenta ejecutarla. En x86-64, HLT, la escritura en el registro base de la tabla de páginas CR3 y la instalación de una tabla de interrupciones con LIDT necesitan privilegios del núcleo. De lo contrario, una aplicación podría detener la CPU, sustituir sus propios límites de memoria o redirigir la gestión de interrupciones.
Supón que una aplicación ejecuta HLT. La CPU genera un fallo de protección general en lugar de detenerse. Entra en el manejador registrado por el núcleo. Linux normalmente envía SIGSEGV al proceso y lo termina mientras los demás programas continúan. La aplicación no puede elegir una dirección conveniente dentro del núcleo y comenzar a ejecutarse allí.
Cruza el límite por una entrada controlada
Las trampas, excepciones e interrupciones entran por direcciones registradas por el núcleo. El hardware cambia el nivel de privilegio y transfiere el control al manejador; el código de entrada al núcleo conserva el estado necesario para regresar. Una instrucción especial de retorno restaura la ejecución en modo usuario en el contador de programa guardado. En x86-64, el retorno puede usar SYSRET o IRETQ.
El temporizador hace que este control sea útil incluso cuando un programa nunca solicita un servicio. Antes de ejecutarlo, el núcleo programa un temporizador. Cuando llega la interrupción, el planificador puede seleccionar otro proceso. El código de usuario no puede desactivar las interrupciones ni reprogramar ese temporizador, por lo que un bucle infinito no puede quedarse con un núcleo para siempre.
Interpreta correctamente los diagramas de privilegios
| Arquitectura | Aplicación | Núcleo | Otros niveles |
|---|---|---|---|
| x86 | Anillo 3 | Anillo 0 | Existen los anillos 1 y 2, pero los núcleos ordinarios de Linux y Windows no los usan |
| ARMv8-A | EL0 | EL1 | EL2 da soporte a un hipervisor; EL3 da soporte al monitor de firmware seguro |
| RISC-V | Modo U | Modo S | El modo M tiene privilegios de máquina |
Las convenciones de numeración son diferentes: un número de anillo x86 menor significa más privilegios, mientras que un nivel de excepción ARM mayor significa más privilegios. La virtualización de Intel también añade los modos de funcionamiento VMX raíz y no raíz; estos son independientes del número de anillo.
Separa la identidad del modo de la CPU
Root es una identidad de usuario, UID 0, que reconoce el software del núcleo. El código ordinario de una aplicación root sigue ejecutándose en modo usuario y entra en el núcleo mediante llamadas al sistema. Un controlador de dispositivo que se ejecuta en modo núcleo tiene mucho más poder directo: un error de memoria allí puede dañar el estado del núcleo sin pasar por una comprobación de permisos de archivo.
La capa que hace cumplir un límite debe controlar la capa que está dentro de él. El núcleo hace cumplir los límites entre procesos mediante los modos de CPU y las tablas de memoria. Un hipervisor controla de forma similar los sistemas operativos invitados mediante el soporte de virtualización del hardware.
Puntos clave
- Las instrucciones de usuario se ejecutan directamente hasta que el hardware requiere una entrada al núcleo.
- Las operaciones privilegiadas protegen las tablas de páginas, las interrupciones, los temporizadores y el control de dispositivos.
- El temporizador permite al planificador recuperar un núcleo ocupado por un bucle infinito.
- La identidad root no sitúa una aplicación en modo núcleo.
- La numeración de los privilegios depende de la arquitectura.
1.2 Accede al núcleo de forma segura mediante llamadas al sistema
Una llamada al sistema es una solicitud controlada de un servicio del núcleo. Abrir archivos, crear procesos y enviar datos por la red requieren decisiones que una aplicación no puede tomar por sí misma de forma segura. Entrar en el núcleo da autoridad al manejador; no da a quien hace la llamada permiso para hacer todo lo que solicitó.
Sigue la solicitud
Una función envoltorio de la biblioteca C como open() coloca el número de llamada y los argumentos en registros. Usa SYSCALL en x86-64, SVC en ARM64 o ECALL en RISC-V. Después, el núcleo:
- Entra por su punto de entrada registrado y guarda los registros de usuario.
- Selecciona el manejador de la tabla de llamadas al sistema y rechaza los números desconocidos.
- Lee la identidad y las credenciales de quien hace la llamada a partir del proceso actual.
- Comprueba los argumentos, los derechos de acceso y los objetos implicados.
- Realiza la operación o devuelve un error.
- Restaura el estado guardado y vuelve al modo usuario.
La identidad procede de las credenciales del proceso, no de un nombre proporcionado por el usuario. Quien hace una llamada no puede obtener los derechos de otro usuario añadiendo su nombre a una solicitud.
Trata los argumentos como datos no confiables
Un puntero es solo un número proporcionado por quien hace la llamada. El núcleo debe verificar todo el rango de memoria de usuario solicitado, incluidas su longitud y la dirección del acceso. Linux usa rutinas que realizan comprobaciones, como copy_from_user y copy_to_user, para cruzar el límite de forma segura.
Para read(fd, buf, 4096), un buf que apunta a la memoria del núcleo no debe convertirse en destino de los datos del archivo. Linux devuelve EFAULT para ese búfer de usuario incorrecto. Un error diferente tiene una causa diferente: write() mediante un descriptor abierto con O_RDONLY falla con EBADF, porque al descriptor nunca se le concedió acceso de escritura. Una solicitud ordinaria denegada devuelve un error; no termina automáticamente el proceso. En C, la función envoltorio suele devolver −1 y establecer errno.
Comprueba el objeto que realmente se usa
Una condición de carrera entre comprobación y uso (TOCTTOU) separa una decisión del objeto que debía proteger. Un programa auxiliar privilegiado comprueba access("/tmp/report", W_OK) y después abre la ruta. Un atacante sustituye la ruta por un enlace simbólico a /etc/passwd entre esas operaciones. El nombre no cambia, pero el objeto abierto es distinto.
La solución consiste en realizar el acceso con las credenciales previstas sobre el objeto que realmente se abre. Reduce los privilegios antes de abrir y usa opciones como O_NOFOLLOW cuando no se quieran enlaces simbólicos. Copiar los argumentos una sola vez en la memoria del núcleo también evita confiar repetidamente en datos de usuario modificables; la estructura copiada debe seguir validándose.
Identifica en qué se debe confiar
Un monitor de referencia media en el acceso. Debe invocarse siempre que se obtiene acceso, estar protegido contra modificaciones y ser lo bastante pequeño para examinarlo con cuidado. Después de que el núcleo conceda un mapeo de memoria, las lecturas y escrituras individuales pasan por las comprobaciones de permisos de la MMU; no realizan cada una una llamada al sistema.
La base de computación de confianza (TCB) es el hardware, el firmware y el software privilegiado de cuyo funcionamiento correcto depende la protección. Incluye la CPU, la cadena de arranque, el núcleo y los componentes de confianza del inicio de sesión. Trasladar controladores o sistemas de archivos a servidores en modo usuario puede reducir la parte del núcleo de esta base, como hacen los diseños de micronúcleo. Una aplicación ordinaria comprometida hace un uso indebido de los derechos que se le concedieron; un componente de confianza comprometido puede socavar las propias comprobaciones.
Puntos clave
- La entrada al núcleo y el permiso para realizar una operación son cuestiones separadas.
- Valida los rangos de los punteros y los derechos de acceso antes de usar argumentos de usuario.
- Una condición de carrera TOCTTOU puede hacer que un nombre comprobado se refiera a otro objeto.
- Un monitor de referencia debe resistir los intentos de eludirlo o modificarlo.
- La TCB incluye más que el núcleo.
- Una llamada al sistema rechazada suele devolver un error que el programa puede gestionar.
1.3 Protege la memoria y los dispositivos
La memoria virtual protege los programas además de traducir direcciones. Un proceso puede alcanzar los marcos físicos indicados por su tabla de páginas activa, con los permisos establecidos por el núcleo. Los marcos privados de otro proceso no aparecen en ella; los mapeos deliberados de memoria compartida son una excepción explícita.
Comprueba cada acceso a memoria
La unidad de gestión de memoria (MMU) comprueba las entradas de la tabla de páginas en los accesos. Los permisos importantes incluyen presencia o validez, escritura, accesibilidad desde el modo usuario y ejecución. En x86, U/S distingue las páginas accesibles desde el modo usuario de las exclusivas del supervisor; NX o XD desactiva la ejecución. ARM llama XN a su restricción de ejecución.
Una infracción provoca un fallo de página. El fallo indica que ha fallado una comprobación de hardware; el núcleo decide si ese fallo es esperado y reparable. Considera dos escrituras en páginas de solo lectura:
- Un proceso sobrescribe una página de código que no es de copia en escritura. El núcleo lo trata como una escritura no válida y normalmente envía
SIGSEGV. - Después de
fork(), un proceso escribe datos compartidos marcados como de copia en escritura. El núcleo asigna una copia privada, cambia el mapeo para permitir la escritura y vuelve a intentar la instrucción.
Ambos fallos parten de un bit de protección. Los registros del núcleo explican por qué los mapeos eran de solo lectura y determinan la respuesta. Por tanto, un fallo de página no supone automáticamente un fallo del programa ni una solicitud para traer datos del disco.
Protege los mapeos del núcleo en ambas direcciones
Las organizaciones tradicionales mapean la memoria del núcleo en los espacios de direcciones de los procesos como exclusiva del supervisor, lo que facilita la entrada al núcleo y bloquea las lecturas y escrituras en modo usuario. El ataque Meltdown de 2018 mostró que algunos procesadores podían filtrar esos datos mediante la ejecución especulativa. El aislamiento de las tablas de páginas del núcleo (KPTI) elimina la mayoría de los mapeos del núcleo mientras se ejecuta código de usuario en los sistemas afectados.
El código del núcleo también necesita protección para evitar que se lo redirija a memoria controlada por el usuario. SMEP en x86 impide la ejecución en modo núcleo desde páginas de usuario. SMAP bloquea los accesos a datos en páginas de usuario desde el modo núcleo, salvo durante operaciones de copia autorizadas deliberadamente. ARM proporciona protecciones relacionadas mediante PXN y PAN. Estas comprobaciones reducen las formas en que un atacante puede usar un error del núcleo para ejecutar código o proporcionar datos falsos al núcleo.
El acceso de solo lectura protege la integridad, no el secreto. Si un proceso puede leer una página mapeada, puede conocer su contenido aunque las escrituras fallen. Los datos confidenciales deben ser inaccesibles para ese proceso: déjalos sin mapear o aplica un límite adecuado de acceso exclusivo del supervisor.
Da a los dispositivos su propio límite
Las aplicaciones suelen solicitar operaciones a los dispositivos mediante un controlador. Los registros de los dispositivos normalmente son exclusivos del núcleo, aunque un proceso autorizado puede recibir determinados mapeos, como ocurre con los controladores gráficos o la entrada/salida en espacio de usuario de Linux.
Un dispositivo que realiza acceso directo a memoria (DMA) lee o escribe en la RAM sin enviar esos accesos a través de la MMU de la CPU. Los permisos de página de la CPU por sí solos no pueden impedir que un dispositivo defectuoso sobrescriba los marcos de otro proceso. Una IOMMU traduce y restringe las direcciones de los dispositivos mediante mapeos específicos para cada uno. Intel VT-d y AMD-Vi proporcionan este mecanismo.
Para un dispositivo asignado a una VM, la IOMMU restringe el DMA a la memoria asignada a esa VM. Por el lado de la CPU se necesita un límite paralelo: una segunda etapa de traducción de páginas mapea las direcciones físicas del invitado solo a los marcos permitidos por el hipervisor. Para proteger una carga de trabajo hay que cubrir tanto los accesos de la CPU como los de los dispositivos.
Puntos clave
- La MMU hace cumplir los mapeos y los bits de permisos que instala el núcleo.
- Un fallo de página puede provocar una recuperación, una copia en escritura o una señal que termina el proceso.
- El acceso de solo lectura no hace que los datos sean confidenciales.
- KPTI elimina la mayoría de los mapeos del núcleo durante la ejecución en modo usuario.
- SMEP y SMAP restringen el uso que hace el núcleo de las páginas de usuario.
- La IOMMU limita el DMA que pasa por fuera de la MMU de la CPU.
1.4 Dificulta los ataques contra los programas y el núcleo
Un error de seguridad de memoria puede convertirse en un ataque cuando los datos corruptos cambian el flujo de control del programa. Un desbordamiento de búfer en la pila, por ejemplo, puede sobrescribir una dirección de retorno guardada. Las defensas del sistema operativo restringen lo que un atacante puede hacer con ese error; no reparan la escritura defectuosa.
Separa los datos del código ejecutable
El bit NX marca las páginas de datos como no ejecutables. Windows llama a esto prevención de ejecución de datos (DEP). Inyectar instrucciones en un búfer de la pila resulta menos útil cuando saltar a él provoca un fallo.
W^X, escritura o ejecución excluyentes, es más estricta: ninguna página permite la escritura y la ejecución al mismo tiempo. DEP por sí sola no prohíbe que un programa solicite explícitamente ese tipo de mapeo. Con W^X, un compilador en tiempo de ejecución escribe el código generado en memoria que permite escritura y después cambia sus permisos antes de ejecutarlo.
Un atacante puede reutilizar instrucciones ejecutables existentes. La programación orientada a retornos (ROP) encadena secuencias cortas de instrucciones llamadas gadgets. La aleatorización de la distribución del espacio de direcciones (ASLR) cambia las ubicaciones de las pilas, los montículos, las bibliotecas y los programas independientes de la posición, lo que dificulta predecir las direcciones de los gadgets.
Con una base de biblioteca elegida de manera uniforme entre posiciones, una suposición a ciegas tiene una probabilidad de éxito de 1 entre 268 435 456. Con solo posiciones y una distribución que se conserva tras los fallos de los procesos trabajadores, probar posiciones distintas requiere como máximo 256 intentos y 128,5 de media. Una dirección filtrada dentro de una biblioteca conocida revela su base y los desplazamientos de los gadgets de esa biblioteca. Una pila aleatorizada por separado puede seguir siendo desconocida.
Reduce los servicios que puede solicitar un atacante
Los filtros seccomp de Linux restringen las llamadas al sistema que puede realizar un proceso. Por ejemplo, se pueden denegar a un proceso de renderizado del navegador las llamadas para iniciar programas o abrir archivos directamente. Los procesos hijos heredan los filtros y estos no pueden eliminarse; los filtros posteriores pueden reforzar las restricciones. Un proceso de renderizado comprometido sigue teniendo sus operaciones permitidas, por lo que un filtro establece un límite para los servicios, no demuestra que el programa carezca de errores. pledge de OpenBSD y App Sandbox de macOS proporcionan restricciones relacionadas.
Comprueba el arranque y conserva las pruebas
El arranque seguro comprueba las firmas a lo largo de la cadena de arranque. El firmware comprueba un cargador de arranque de confianza; el cargador comprueba el núcleo; el núcleo puede exigir módulos firmados. Se rechaza un componente modificado que no tenga una firma de confianza. Esto ayuda a detener cambios persistentes en el software de arranque, pero una firma válida no demuestra que el software carezca de vulnerabilidades.
El arranque medido registra hashes de los componentes cargados, normalmente mediante un módulo de plataforma de confianza (TPM). Estas mediciones permiten la atestación: otra parte puede comparar lo que se inició con un estado esperado. Medir y negarse a iniciar son operaciones distintas.
El registro de auditoría recoge inicios de sesión, fallos de autenticación, denegaciones de permisos, cambios de cuentas y acciones privilegiadas como sudo. Los registros ayudan a detectar y reconstruir ataques. Un atacante que controla un anfitrión puede borrar los registros locales, por lo que el registro protegido o remoto conserva pruebas fuera de ese anfitrión.
Los atacantes pueden combinar una filtración de direcciones, un error de corrupción de memoria y un escape del entorno aislado. Las actualizaciones eliminan las vulnerabilidades subyacentes que estas defensas dejan presentes.
Puntos clave
- NX bloquea la ejecución desde las páginas de datos marcadas; W^X también prohíbe los permisos simultáneos de escritura y ejecución.
- ASLR dificulta predecir las direcciones para reutilizar código.
- La filtración de una dirección de biblioteca no tiene por qué revelar regiones aleatorizadas por separado.
- Los filtros de llamadas al sistema restringen los servicios disponibles para un proceso comprometido.
- El arranque seguro verifica la confianza en los componentes de inicio; el arranque medido registra lo que se cargó.
- Los registros de auditoría ayudan a detectar y reconstruir ataques, así que protégelos contra el borrado.
2Autentica a los usuarios y asigna una identidad a los procesos
Un nombre de usuario solo resulta útil al núcleo cuando está vinculado a credenciales de proceso confiables. Sigue un inicio de sesión hasta llegar a un intérprete de comandos en ejecución, incluida la gestión cuidadosa de los programas auxiliares con privilegios elevados. Después, examina cómo los hashes de contraseñas con sal dificultan los ataques contra verificadores robados y cómo las claves, los códigos basados en el tiempo y la biometría cambian la prueba de identidad antes de que comiencen las comprobaciones normales de permisos.
2.1 Asocia identidades a los procesos
Un inicio de sesión correcto conecta una identidad humana con credenciales de proceso mantenidas por el núcleo. La autenticación comprueba la identidad declarada; la autorización decide qué puede hacer esa identidad. Una entidad de seguridad puede ser una persona o una cuenta de servicio, y los procesos actúan en su nombre.
Lleva la identidad a los programas en ejecución
Los sistemas de tipo Unix identifican a los usuarios mediante UID numéricos y a los grupos mediante GID. /etc/passwd relaciona los nombres con los UID, los directorios personales y los intérpretes de comandos. Las comparaciones del núcleo usan los números: dos nombres de cuenta con un mismo UID son una sola identidad para las comprobaciones de acceso. El UID 0 es root y elude la mayoría de las comprobaciones ordinarias de permisos.
Windows usa identificadores de seguridad (SID) para usuarios y grupos. El token de acceso de un proceso registra su SID de usuario, los SID de grupo y los privilegios. En ambas plataformas, las credenciales del programa en ejecución proporcionan la identidad para las decisiones posteriores.
Un inicio de sesión típico con contraseña en Linux sigue esta secuencia:
- Un servicio de inicio de sesión privilegiado, como
login,sshdo un gestor de inicio de sesión gráfico, recibe las credenciales. - PAM, módulos de autenticación conectables, las comprueba mediante los módulos de autenticación configurados.
- El servicio establece los grupos suplementarios y el GID del usuario y después cambia el UID para renunciar a root.
- Inicia el intérprete de comandos. Los procesos hijos heredan estas credenciales mediante
fork()y normalmente las conservan trasexecve().
El orden importa. Renunciar a root antes de establecer los grupos puede hacer que el proceso no pueda sustituir su lista heredada de grupos privilegiados. Además, modificar la pertenencia a grupos de una cuenta no cambia las credenciales de los procesos que ya están en ejecución; una nueva sesión recibe la lista nueva.
Comprende un cambio controlado de privilegios
Un proceso tiene un UID real, que normalmente identifica quién lo inició; un UID efectivo, usado para la mayoría de las comprobaciones de acceso; y un UID guardado, que permite recuperar el anterior de forma controlada después de una reducción temporal. En los programas ordinarios los tres son iguales.
/usr/bin/passwd, propiedad de root, ilustra setuid. Su modo 4755, mostrado como -rwsr-xr-x, hace que el UID efectivo sea root cuando lo ejecuta un usuario ordinario. Si alice tiene el UID 1000, su UID real sigue siendo 1000 mientras el UID efectivo pasa a ser 0. El programa puede actualizar /etc/shadow y usa la identidad real de quien hace la llamada para limitar la contraseña que puede cambiar. Un ejecutable setgid cambia de forma similar el grupo efectivo.
Ese pequeño programa de confianza tiene una autoridad peligrosa. Un error puede exponer los derechos de root, por lo que los sistemas reducen al mínimo los programas setuid y rebajan pronto los privilegios. Para un servicio que solo necesita un puerto de número bajo, CAP_NET_BIND_SERVICE concede un privilegio de Linux más limitado que los derechos completos de root.
Administra sin compartir una identidad
sudo autentica al usuario que lo invoca, comprueba qué comandos puede ejecutar ese usuario y con qué identidad de destino, y registra su uso. Su política suele estar en /etc/sudoers. Las identidades individuales permiten atribuir responsabilidades, algo que se pierde al compartir una contraseña de root. En Windows, UAC normalmente inicia los programas de un administrador con un token filtrado y solicita consentimiento para elevar los privilegios.
Las aplicaciones de uso diario deben ejecutarse con derechos ordinarios, y los servicios deben tener cuentas específicas como www-data. Así, un visor de documentos comprometido hereda esas credenciales limitadas en lugar de la autoridad completa de un administrador.
Puntos clave
- La autenticación establece la identidad; la autorización comprueba los derechos.
- Unix comprueba UID y GID numéricos; Windows usa SID y tokens.
- Establece los grupos antes de renunciar definitivamente al privilegio de cambiarlos.
- El UID efectivo se usa en la mayoría de las comprobaciones de acceso de Unix.
- Los programas auxiliares setuid necesitan comprobaciones cuidadosas porque tienen autoridad elevada.
- Los procesos existentes conservan su antigua lista de grupos después de modificar una cuenta.
2.2 Almacena y verifica contraseñas de forma segura
Un verificador de contraseñas necesita reconocer una contraseña correcta sin almacenar una copia recuperable. Almacena un hash de contraseña con la información necesaria para repetir la comprobación. El inicio de sesión vuelve a calcular el hash a partir de la contraseña introducida y compara los resultados; nunca descifra el hash almacenado.
Protege el verificador almacenado
En Linux, /etc/shadow contiene hashes de contraseñas protegidos. /etc/passwd, legible por muchos usuarios, contiene información de las cuentas y una x en lugar de la contraseña. Un campo de contraseña de shadow registra un identificador de algoritmo, parámetros de coste, una sal y el hash resultante. $y$ identifica yescrypt, usado de forma predeterminada en Debian 11, Ubuntu 22.04, Fedora 35 y versiones posteriores; $6$ identifica SHA-512-crypt.
Un archivo de hashes robado permite un ataque sin conexión. El atacante calcula hashes de contraseñas candidatas en otro hardware sin las demoras del servicio de inicio de sesión. Un ataque de fuerza bruta enumera cadenas; un ataque de diccionario comienza con palabras probables, contraseñas filtradas y variantes como «Password1!».
Para exactamente ocho letras minúsculas, son posibles cadenas. A intentos por segundo, agotar el espacio tarda unos 21 segundos. A intentos por segundo, tarda unos segundos, aproximadamente 242 días. Estos son tiempos de búsqueda completa, no garantías para una contraseña concreta. Doce letras minúsculas dan unos cadenas, aproximadamente 110 días incluso a la velocidad mayor.
Haz que atacar cada cuenta sea costoso
Una sal criptográfica es un valor aleatorio nuevo almacenado junto a cada hash de contraseña. Hace que contraseñas iguales produzcan hashes distintos e inutiliza las tablas precalculadas reutilizables. La sal es pública; su función es obligar a realizar un trabajo separado para cada cuenta.
Considera 1000 cuentas y una lista de contraseñas candidatas, comprobadas a hashes por segundo. Sin sales, calcular la lista una vez tarda 100 segundos y sirve para todas las cuentas. Las sales únicas requieren cálculos, unos segundos o 27,8 horas. Una contraseña común aún puede encontrarse cerca del principio de la lista.
Los esquemas de cálculo de hashes de contraseñas como bcrypt, scrypt, yescrypt, Argon2 y PBKDF2 tienen costes de trabajo ajustables. Scrypt, yescrypt y Argon2 también imponen costes de memoria. Un inicio de sesión práctico puede tolerar una fracción de segundo; una campaña de adivinación a gran escala repite ese gasto millones de veces. Un único cálculo rápido de SHA-256 carece de este coste deliberado.
Diseña la política de inicio de sesión en función de los intentos de adivinación
NIST SP 800-63B-4 (2025) exige sales de al menos 32 bits y un coste de cálculo de hashes de contraseñas tan alto como resulte práctico. Su guía sobre contraseñas exige al menos 15 caracteres para la autenticación solo con contraseña, o al menos ocho cuando la contraseña forma parte de MFA, y recomienda aceptar al menos 64 caracteres.
Rechaza las combinaciones obligatorias, como un dígito y un símbolo, y los cambios periódicos obligatorios de contraseña. Exige bloquear opciones comunes o comprometidas, limitar los intentos de adivinación en línea y obligar a cambiar la contraseña cuando haya indicios claros de compromiso. Los límites de frecuencia en línea protegen el servicio activo; el cálculo lento de hashes con sal protege los verificadores robados. Una contraseña más larga elegida de forma predecible de una lista común aún puede ser débil.
Puntos clave
- El inicio de sesión vuelve a calcular un hash de contraseña; no descifra una contraseña.
- Los intentos sin conexión eluden los límites de frecuencia del servicio de inicio de sesión activo.
- Una sal pública única impide reutilizar el trabajo de cálculo de hashes entre cuentas.
- Un coste de trabajo ajustable hace que cada intento sea costoso.
- La longitud de la contraseña y las listas de bloqueo ayudan más que las reglas de composición predecibles.
2.3 Autentícate con lo que tienes y lo que eres
Las contraseñas demuestran conocimiento. Otros autenticadores demuestran la posesión de un objeto o un rasgo físico. El sistema operativo acaba asociando la identidad autenticada a los procesos, pero la vía para obtener esa identidad influye en la facilidad con que un atacante puede suplantar al usuario.
Combina distintos tipos de factores
Los tres tipos de factores son algo que sabes, como una contraseña o un PIN; algo que tienes, como un teléfono, una tarjeta inteligente o una llave de seguridad; y algo que eres, como una huella dactilar. La autenticación multifactor (MFA) combina distintos tipos. Una contraseña más una pregunta de seguridad repite el factor de conocimiento.
Las contraseñas de un solo uso basadas en el tiempo (TOTP) usan un secreto compartido y un intervalo de tiempo, normalmente de 30 segundos, para producir códigos coincidentes en un autenticador y un servidor. RFC 6238 define el método. Un código caduca rápidamente, pero una página de inicio de sesión falsa puede retransmitir un código reciente antes de que caduque. Los códigos de aplicaciones evitan el intercambio de SIM; los códigos SMS dependen del control del número de teléfono y pueden redirigirse si alguien toma el control de él.
Demuestra la posesión sin enviar la clave
Un autenticador de clave pública firma un desafío nuevo con una clave privada. El servidor lo verifica con una clave pública almacenada, que por sí misma no puede reutilizarse para firmar un inicio de sesión. Las llaves de seguridad FIDO2 y las claves de acceso también vinculan la autenticación a la identidad del sitio, por lo que una respuesta para un sitio falso no puede autenticar en el real. Una clave SSH ordinaria también demuestra posesión, pero no debe suponerse que tenga el mismo mecanismo de vinculación al sitio web.
El almacenamiento cambia el riesgo. Las claves vinculadas a un dispositivo en una llave de seguridad física, un TPM o un enclave seguro firman dentro del hardware sin exponer la clave privada. Las claves de acceso sincronizadas copian material de claves cifrado entre dispositivos mediante una cuenta de plataforma, lo que facilita la recuperación, pero incorpora esa cuenta al límite de confianza. Una clave privada SSH ordinaria es un archivo protegido por permisos y, opcionalmente, por una frase de contraseña.
Interpreta los errores biométricos
Un sistema biométrico compara las características medidas con una plantilla almacenada. Acepta cuando una puntuación de similitud alcanza un umbral; no exige una imagen idéntica cada vez.
| Tasa | Población usada como denominador | Error contabilizado |
|---|---|---|
| Tasa de falsas aceptaciones (FAR) | Intentos de impostores | Impostores aceptados |
| Tasa de falsos rechazos (FRR) | Intentos legítimos | Usuarios legítimos rechazados |
Dos impostores aceptados de 10 000 dan una FAR del 0,02 %. Treinta rechazos de 1000 intentos legítimos dan una FRR del 3 %. Elevar el umbral de similitud reduce la FAR y aumenta la FRR. Una coincidencia más exigente reduce las suplantaciones exitosas, pero hace más frecuentes los nuevos intentos legítimos.
Un rasgo biométrico filtrado no puede cambiarse como una contraseña, y los sensores necesitan defensas frente a fotos o huellas copiadas. Un diseño útil usa la biometría localmente para desbloquear una clave protegida y envía solo una firma al servidor.
Autentica también a los procesos
Para una conexión local de dominio Unix, SO_PEERCRED de Linux obtiene las credenciales del otro extremo desde el núcleo en lugar de confiar en un nombre enviado por el cliente. Entre máquinas, los servicios usan claves, certificados o tokens almacenados con acceso restringido a la cuenta de servicio. Después de iniciar sesión, las comprobaciones ordinarias de acceso del sistema operativo usan el UID o el token de acceso; no preguntan si el usuario escribió una contraseña o tocó una llave.
Puntos clave
- MFA combina distintos tipos de factores, no simplemente dos preguntas.
- Los códigos TOTP pueden retransmitirse mientras sean válidos.
- El inicio de sesión con clave pública demuestra la posesión sin enviar la clave privada.
- FIDO2 vincula la autenticación al sitio previsto.
- FAR y FRR usan poblaciones de intentos distintas.
- Un umbral biométrico más exigente reduce las aceptaciones de impostores, pero aumenta los rechazos de usuarios legítimos.
- Las credenciales del otro extremo de una conexión local deben proceder del núcleo.
3Controla el acceso a los archivos y a otros recursos
Una identidad autenticada sigue necesitando una decisión sobre cada recurso que solicita. Representa los derechos en una matriz de acceso y después compara las listas asociadas a los objetos con los tokens que poseen los procesos. Analiza los permisos de archivos y directorios antes de añadir la política obligatoria y los roles de trabajo. Una misma solicitud puede implicar un identificador abierto, bits de modo ordinarios y un límite de servicio aplicado de forma centralizada.
3.1 Compara las listas de control de acceso y las capacidades
Una decisión de acceso tiene tres partes: un sujeto solicita realizar una operación sobre un objeto. El sujeto suele ser un proceso que actúa en nombre de una entidad de seguridad; los objetos incluyen archivos, dispositivos y otros procesos. Una matriz de acceso representa los derechos en celdas, con los sujetos como filas y los objetos como columnas.
Almacena los mismos derechos de dos formas
Supón que alice puede leer y escribir report.txt, bob solo puede leerlo y el servicio de copias de seguridad puede leer tanto report.txt como payroll.db. Bob también puede leer y escribir payroll.db. Alice y bob pueden usar la impresora; el servicio de copias de seguridad no. La mayoría de las celdas de la matriz mucho mayor de un sistema real están vacías.
Una lista de control de acceso (ACL) almacena una columna junto con su objeto. La lista de report.txt nombra a alice, bob y backup con sus respectivos derechos. Una lista de capacidades almacena una fila junto con el sujeto. Bob posee tokens para leer el informe, leer y escribir la nómina y usar la impresora.
| Pregunta | ACL | Lista de capacidades |
|---|---|---|
| ¿Quién puede usar este objeto? | Examinar su lista | Buscar a todos los poseedores |
| ¿Qué puede usar este sujeto? | Examinar muchos objetos | Examinar sus tokens |
| ¿Cómo se delegan derechos limitados? | Añadir o cambiar entradas | Pasar tokens seleccionados sin añadir derechos |
| ¿Qué dificulta la revocación? | Pueden permanecer identificadores ya concedidos | Pueden haberse difundido copias de los tokens |
Una capacidad identifica tanto un objeto como las operaciones permitidas y su poseedor no puede falsificarla ni ampliarla. Se permiten la copia y la delegación autorizadas. El núcleo puede conservar el token real mientras el código de usuario tiene un índice; otro diseño protege el token mediante criptografía.
Sigue un descriptor después de abrir un archivo
Unix combina ambos enfoques. open() comprueba a quien hace la llamada frente a los permisos del archivo y después devuelve un descriptor de archivo que registra el acceso concedido. Las lecturas y escrituras posteriores comprueban ese identificador abierto. Un proceso hijo puede heredarlo mediante fork(), o un proceso puede recibirlo por un socket de dominio Unix.
Alice abre app.log para escribir. Su propietario cambia el modo a 444. El descriptor que alice ya tiene abierto puede seguir usándose para escribir; un nuevo intento de abrir el archivo para escritura encuentra el nuevo modo. Actualizar la ACL que rige las aperturas futuras no cancela todas las capacidades ya emitidas. Los identificadores de Windows siguen el mismo patrón general.
Capsicum de FreeBSD hace que esto sea útil para el confinamiento. Después de cap_enter(), un proceso no puede abrir una ruta absoluta arbitraria. Puede operar mediante descriptores existentes, recibir descriptores y usar openat() bajo un descriptor de directorio que posea. Por tanto, un proceso padre puede dar a un trabajador exactamente los archivos que necesita. Los núcleos basados en capacidades, como seL4 y Fuchsia, extienden la idea a los objetos del núcleo en general.
Distingue el otro significado de capacidad en Linux
Las capacidades de Linux dividen los privilegios de root en categorías. CAP_NET_BIND_SERVICE permite asociarse a puertos de número bajo; CAP_DAC_OVERRIDE elude las comprobaciones ordinarias de acceso a archivos. Estos privilegios no identifican un objeto concreto, por lo que son distintos de una capacidad de la matriz de acceso. Un único privilegio de Linux puede autorizar una clase de operaciones sobre muchos objetos.
Puntos clave
- Las ACL organizan los derechos por objeto; las listas de capacidades los organizan por sujeto.
- El poseedor de una capacidad no puede falsificarla ni ampliarla.
- Los descriptores conservan el acceso concedido al abrir un objeto.
- Cambiar el modo de un archivo normalmente no revoca los descriptores existentes.
- Las capacidades de Linux dividen los privilegios de root y no identifican objetos individuales.
3.2 Interpreta y configura los permisos de Unix y Windows
Los permisos de Unix asignan derechos al propietario, al grupo propietario y a todos los demás. Para decidir sobre un acceso, identifica primero la operación y el objeto correspondiente. Leer el contenido de un archivo, atravesar un directorio y eliminar un nombre requieren permisos distintos.
Descifra y selecciona los bits
Lectura es 4, escritura 2 y ejecución 1. Suma estos valores para cada clase: 754 significa rwxr-xr--; 640 significa rw-r-----. chmod 640 notes.txt establece un modo, mientras que chmod g+w,o-r notes.txt modifica determinados bits. El propietario o root pueden cambiar el modo; cambiar la propiedad requiere autoridad de root, representada por CAP_CHOWN en Linux.
El núcleo selecciona la primera clase que coincide: propietario si coincide el UID efectivo; en caso contrario, grupo si coincide un grupo del proceso; de lo contrario, otros. No combina clases ni vuelve a intentar con una más permisiva. Alice es propietaria de un archivo con modo 077: sus bits de propietario están vacíos, por lo que no puede leerlo aunque el grupo y los demás tengan todos los derechos. Como propietaria, aún puede cambiar el modo.
Root normalmente elude las comprobaciones de lectura y escritura. Para ejecutar un archivo ordinario bajo las comprobaciones discrecionales habituales de Linux, debe estar activado al menos un bit de ejecución. La política obligatoria puede imponer más restricciones.
Interpreta los bits de directorio y los bits especiales
La lectura de un directorio permite listar nombres; la ejecución permite atravesarlo y buscar en él; la escritura junto con la ejecución permite crear, eliminar y renombrar entradas. Eliminar un nombre modifica su directorio, por lo que alguien con los derechos necesarios sobre el directorio puede eliminar un archivo con modo 000.
Setuid añade 4000 en octal al modo de un ejecutable y cambia la identidad efectiva de usuario al ejecutarlo. Setgid añade 2000 y cambia el grupo de forma similar; en un directorio hace que los archivos nuevos hereden el grupo del directorio. El bit de permanencia añade 1000. Un directorio como /tmp, con modo 1777, permite la eliminación o el cambio de nombre solo al propietario del archivo, al propietario del directorio o a un proceso privilegiado, y siguen siendo necesarios los permisos ordinarios del directorio.
Elimina bits al crear archivos
Una umask desactiva bits del modo que solicita un programa. Es una operación con bits, no una resta octal. Con las solicitudes habituales de 666 para archivos y 777 para directorios:
| Umask | Archivo nuevo | Directorio nuevo |
|---|---|---|
| 022 | 644 | 755 |
| 027 | 640 | 750 |
| 000 | 666 | 777 |
Una umask no puede añadir derechos de ejecución que estaban ausentes de la solicitud para el archivo.
Interpreta listas de acceso más detalladas
Las ACL POSIX añaden usuarios y grupos con nombre. setfacl -m u:bob:r report.txt da a bob una entrada de lectura con nombre; getfacl la muestra y ls -l marca la ACL ampliada con +. La máscara de ACL limita a los usuarios y grupos nombrados y al grupo propietario, por lo que una entrada con nombre puede mostrar más derechos de los que son efectivos.
Windows NTFS usa un descriptor de seguridad con un SID de propietario y una DACL de ACE ordenadas de autorización o denegación. La evaluación se detiene cuando se deniega un derecho solicitado o se han concedido todos los derechos solicitados; los derechos que no se conceden se deniegan. El orden preferido sitúa las entradas explícitas antes de las heredadas, con las de denegación antes de las de autorización dentro de cada grupo. Por tanto, una autorización explícita puede resolver una solicitud antes de llegar a una denegación heredada. Una SACL independiente selecciona los eventos de acceso que se auditan.
Puntos clave
- Elige la clase de permisos de Unix que corresponda antes de comprobar sus bits.
- Los permisos del directorio rigen los nombres; los del archivo rigen su contenido.
- El bit de permanencia añade una comprobación de propiedad para eliminar y renombrar.
- Una umask desactiva bits solicitados y nunca los añade.
- La máscara de ACL POSIX limita la clase de grupo y las entradas con nombre.
- La evaluación de una DACL de Windows depende del orden de las ACE.
- Una SACL selecciona lo que se audita en lugar de conceder acceso.
3.3 Compara el control de acceso discrecional, obligatorio y basado en roles
Los distintos modelos de control de acceso responden a distintas preguntas de gestión. ¿Quién puede conceder acceso? ¿Puede un programa comprometido compartir los datos de un usuario? ¿Cómo puede un administrador cambiar los derechos de muchos empleados sin editar cada archivo? Un sistema operativo puede aplicar varios modelos a una misma solicitud.
Distingue la elección del propietario de la política del sistema
En el control de acceso discrecional (DAC), el propietario de un objeto decide quién puede usarlo. Los modos y las ACL de Unix son mecanismos conocidos. Su debilidad es que un programa malicioso que actúe como el usuario puede ejercer los derechos de este, incluida la copia de los datos que puede leer a otro lugar.
En el control de acceso obligatorio (MAC), la política de un administrador para todo el sistema limita el acceso independientemente de los deseos del propietario. El núcleo aplica MAC además de DAC. Ambas comprobaciones deben permitir el acceso, por lo que un modo de archivo permisivo no anula una denegación obligatoria.
El modelo de Bell–LaPadula protege la confidencialidad con niveles ordenados y dos reglas: no leer hacia arriba y no escribir hacia abajo. Un proceso de nivel Secreto puede leer datos Confidenciales y escribir en un destino de nivel Alto secreto. No puede leer datos de nivel Alto secreto ni escribir datos Confidenciales. Un programa no puede trasladar información de Secreto a Confidencial simplemente leyéndola y volviéndola a escribir. Biba invierte las direcciones de lectura y escritura para proteger la integridad.
Confina un servicio incluso cuando es root
SELinux etiqueta los archivos con tipos y ejecuta los procesos en dominios. La política indica qué operaciones puede realizar cada dominio sobre cada tipo; el acceso no incluido se deniega. Un servidor web en httpd_t puede leer páginas etiquetadas como httpd_sys_content_t mientras se bloquea su acceso a user_home_t, aunque los modos Unix ordinarios permitan la lectura. ls -Z muestra las etiquetas.
En modo de aplicación, SELinux bloquea y registra las infracciones. En modo permisivo, registra sin bloquear. Root en un dominio confinado sigue teniendo que cumplir la política en modo de aplicación. Por tanto, tener UID 0 y tener acceso sin restricciones son afirmaciones distintas.
AppArmor confina programas mediante perfiles basados en rutas de archivos y capacidades permitidas. Se usa habitualmente en Ubuntu y SUSE. SELinux y AppArmor funcionan mediante puntos de integración de los módulos de seguridad de Linux (LSM) en las decisiones de seguridad. Android combina UID específicos para cada aplicación con SELinux; los sistemas de Apple también usan perfiles de aislamiento de aplicaciones.
Asigna puestos en lugar de derechos individuales
En el control de acceso basado en roles (RBAC), los permisos se asocian a roles y los usuarios reciben esos roles. Cambiar a una persona de puesto modifica su pertenencia a roles en lugar de muchos permisos independientes sobre objetos.
Supón que 50 empleados necesitan 20 permisos cada uno. La asignación directa necesita 1000 vínculos de permiso a usuario. Si cinco roles tienen 20 permisos cada uno y cada empleado tiene un rol, la gestión necesita 50 vínculos de usuario a rol y 100 vínculos de permiso a rol: 150 en total. El ahorro procede de patrones de trabajo compartidos, no de eliminar permisos necesarios.
Los grupos de Windows usados como roles y las políticas de sudo basadas en grupos implementan este patrón. DAC es adecuado para archivos gestionados por sus propietarios, MAC contiene servicios mediante reglas aplicadas de forma centralizada y RBAC organiza las asignaciones administrativas. Un servicio puede recibir los derechos de su función mediante un rol mientras DAC y MAC comprueban su acceso real a los archivos.
Puntos clave
- DAC permite a los propietarios elegir el acceso; MAC aplica una política para todo el sistema.
- Una solicitud debe superar tanto DAC como MAC en modo de aplicación.
- Bell–LaPadula bloquea las lecturas hacia arriba y las escrituras hacia abajo.
- Los dominios y tipos de SELinux pueden confinar procesos root.
- RBAC gestiona los permisos mediante roles de trabajo.
4Ejecuta sistemas operativos dentro de máquinas virtuales
Ejecutar varios núcleos en un equipo añade una capa de protección por debajo del sistema operativo. Un hipervisor debe preservar la perspectiva de cada invitado mientras mantiene el control del tiempo de CPU física, la memoria y los dispositivos. Sigue los mecanismos desde las instrucciones interceptadas hasta la traducción de direcciones en dos etapas y después compara las interfaces de dispositivos y las vías restantes por las que un invitado podría afectar a su anfitrión.
4.1 Describe las máquinas virtuales y los hipervisores
Una máquina virtual (VM) proporciona a un sistema operativo completo su propio equipo aparente. Ese sistema operativo es el sistema invitado. El equipo físico es el anfitrión, y el hipervisor, o monitor de máquina virtual (VMM), asigna tiempo real de procesador, memoria y dispositivos a los invitados.
Conserva el comportamiento mientras mantienes el control
El marco de Popek y Goldberg de 1974 identifica tres propiedades. Equivalencia significa que los programas se comportan como en una máquina real, salvo por los tiempos y los recursos disponibles. Control de recursos significa que el hipervisor mantiene el control del hardware. Eficiencia significa que la mayoría de las instrucciones del invitado se ejecutan directamente en el procesador.
El hipervisor planifica las CPU virtuales (vCPU) en los núcleos físicos. Un cambio de máquina guarda todo el estado de ejecución de una VM, incluidos los registros privilegiados y la configuración de interrupciones, y después restaura el de otra. Un invitado ve su propio estado incluso cuando comparte un núcleo físico con otros invitados.
| Diseño | Dónde se ejecuta el hipervisor | Ejemplos |
|---|---|---|
| Tipo 1, directamente sobre el hardware | Controla directamente el hardware | ESXi, Xen, Hyper-V |
| Tipo 2, alojado | Se ejecuta como una aplicación que usa un sistema operativo anfitrión | VirtualBox, VMware Workstation, Parallels Desktop |
KVM convierte el propio núcleo de Linux en un hipervisor y suele clasificarse como de tipo 1. Sigue estando disponible un anfitrión Linux completo, lo que hace menos clara la distinción sencilla entre dos tipos. Para razonar sobre la protección, identifica qué componente controla realmente la virtualización de CPU y memoria.
Usa la abstracción de máquina
La consolidación de servidores reúne sistemas poco utilizados. Doce servidores que usan cada uno una media del 5 % de un equipo de ocho núcleos necesitan en conjunto el 60 % de un equipo de ese tipo. Esa media sugiere que la consolidación es posible, pero los picos simultáneos y la demanda de RAM y dispositivos siguen requiriendo margen.
Una instantánea guarda el estado de una VM para restaurarlo más adelante. Copiar solo una imagen de disco no captura una CPU en ejecución ni su memoria. La migración en vivo transfiere una VM en ejecución a otro anfitrión, copiando la memoria y cambiando la ejecución con una breve pausa. Estas operaciones son posibles porque el estado de la máquina invitada se representa como datos que gestiona el hipervisor.
Las VM también permiten probar sistemas antiguos, separar software incompatible y ejecutar distintos sistemas operativos en hardware compatible. Una VM puede ejecutar un invitado Windows junto a un invitado Linux, cada uno con su propio núcleo. Las instancias de servidores en la nube suelen usar este límite.
Separa la virtualización de la emulación completa
Un emulador puede interpretar o traducir un conjunto de instrucciones para un procesador diferente, como código ARM en x86. La virtualización por hardware normalmente ejecuta las instrucciones del invitado directamente en un procesador compatible e interviene ante eventos sensibles. Esto explica tanto su velocidad como su necesidad de soporte de la CPU.
Los núcleos invitados separados forman un límite útil: tomar el control de un núcleo invitado no da directamente el control del núcleo anfitrión. El límite sigue dependiendo del funcionamiento correcto del hipervisor y del código de los modelos de dispositivos. Un escape de VM explota esa capa, mientras que un canal lateral puede filtrar datos a través del hardware compartido sin conceder acceso ordinario a la memoria. Elegir una VM reduce las interfaces expuestas a un invitado no confiable; no hace infalible el hardware compartido.
Puntos clave
- Una VM presenta una máquina completa a su sistema operativo invitado.
- La equivalencia, el control de recursos y la eficiencia describen la función de un VMM.
- Una vCPU se planifica en una CPU física.
- Las instantáneas y la migración dependen de guardar y transferir el estado de la máquina.
- La consolidación necesita margen para los picos de demanda, no solo una media baja.
- El aislamiento de las VM depende del funcionamiento correcto del hipervisor, los modelos de dispositivos y el hardware.
4.2 Virtualiza el procesador
Un núcleo invitado espera controlar su máquina. El hipervisor debe mantener esa apariencia sin ceder el equipo real. La virtualización de la CPU permite que las instrucciones ordinarias del invitado se ejecuten directamente e intercepta las operaciones que necesitan cambiar el estado de la máquina virtual.
Intercepta y emula el estado virtual
En la intercepción y emulación clásica, se reducen los privilegios del núcleo invitado. Su intento de cargar un registro de tabla de páginas o instalar una tabla de trampas provoca una trampa hacia el hipervisor. El hipervisor actualiza el registro o la tabla virtual del invitado y reanuda la ejecución. No permite que el invitado sustituya las estructuras de control reales del hipervisor.
Una llamada al sistema del invitado puede requerir varios cruces en este diseño. La aplicación invitada provoca una trampa hacia el manejador real del hipervisor. El hipervisor transfiere la ejecución al manejador registrado del núcleo invitado con privilegios reducidos. Cuando el núcleo invitado retorna, ese retorno privilegiado provoca otra trampa; el hipervisor completa el retorno real a la aplicación invitada.
La condición de Popek y Goldberg para esta técnica es que toda instrucción sensible debe ser privilegiada. Sensible significa que cambia la configuración de la máquina o se comporta de forma diferente según los privilegios. Privilegiada significa que provoca una trampa fuera del modo más privilegiado. Las diferencias silenciosas no pueden emularse si el hipervisor nunca sabe que ocurrieron.
Comprende el obstáculo del x86 clásico
El análisis de Robin e Irvine de 2000 identificó 17 instrucciones x86 sensibles no privilegiadas. Por ejemplo, POPF puede restaurar el indicador de habilitación de interrupciones con suficientes privilegios, pero lo deja sin cambios de forma silenciosa con privilegios reducidos. Un invitado con privilegios reducidos puede creer que desactivó las interrupciones aunque ninguna trampa avisó al hipervisor para que actualizara su estado virtual de interrupciones.
Tres enfoques resuelven este problema:
| Enfoque | Cómo intercepta la operación | Cambio en el invitado |
|---|---|---|
| Traducción binaria | Reescribe las instrucciones problemáticas del núcleo invitado antes de ejecutarlas y guarda el código traducido en caché | Sin cambios en el código fuente |
| Paravirtualización | Sustituye las operaciones privilegiadas por hiperllamadas explícitas | Núcleo invitado modificado |
| Asistencia de hardware | Proporciona funcionamiento separado para el invitado y salidas controladas de la VM | Puede ejecutarse un invitado sin modificar |
VMware usó la traducción binaria en 1999; Xen usó la paravirtualización en 2003. Intel VT-x llegó en 2005 y AMD-V en 2006. Las aplicaciones ordinarias del invitado pueden seguir ejecutándose directamente cuando el código del núcleo necesita traducción o hiperllamadas.
Separa el número de anillo del modo de virtualización
Con Intel VT-x, el hipervisor funciona en modo VMX raíz y un invitado en modo no raíz. Allí, el núcleo invitado puede usar el anillo 0. El anillo 0 de un invitado no da control sobre el anfitrión físico.
Los eventos configurados provocan una salida de la máquina virtual, que guarda el estado de la vCPU en una estructura de control como la VMCS. El hipervisor gestiona el evento y reanuda la ejecución mediante una entrada en la máquina virtual. Muchas llamadas al sistema pueden permanecer por completo dentro del invitado. ARM usa EL2 para el hipervisor; RISC-V proporciona una extensión de hipervisor.
Si un invitado ejecuta HLT y ese evento está configurado para provocar una salida, el hipervisor marca su vCPU como en espera y planifica otro trabajo hasta que llega una interrupción virtual. El núcleo físico no tiene por qué permanecer inactivo. Las salidas y entradas siguen costando tiempo, normalmente de cientos a miles de ciclos, por lo que la agrupación y las interfaces paravirtuales siguen siendo valiosas.
Puntos clave
- La intercepción y emulación aplica las operaciones sensibles al estado de la máquina virtual.
- La intercepción y emulación clásica requiere que las instrucciones sensibles provoquen trampas.
- La traducción binaria reescribe código; la paravirtualización cambia la interfaz del invitado.
- El anillo 0 del invitado con VT-x sigue separado del funcionamiento en modo VMX raíz.
- Las salidas de VM son eventos controlados con un coste real de rendimiento.
4.3 Virtualiza la memoria
Una aplicación invitada usa una dirección virtual del invitado. Su núcleo la traduce a una dirección física del invitado, que es la perspectiva que este tiene de la RAM. Después, el hipervisor mapea esa dirección a una dirección física del anfitrión, o de máquina. Cada invitado puede creer que su RAM comienza en cero mientras usa marcos reales diferentes.
Conserva el desplazamiento dentro de la página
Usa páginas de 4 KiB. El invitado mapea la página virtual 2 al marco 7 del invitado; el hipervisor mapea el marco 7 del invitado al marco 42 de la máquina. Para la dirección 0x2ABC:
- Divídela en la página 2 y el desplazamiento
0xABC. - Sustituye la página 2 por el marco 7 del invitado, lo que da
0x7ABC. - Sustituye el marco 7 del invitado por el marco 42 de la máquina,
0x2Aen hexadecimal. - Conserva el desplazamiento, lo que da la dirección de máquina
0x2AABC, o 174 780 bytes desde la dirección cero.
Solo cambia el número de página. Tratar la dirección física del invitado como una dirección real de RAM eludiría la decisión de asignación y aislamiento del hipervisor.
Compara la traducción por software y por hardware
Las tablas de páginas sombra mapean las páginas virtuales del invitado directamente a marcos de máquina. La MMU real usa estas tablas, construidas por el hipervisor. El hipervisor protege contra escritura las páginas que contienen las tablas de páginas del invitado e intercepta los cambios y las sustituciones de sus tablas para que las tablas sombra sigan siendo consistentes. Por tanto, los cambios frecuentes de espacio de direcciones del invitado provocan trampas adicionales.
La paginación anidada, Intel EPT o AMD NPT, proporciona ambas etapas a la MMU. El hardware recorre las tablas del invitado y las tablas que traducen direcciones físicas del invitado a direcciones de máquina. Las actualizaciones de las tablas de páginas del invitado ya no requieren todas una interceptación por software. La TLB almacena en caché la traducción final combinada.
Un fallo de caché aún puede ser costoso. Con cuatro niveles en cada etapa, cada una de las cuatro entradas de la tabla del invitado necesita cuatro referencias a la tabla anidada más la propia entrada: 20 referencias. Traducir la dirección física de los datos finales del invitado añade cuatro más, lo que suma 24 referencias de traducción antes del acceso a los datos. Las páginas grandes y las cachés de recorrido de tablas de páginas reducen este trabajo en el peor caso sin caché.
Recupera memoria con conocimiento limitado del invitado
La sobreasignación de memoria promete más memoria total a los invitados de la que tiene el anfitrión. Cuatro VM de 16 GiB suman 64 GiB en un anfitrión de 48 GiB. Esto solo funciona mientras sus necesidades activas quepan en la memoria disponible; si todas pasan a estar ocupadas, es necesario recuperar memoria o recurrir al intercambio.
Un controlador globo dentro de un invitado asigna páginas a petición del hipervisor. El sistema operativo invitado elige qué liberar, mientras que el hipervisor recupera los marcos de máquina correspondientes a las páginas del globo. Esto reduce la brecha de información: el invitado sabe qué datos importan, mientras que el hipervisor ve las asignaciones sin conocer todo su significado.
La compartición de páginas, como Linux KSM, fusiona páginas idénticas en una copia de solo lectura y las separa al escribir. El intercambio por parte del hipervisor ofrece otra opción, pero puede elegir mal porque carece del conocimiento del invitado. Un dispositivo asignado directamente a la VM también necesita una IOMMU para traducir y restringir sus direcciones DMA.
Compartir páginas idénticas entre clientes tiene un coste para la privacidad: el tiempo de copia en escritura puede revelar si otro invitado tiene los mismos datos. Los proveedores de nube suelen desactivar esa forma de compartición entre clientes aunque ahorre memoria.
Puntos clave
- Las direcciones virtuales del invitado, físicas del invitado y de máquina son capas distintas.
- El desplazamiento dentro de la página permanece sin cambios en ambas traducciones.
- Las tablas sombra requieren que el hipervisor siga los cambios en las tablas del invitado.
- La paginación anidada realiza ambas etapas en hardware y almacena en caché el resultado combinado.
- La sobreasignación depende de que la demanda se mantenga por debajo de la capacidad disponible.
- El controlador globo usa el conocimiento del invitado; la compartición de páginas puede exponer información mediante los tiempos de acceso.
4.4 Virtualiza dispositivos y mantén aisladas las máquinas virtuales
Una VM necesita almacenamiento, conexión de red y otros dispositivos, además de tiempo de CPU y RAM. La interfaz del dispositivo afecta a la compatibilidad, el rendimiento y el código al que puede acceder un invitado no confiable. Una interfaz rápida y una interfaz de confianza reducida son decisiones de diseño relacionadas, pero no son la misma propiedad.
Elige cómo accede el invitado a un dispositivo
| Enfoque | Interfaz del invitado | Principal compensación |
|---|---|---|
| Emulación | Un modelo de un dispositivo físico conocido | Funcionan los controladores existentes, pero las operaciones sobre registros requieren trabajo de software |
| Dispositivo paravirtual | Un controlador preparado para la virtualización y colas compartidas | Agrupación eficiente, pero el invitado necesita el controlador |
| Asignación directa | Un dispositivo físico o una función virtual asignados | Acceso cercano al nativo, pero más difícil de compartir y migrar |
Un programa auxiliar como QEMU puede emular una tarjeta de red Intel e1000. El controlador ordinario del invitado escribe en registros conocidos; el programa auxiliar implementa el efecto. Los accesos frecuentes a registros pueden provocar muchas salidas y operaciones de software.
En cambio, un controlador virtio intercambia solicitudes mediante colas en memoria compartida. Puede poner varias operaciones en cola y notificar una sola vez al componente que las atiende. Los dispositivos vmxnet3 de VMware y VMBus de Hyper-V siguen diseños relacionados preparados para la virtualización. Un controlador de dispositivo paravirtual no significa que todo el núcleo invitado deba usar operaciones de CPU paravirtuales.
En la asignación directa de dispositivos, el invitado dispone de un dispositivo físico o una función virtual SR-IOV. La IOMMU limita el DMA a la memoria de la VM. La asignación directa reduce la mediación del software, pero transferir el estado del dispositivo a otro anfitrión puede dificultar la migración en vivo.
Trata los discos virtuales como estado gestionado
Un disco virtual suele ser un archivo del anfitrión, como qcow2, VMDK o VHDX, o un volumen de almacenamiento. Las imágenes con copia en escritura permiten que muchos invitados compartan una base mientras registran cambios separados. Las instantáneas pueden conservar el estado del disco con poco coste, y una instantánea completa de una VM en ejecución también necesita su estado de ejecución y de memoria. La clonación y la migración dependen de la capacidad del hipervisor para gestionar estas representaciones.
Identifica el límite que debe cruzar un atacante
Un núcleo invitado comprometido ya controla esa VM, pero llegar al anfitrión requiere un escape de máquina virtual u otro fallo del límite. La vulnerabilidad VENOM de 2015 afectaba al controlador de disquetes emulado de QEMU y podía permitir que el código invitado se ejecutara en el proceso QEMU del anfitrión. Mantener la emulación de dispositivos en un proceso aislado independiente limita la autoridad expuesta por un error de este tipo.
Las cachés de CPU, los predictores de saltos y los buses de memoria compartidos también crean canales laterales. Spectre y L1TF mostraron que el aislamiento no puede evaluarse solo a partir de los mapeos de páginas. Las medidas de mitigación incluyen actualizaciones del procesador y del microcódigo, limpieza del estado pertinente entre invitados y evitar colocar simultáneamente a distintos clientes en los hilos de hardware del mismo núcleo.
La computación confidencial, que incluye AMD SEV-SNP e Intel TDX, protege la memoria del invitado frente al hipervisor con claves de cifrado mantenidas por el hardware y permite la atestación del entorno iniciado. Amplía el límite de confianza frente a un anfitrión u operador comprometido. No elimina todos los canales laterales ni todas las formas en que un anfitrión puede interrumpir el servicio. La seguridad de una VM sigue dependiendo del hipervisor, las interfaces de dispositivos, el hardware y su configuración.
Puntos clave
- La emulación favorece la compatibilidad; las colas paravirtuales reducen las salidas repetidas.
- La asignación directa requiere que la IOMMU limite el DMA del dispositivo.
- Los discos virtuales y el estado guardado de la máquina permiten crear instantáneas y migrar.
- Los errores en los modelos de dispositivos pueden permitir un escape de máquina virtual.
- El hardware compartido puede filtrar información sin un fallo ordinario de permisos de memoria.
- La computación confidencial protege la memoria del invitado frente al anfitrión dentro de las garantías de su hardware.
5Aísla aplicaciones mediante contenedores
Los contenedores construyen un entorno aislado alrededor de procesos ordinarios del núcleo del anfitrión. Sus vistas privadas, presupuestos de recursos y autoridad proceden de distintas funciones del núcleo, por lo que cada una necesita atención por separado. Interpreta las correspondencias de espacios de nombres y la configuración de los grupos de control, y después relaciónalas con las restricciones de privilegios. Usa el límite del núcleo compartido para decidir cuándo son adecuados los contenedores, las VM o una combinación para una carga de trabajo.
5.1 Limita lo que ve un proceso mediante espacios de nombres
Un contenedor Linux es un conjunto de procesos que usan el núcleo del anfitrión con vistas y privilegios restringidos. No tiene un núcleo separado ni un equipo emulado. Los espacios de nombres dan a los procesos instancias privadas de recursos que de otro modo serían globales.
Relaciona cada espacio de nombres con su vista
| Espacio de nombres | Qué separa |
|---|---|
| Montajes | Sistemas de archivos montados y árbol de archivos visible |
| PID | Números de proceso y visibilidad de procesos |
| Red | Interfaces, direcciones, rutas, puertos y reglas de cortafuegos |
| UTS | Nombre de anfitrión y nombre de dominio NIS |
| IPC | Objetos IPC de System V y colas de mensajes POSIX |
| Usuarios | Correspondencias de identificadores de usuario y grupo y capacidades de alcance limitado |
| Cgroup | Parte visible de la jerarquía de cgroups |
| Tiempo | Desplazamientos de los relojes monotónico y de arranque |
clone() con opciones de espacios de nombres crea un proceso hijo en los nuevos espacios seleccionados. unshare() separa el contexto de espacios de nombres, y setns() se une a un espacio existente mediante un descriptor como uno abierto desde /proc/1234/ns/net. La reasociación de PID afecta a los procesos hijos posteriores sin mover a quien hace la llamada. Para los espacios de nombres de tiempo, unshare(CLONE_NEWTIME) también prepara un espacio para los hijos posteriores; setns() puede mover a quien hace la llamada a un espacio de nombres de tiempo existente. Los espacios de nombres de tiempo se crean con unshare().
Por tanto, unshare --pid --fork --mount-proc bash usa --fork para crear el intérprete dentro del nuevo espacio de nombres de PID. Ese intérprete es allí el PID 1 aunque su PID en el anfitrión sea 48213. El PID 1 adopta procesos huérfanos; si termina, el núcleo termina los procesos restantes del espacio de nombres. Los procesos de un espacio de nombres antecesor pueden ver a sus descendientes, mientras que los procesos de su interior no pueden ver hacia fuera, a los espacios de nombres de PID antecesores.
Separa los archivos y la red
Un espacio de nombres de montajes proporciona una lista de montajes privada. Un entorno de ejecución reúne un árbol de archivos y lo convierte en raíz mediante pivot_root. Un contenedor puede usar /etc y /usr de otra distribución Linux mientras sigue llamando al núcleo del anfitrión. chroot por sí solo solo cambia el punto de partida de la búsqueda de rutas; no es un límite seguro frente a un proceso privilegiado.
Un espacio de nombres de red nuevo tiene una interfaz de bucle local. Un entorno de ejecución puede conectarlo mediante un par veth, con un extremo dentro y otro conectado a un puente del anfitrión. Las pilas separadas permiten que dos contenedores escuchen en el puerto 80 sin competir por un puerto del mismo espacio de nombres.
Traduce identidades entre los límites de un espacio de nombres de usuarios
Una línea de /proc/<pid>/uid_map enumera el primer identificador interno, el primer identificador externo y la longitud del intervalo. La línea 0 100000 65536 asigna los identificadores internos 0–65535 a los identificadores 100000–165535 del anfitrión. Por tanto, el UID interno 1000 se corresponde con el 101000 externo. Los identificadores sin una correspondencia utilizable se muestran normalmente como el UID de desbordamiento 65534.
Root dentro de ese espacio de nombres tiene capacidades sobre los recursos que este gobierna, no autoridad sobre todo el anfitrión. Cargar un módulo del núcleo o cambiar el reloj real del sistema sigue requiriendo privilegios en el espacio de nombres de usuarios inicial. Una correspondencia de UID no protege un socket privilegiado del entorno de ejecución que se entregue al contenedor.
Una vista privada tampoco limita el consumo. Un proceso con sus propios espacios de nombres de PID y montajes puede seguir consumiendo CPU y RAM. Los cgroups limitan las cantidades, mientras que los límites de capacidades y seccomp restringen las operaciones.
Puntos clave
- Los contenedores usan procesos del núcleo del anfitrión con vistas privadas de los recursos.
- Los ocho tipos de espacios de nombres separan distintas clases de estado global.
- La reasociación de PID y unshare de espacios de nombres de tiempo afectan a los hijos posteriores; setns puede unirse directamente a un espacio de nombres de tiempo.
- El PID 1 tiene responsabilidades especiales durante el ciclo de vida dentro de su espacio de nombres.
- Los espacios de nombres de usuarios traducen identificadores y delimitan la autoridad.
- Las vistas privadas necesitan límites separados de recursos y privilegios.
5.2 Limita los recursos que utiliza un proceso mediante grupos de control
Un grupo de control, o cgroup, agrupa procesos para contabilizar y controlar sus recursos. Los espacios de nombres determinan su vista; los cgroups gobiernan cantidades como el tiempo de CPU, la memoria y el número de tareas. Los procesos hijos heredan el grupo de su padre, y la jerarquía impide que un grupo hijo escape de los límites de un antecesor.
Interpreta los archivos de cgroup v2
Cgroup v2 usa una jerarquía unificada, normalmente en /sys/fs/cgroup. Un padre habilita controladores para sus hijos mediante cgroup.subtree_control, por ejemplo +cpu +memory +pids. Los archivos individuales de cada hijo contienen límites y contadores.
Los controladores incluyen cpu, cpuset, memory, io, pids, hugetlb y rdma. Gobiernan el tiempo de CPU, la ubicación en CPU y nodos de memoria, la memoria ordinaria, la entrada/salida de bloques, el número de tareas, las páginas enormes y los recursos RDMA. Los eventos de rendimiento compatibles con cgroups permiten realizar mediciones, y cgroup.freeze pausa la ejecución de un grupo.
Distingue un límite de CPU de una proporción
cpu.max contiene la cuota y el periodo en microsegundos. 50000 100000 permite 50 ms de ejecución de CPU por cada 100 ms, lo que equivale a la mitad de una CPU. 200000 100000 permite el tiempo equivalente a dos CPU, que puede repartirse entre núcleos. max 100000 significa que no hay límite de cuota. Una vez consumida la cuota, el grupo espera al siguiente periodo aunque haya una CPU inactiva.
cpu.weight establece una proporción relativa durante la competencia, de 1 a 10 000 con el valor predeterminado 100. Para grupos ejecutables con la misma ubicación en cuatro CPU, los pesos 100 y 300 dividen el tiempo disponible en proporción 1:3: aproximadamente una CPU y tres CPU. Si el grupo de mayor peso queda inactivo, el otro puede usar las cuatro, salvo que intervenga otro límite. Un peso no es una reserva ni un límite estricto.
Contén el agotamiento de memoria y tareas
memory.high aplica presión para recuperar memoria y ralentiza las tareas por encima de su umbral. memory.max impone un límite estricto. El núcleo intenta primero recuperar memoria, incluida la caché y el espacio de intercambio disponible. Si no puede recuperar suficiente, la gestión OOM del cgroup termina un proceso elegible dentro del grupo afectado.
Para un memory.max de 512M, el límite es de 536 870 912 bytes, o 512 MiB. Un proceso con una fuga puede forzar la recuperación de memoria y finalmente una terminación por falta de memoria, pero el núcleo selecciona a la víctima y no se garantiza que sea ese proceso. El límite del grupo contiene el evento en lugar de elegir un proceso no relacionado del anfitrión.
pids.max cuenta procesos e hilos. Con un límite de 100, la creación de más procesos o hilos falla con EAGAIN, lo que contiene el crecimiento de tareas de una bomba fork. Un límite de entrada/salida como 8:0 rbps=10485760 en io.max limita las lecturas del dispositivo de bloques 8:0 a 10 MiB/s.
Estos archivos no ocultan los procesos ni los nombres de archivos del anfitrión. Además, /proc/meminfo y las herramientas que lo leen pueden mostrar la RAM del anfitrión en lugar de memory.max; el total mostrado por sí solo no demuestra que un cgroup carezca de límite. Las mediciones de recursos deben leerse en la capa que aplica el límite.
Puntos clave
- Cgroup v2 aplica controles de recursos mediante una jerarquía unificada.
- Un grupo hijo sigue sujeto a los límites de sus antecesores.
- cpu.max es una cuota estricta; cpu.weight es una proporción relativa durante la competencia.
- memory.high aplica presión; memory.max puede provocar una terminación local por falta de memoria.
- pids.max cuenta tanto hilos como procesos.
- Los límites de cgroup no crean vistas privadas de los recursos del anfitrión.
5.3 Aplica restricciones a los contenedores y elige entre contenedores y máquinas virtuales
Un límite útil para un contenedor combina vistas, controles de recursos y autoridad restringida. Un árbol de archivos privado por sí solo no detiene las llamadas al sistema peligrosas, y una cuota de CPU no impide el acceso a un archivo expuesto del anfitrión. El núcleo del anfitrión aplica cada uno de estos controles.
Reduce la autoridad del proceso
Un entorno de ejecución combina espacios de nombres, cgroups y una imagen del sistema de archivos que contiene programas y bibliotecas. Puede reforzar el límite mediante estas medidas:
- Ejecutar la carga de trabajo como un usuario distinto de root o establecer correspondencias de identificadores del contenedor mediante un espacio de nombres de usuarios.
- Eliminar capacidades de Linux, especialmente poderes amplios como
CAP_SYS_ADMINyCAP_SYS_MODULE. - Aplicar seccomp para restringir llamadas innecesarias.
- Aplicar una política de SELinux o AppArmor.
- Hacer que el sistema de archivos raíz sea de solo lectura cuando resulte práctico.
- Establecer
no_new_privspara que la ejecución de programas setuid no pueda elevar los privilegios.
Cada control cubre una vía diferente. Un sistema de archivos raíz de solo lectura sigue permitiendo las operaciones de red autorizadas; un filtro seccomp sigue permitiendo las llamadas de su lista. El diseño debe ajustarse a las operaciones que la aplicación realmente necesita.
Identifica el riesgo del núcleo compartido
Todos los contenedores ordinarios comparten el núcleo del anfitrión. Por tanto, un error del núcleo al que se pueda acceder puede comprometer el anfitrión y otros contenedores. En una VM, explotar el núcleo invitado da el control de ese invitado; llegar al anfitrión requiere otro fallo en el límite del hipervisor o de los dispositivos.
Root dentro de un contenedor es especialmente delicado. Sin un espacio de nombres de usuarios, es el UID 0 para el núcleo del anfitrión, limitado por las capacidades, los filtros y la política obligatoria. El modo privilegiado o el acceso al sistema de archivos raíz del anfitrión pueden eliminar esas restricciones. Un socket del entorno de ejecución propiedad de root también es peligroso: su cliente puede pedir al entorno que realice acciones privilegiadas. Asignar root del contenedor a un identificador sin privilegios del anfitrión no hace seguro ese socket ni elimina las vulnerabilidades del núcleo.
Elige un límite para la carga de trabajo
| Necesidad | Límite adecuado | Motivo |
|---|---|---|
| Servicios Linux de un equipo que se despliegan con frecuencia | Contenedores restringidos | Arranques rápidos y poca sobrecarga en un solo núcleo |
| Código de clientes que no confían entre sí | VM o micromáquinas virtuales | Los núcleos invitados separados reducen la exposición al núcleo compartido |
| Una aplicación exclusiva de Windows en anfitriones Linux | VM | La carga de trabajo necesita un núcleo diferente |
Un contenedor Linux necesita un núcleo Linux. Por ello, las plataformas de Windows y macOS suelen proporcionar una VM Linux debajo de los contenedores Linux. Las VM arrancan un sistema operativo y asignan memoria para cada núcleo; los contenedores inician procesos ordinarios y pueden alojar cargas de trabajo con mayor densidad.
Reconoce los diseños intermedios
gVisor gestiona muchas llamadas al sistema del contenedor en un núcleo en espacio de usuario, lo que reduce el contacto directo con el núcleo del anfitrión. Kata Containers proporciona a cada entorno aislado, normalmente un pod de Kubernetes, una VM ligera; los contenedores de ese entorno comparten su núcleo invitado. Firecracker proporciona micromáquinas virtuales con un modelo mínimo de dispositivos para plataformas que ejecutan funciones o cargas de trabajo de contenedores, incluida AWS Lambda.
Los sistemas en la nube suelen colocar contenedores dentro de VM: una VM separa a los clientes mientras los contenedores organizan las aplicaciones de un cliente. Los núcleos invitados y el núcleo del anfitrión siguen siendo distintos, por lo que un escape de contenedor dentro de una VM no demuestra por sí solo un escape del hipervisor.
Puntos clave
- El aislamiento de contenedores necesita vistas, límites de recursos y restricciones de privilegios.
- Todos los contenedores ordinarios de un anfitrión comparten su núcleo.
- Una correspondencia de UID sin privilegios de administrador en el anfitrión reduce la autoridad, pero no puede corregir errores del núcleo.
- El acceso a un socket privilegiado del entorno de ejecución puede conceder el control del anfitrión.
- Las VM pueden aportar otro núcleo; los contenedores usan el núcleo situado debajo de ellos.
- gVisor, Kata y Firecracker añaden distintos límites alrededor de las cargas de trabajo.
- Los contenedores dentro de VM combinan densidad de aplicaciones con núcleos invitados separados.
Ejemplos de Protección del sistema operativo
1Sigue una solicitud a través del límite del núcleo
16 pasos
- 1IntroducciónComienza con una aplicación en ejecución
Un servicio de informes pasa la mayor parte del tiempo calculando en modo usuario. Solo necesita el núcleo para trabajos protegidos, como abrir un archivo o establecer un mapeo.
Sigue lo que cambia cuando la ejecución cruza ese límite: cambia el privilegio de la CPU, pero aún deben comprobarse la identidad de quien hace la llamada y la validez de su solicitud. Después, sigue las protecciones separadas para la memoria, los dispositivos y el código ejecutable.
- 2ExplicaciónEjecuta código ordinario directamente
La CPU ejecuta directamente las sumas, lecturas y saltos del servicio. El hardware comprueba los privilegios y los permisos de memoria durante la ejecución; el núcleo no aprueba cada instrucción mediante software.
Un intento de sustituir una tabla de páginas o desactivar las interrupciones debe provocar una trampa. De lo contrario, el programa podría eliminar las mismas restricciones que deben contenerlo. Esta combinación es la ejecución directa limitada.
- 3DesafíoUn servicio deja de hacer solicitudes
El servicio queda atrapado en un bucle infinito en modo usuario. No vuelve a realizar ninguna llamada al sistema. ¿Puede el planificador ejecutar otro proceso listo?
---reveal---
Sí. Una interrupción del temporizador de hardware entra en el núcleo sin depender de la cooperación del servicio. El planificador puede seleccionar otro proceso. Programar el temporizador y desactivar las interrupciones requieren privilegios, por lo que el servicio atrapado en el bucle no puede quedarse con el núcleo evitando las llamadas al sistema.
- 4ExplicaciónSolicita un servicio protegido
Para leer un archivo, la función envoltorio de biblioteca coloca en registros un número de llamada, un descriptor, la dirección de un búfer y una longitud, y después ejecuta la instrucción de entrada a llamadas al sistema de la arquitectura.
El núcleo guarda el estado de usuario, selecciona el manejador y obtiene las credenciales de quien hace la llamada a partir del proceso actual. Entrar con privilegios del núcleo es solo el comienzo: el manejador aún debe decidir si se permiten la llamada y los argumentos.
- 5EjemploExamina el destino completo
Supón que el servicio solicita
read(fd, buf, 8192)para copiar bytes en su búfer. Que el primer byte sea válido no es suficiente: la copia puede cruzar un límite de página y entrar en un rango prohibido.El núcleo debe validar y acceder de forma segura a todo el destino necesario para la transferencia. Las rutinas de copia de usuario con comprobación de Linux gestionan direcciones de usuario no válidas sin permitir que la copia solicitada sobrescriba la memoria del núcleo.
- 6DesafíoUna solicitud tiene un tipo de acceso incorrecto
El búfer es válido, pero el servicio intenta ejecutar
write()con un descriptor que abrió conO_RDONLY. ¿Qué debe comprobar el núcleo y debe terminar el proceso?---reveal---
Comprueba el acceso concedido al descriptor y rechaza la escritura con
EBADFen Linux. Es un resultado de error que el programa puede gestionar. La llamada entró correctamente en el núcleo, pero el descriptor no contiene el derecho solicitado. - 7Idea claveMantén una ruta comprobada vinculada a su objeto
Un programa auxiliar comprueba el permiso sobre una ruta y después la abre con mayores privilegios. Entre las dos operaciones, otro proceso puede sustituir la entrada de directorio. Una copia de la cadena de la ruta no impide esa sustitución.
Esta es una condición de carrera TOCTTOU. Abre con las credenciales previstas y usa una estrategia de adquisición del objeto que compruebe lo que realmente se abre; usa
O_NOFOLLOWcuando no se quieran enlaces simbólicos. - 8ExplicaciónDeja que los mapeos rijan los accesos posteriores
Una vez concedido un mapeo, las lecturas y escrituras usan la MMU sin una llamada al sistema por cada byte. La MMU comprueba los permisos de escritura, usuario o supervisor y ejecución de la tabla de páginas activa.
Una página de usuario de solo lectura protege su contenido frente a cambios, pero sigue permitiendo que el proceso lo lea. Para mantener los datos en secreto frente a ese proceso, el mapeo también debe denegar las lecturas, por ejemplo, estando ausente o siendo exclusivo del supervisor.
- 9EjemploInterpreta dos fallos de escritura en páginas de solo lectura
El servicio escribe primero en su página de código y después en datos compartidos tras
fork(). Ambas páginas son de solo lectura, por lo que las dos escrituras provocan inicialmente un fallo.Los registros del núcleo distinguen los resultados. Una escritura no autorizada en el código normalmente conduce a
SIGSEGV. Un fallo válido de copia en escritura en los datos conduce a una copia privada y al reinicio de la instrucción. El hardware informa de la infracción; la información que mantiene el núcleo decide si puede repararse. - 10DesafíoUn dispositivo cruza el límite de memoria
El servicio está limitado por las tablas de páginas de la CPU, pero un dispositivo defectuoso escribe directamente en una zona de RAM que no le corresponde. ¿Por qué no lo detuvieron esos mapeos de la CPU?
---reveal---
El DMA no pasa por la MMU de la CPU. El dispositivo necesita un mapeo de IOMMU que restrinja sus propias direcciones. Proteger las lecturas y escrituras de la CPU es un límite; contener las transferencias originadas por dispositivos requiere el límite correspondiente para los dispositivos.
- 11ExplicaciónBloquea la ejecución de bytes inyectados
Un desbordamiento de búfer puede sobrescribir una dirección de retorno guardada. Marcar la pila como NX hace que las instrucciones inyectadas en ella no sean ejecutables, por lo que saltar allí provoca un fallo.
W^X añade la regla de que ninguna página puede permitir escritura y ejecución a la vez. Un compilador en tiempo de ejecución debe escribir el código generado y después cambiar los permisos antes de ejecutarlo. Estas comprobaciones limitan la explotación, pero sigue siendo necesario corregir la escritura original fuera de límites.
- 12ConexiónDificulta la localización del código existente
Un atacante puede reutilizar instrucciones que ya están en bibliotecas ejecutables en lugar de inyectar instrucciones nuevas. ROP enlaza estos pequeños gadgets para realizar un nuevo cálculo.
ASLR dificulta predecir sus direcciones. La filtración de una dirección de una biblioteca conocida revela la base y los desplazamientos conocidos de esa biblioteca, pero no revela una pila aleatorizada de forma independiente. La aleatorización funciona mejor cuando los errores no pueden revelar las direcciones elegidas.
- 13DesafíoContén un proceso de renderizado comprometido
Se ha explotado un proceso de renderizado. Su pila es NX y el atacante ya conoce las direcciones de sus bibliotecas. Una política seccomp sigue bloqueando las llamadas para iniciar programas. ¿Puede la reutilización de código eliminar sin más esa restricción?
---reveal---
No. Reutilizar instrucciones ejecutables no elimina un filtro seccomp instalado. El proceso sigue limitado a las llamadas permitidas, por lo que iniciar otro programa requiere otra forma de eludir el filtro u otro fallo de un límite.
- 14ExplicaciónSepara las comprobaciones de inicio de los registros de eventos
El arranque seguro verifica las firmas antes de ceder el control al siguiente componente de confianza del inicio. El arranque medido registra hashes de los componentes, a menudo mediante un TPM, para que un verificador externo pueda evaluar qué se cargó.
El registro de auditoría tiene un propósito posterior: recoge eventos como inicios de sesión fallidos y comandos con privilegios elevados. Proteger copias fuera del anfitrión ayuda a conservar esas pruebas si un intruso obtiene autoridad para borrar los registros locales.
- 15DesafíoElige la capa de protección que falta
Un servicio root mapea datos sensibles como de solo lectura en un proceso trabajador no confiable y restringe las llamadas al sistema de este. Después, el trabajador lee los datos. ¿Qué decisión los expuso?
---reveal---
El mapeo legible desde el modo usuario expuso el contenido. El acceso de solo lectura protege frente a cambios, y un filtro de llamadas al sistema no bloquea las lecturas ordinarias desde una página permitida. El núcleo debe denegar al trabajador ese mapeo o su permiso de lectura para preservar la confidencialidad.
- 16RepasoLocaliza la comprobación que gobierna la acción
Ante un fallo desconocido, sigue la operación: instrucción de CPU, solicitud al núcleo, acceso a memoria mapeada o DMA de dispositivo. Cada una llega a un punto de control distinto.
Después, pregúntate qué controla ya el atacante. La identidad root, los gadgets ejecutables y un descriptor válido confieren poderes distintos. Un diagnóstico útil identifica la comprobación exacta que falta en lugar de suponer que una defensa eficaz protege todas las vías.
2Sigue el inicio de sesión hasta las credenciales de proceso
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónConvierte un inicio de sesión en una identidad en ejecución
- 2ExplicaciónEstablece los grupos antes de renunciar a root
- 3EjemploSigue un programa auxiliar de contraseñas con setuid
- 4DesafíoActualiza una cuenta durante una sesión
- 5ExplicaciónVuelve a calcular un verificador sin recuperar una contraseña
- 6EjemploMide el trabajo de adivinación para una cuenta
- 7EjemploRepite el trabajo para distintas sales
- 8DesafíoUn bloqueo no alcanza al archivo robado
- 9ExplicaciónDistingue un código de una firma vinculada a un sitio
- 10EjemploElige el denominador antes de calcular
- 11DesafíoDos secretos siguen siendo un solo tipo de factor
- 12ConexiónDeja que el núcleo identifique al otro extremo local
- 13DesafíoIdentifica cuándo deja de importar la solidez del inicio de sesión
- 14RepasoMantén separadas la prueba y los derechos resultantes
3Analiza una decisión de acceso
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónNombra la operación y su objeto
- 2ExplicaciónOrganiza los derechos por objeto o por sujeto
- 3EjemploPasa una concesión limitada a un trabajador
- 4DesafíoCambia los permisos después de conceder un identificador
- 5ExplicaciónSelecciona una clase antes de sumar sus bits
- 6EjemploCrea un archivo con una máscara
- 7EjemploComprueba el acceso con el modo resultante
- 8DesafíoElimina un nombre sin leer sus datos
- 9ConsejoInterpreta el límite de la ACL además de la entrada
- 10ExplicaciónAñade una política que el propietario no puede dejar sin efecto
- 11EjemploSigue la información confidencial entre niveles
- 12DesafíoExplica la lectura denegada a un servicio root
- 13ConexiónCambia un puesto mediante roles
- 14DesafíoSigue una concesión a través de varios controles
- 15RepasoSigue la decisión en un orden útil
4Ejecuta un invitado sin ceder el control del anfitrión
17 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDa a un núcleo su propio equipo aparente
- 2ExplicaciónPlanifica un procesador virtual
- 3DesafíoEvalúa una afirmación sobre consolidación
- 4ExplicaciónEmula solo el estado de control del invitado
- 5EjemploCorrige una instrucción que no provoca una trampa
- 6DesafíoMantén bajo control el anillo 0 del invitado
- 7ExplicaciónDistingue los tres nombres de direcciones
- 8EjemploAplica primero el mapeo del invitado
- 9EjemploAplica después el mapeo del hipervisor
- 10DesafíoTraduce otro byte de la página
- 11ConexiónElige dónde se mantiene el mapeo combinado
- 12Idea claveRecupera memoria con ayuda del invitado
- 13ExplicaciónIntercambia compatibilidad de dispositivos por menos transiciones
- 14DesafíoReduce las salidas frecuentes por dispositivos
- 15ExplicaciónProtege un límite que va más allá de los mapeos de páginas
- 16DesafíoPrepara una máquina en ejecución para otro anfitrión
- 17RepasoMantén el control en cada interfaz virtual
5Construye y evalúa un límite para contenedores
16 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónSepara tres funciones dentro de un contenedor
- 2ExplicaciónDa a los procesos vistas privadas de los recursos
- 3EjemploInicia el primer hijo en un espacio de nombres de PID
- 4EjemploAsigna una identidad interna al anfitrión
- 5DesafíoElige la vista que resuelve un conflicto
- 6ExplicaciónInterpreta un presupuesto estricto de CPU
- 7EjemploDivide el presupuesto de un grupo padre entre sus hijos
- 8DesafíoDeja que un grupo competidor quede inactivo
- 9ExplicaciónContén el crecimiento de memoria y tareas
- 10DesafíoConsulta el límite en la capa que lo aplica
- 11ExplicaciónReduce lo que puede solicitar el proceso
- 12DesafíoUn UID mapeado sigue llegando a un servicio privilegiado
- 13ConexiónElige dónde corresponde un núcleo separado
- 14ExplicaciónReconoce las capas de aislamiento añadidas
- 15DesafíoUbica trabajos no confiables con límites de recursos
- 16RepasoRelaciona cada necesidad con su mecanismo
Ejercicios de Protección del sistema operativo
Set 1: Sigue los límites del hardware y del núcleo10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
LIDT de x86. ¿Qué impide que tome el control de la gestión de interrupciones?Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Pregunta 4 de 10
write() mediante ese descriptor. ¿Qué error de Linux corresponde a la falta de acceso de escritura en el descriptor?Mostrar respuestaOcultar respuesta
write() rechaza su uso con EBADF. EACCES suele describir una denegación de control de acceso al obtenerlo, pero este fallo se refiere al modo de un descriptor ya abierto. EFAULT, en cambio, identificaría una dirección de memoria de usuario incorrecta.Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
fork(). Los registros del núcleo la marcan como de copia en escritura. ¿Qué respuesta conserva el comportamiento normal del programa?Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
fork(). Las escrituras en ambas provocan fallos. Un controlador también necesita DMA hacia un búfer separado. ¿Qué respuesta conserva los límites previstos?Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Set 2: Sigue las identidades y la autenticación10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Decide quién puede usar un recurso10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
metrics.bin. Después, el propietario elimina el permiso de escritura del modo del archivo. ¿Qué ocurre con las escrituras ordinarias mediante ese descriptor?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Sigue un invitado a través del hardware virtual10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
0x53D0?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Interpreta las vistas y los límites de los contenedores10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
0 220000 8000. ¿Qué UID del anfitrión corresponde al UID interno 1750?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
unshare(CLONE_NEWPID), crea allí su primer proceso hijo y permanece activo fuera. Ese hijo crea un proceso de registro y después termina. ¿Qué ocurre con el proceso de registro y el supervisor?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
120000 100000 en cpu.max. ¿Qué asignación de CPU representa?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
pids.max de 30. El grupo hijo A tiene cuatro procesos con siete hilos en total cada uno y un límite local de 40; el grupo hermano B contiene dos procesos de un solo hilo. ¿Puede A crear otro hilo mientras todas las tareas existentes siguen activas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 6: Diagnostica fallos entre capas de aislamiento10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
access() y después la abre con todos sus privilegios. Un atacante puede sustituir la entrada nombrada. ¿Qué fallo persiste?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
0x9B20 y está el marco resultante dentro del mapeo del dispositivo?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acceso directo a memoria (DMA)
Aislamiento de las tablas de páginas del núcleo (KPTI)
Aleatorización de la distribución del espacio de direcciones (ASLR)
Anillo de protección
Arranque medido
Arranque seguro
Asignación directa de dispositivos (device passthrough)
Ataque de diccionario
Ataque de fuerza bruta
Ataque sin conexión
Autenticación (autentificación)
Autenticación multifactor
Autenticador de clave pública
Autorización
B
Base de computación de confianza (TCB)
Bit de no ejecución (NX)
Bit de permanencia (sticky bit)
C
Capacidad de Linux
CAP_NET_BIND_SERVICE permite asociarse a puertos de número bajo sin conceder todos los poderes de root.Capacidad de objeto
Clave de acceso (passkey)
Compartición de páginas
Computación confidencial
Condición de carrera entre comprobación y uso (TOCTTOU)
Contenedor
Contenedor sin privilegios de administrador en el anfitrión (rootless)
Contraseña de un solo uso basada en el tiempo (TOTP)
Control de acceso basado en roles
Control de acceso discrecional
Control de acceso obligatorio
Controlador de grupos de control
Correspondencia de identificadores de usuario
Coste del cálculo del hash de contraseña
CPU virtual
cpu.max
cpu.max de 75000 100000 permite como máximo tres cuartos del tiempo de una CPU por periodo.cpu.weight
cpu.weight favorece a un grupo ocupado frente a otros grupos del mismo nivel que compiten, pero no puede anular su cuota separada.D
Desbordamiento de búfer
Descriptor de archivo (descriptor de fichero)
Dirección física del invitado
Directorio con setgid
Dominio de SELinux
E
EFAULT
read() con un destino en la memoria del núcleo puede devolver EFAULT en lugar de sobrescribir el núcleo.Ejecución directa limitada
Emulación de dispositivos
Entidad de seguridad
Entrada de control de acceso (ACE)
Entrada en la máquina virtual (VM entry)
Escape de máquina virtual
Espacio de nombres (namespace)
Espacio de nombres de montajes
Espacio de nombres de PID
Espacio de nombres de red
Espacio de nombres de usuarios
F
Fallo de página
G
Grupo de control (cgroup)
gVisor
H
Hash de contraseña
Hiperllamada
Hipervisor
I
Identificador de usuario efectivo (UID efectivo)
Instantánea (snapshot)
Instrucción privilegiada
HLT en x86 provoca un fallo de protección.Instrucción sensible
Intercepción y emulación (trap-and-emulate)
Interrupción del temporizador
K
Kata Containers
L
Lista de control de acceso (ACL)
Lista de control de acceso discrecional (DACL)
Llamada al sistema
open() realiza una llamada al sistema para que el núcleo pueda comprobar el acceso antes de devolver un descriptor de archivo.M
Máquina virtual
Máscara de ACL POSIX
Máscara de creación de archivos (umask)
Matriz de acceso
Mecanismo setuid
memory.high
memory.high mientras aumenta la presión para recuperar memoria, a diferencia de una asignación fija simple.memory.max
memory.max puede forzar la terminación de una tarea elegible del grupo.Micromáquina virtual (microVM)
Migración en vivo
Modelo de Bell–LaPadula
Modo de permisos en octal
Modo núcleo
Modo usuario
Módulos de autenticación conectables (PAM)
Monitor de referencia
N
Nivel de excepción
no_new_privs
no_new_privs establecido, un proceso de contenedor no puede obtener autoridad simplemente iniciando un ejecutable setuid.P
Paginación anidada
Par de interfaces Ethernet virtuales (veth)
Paravirtualización
Perfil de AppArmor
pids.max
pids.max incluso cuando su número de procesos distintos parece pequeño.Plantilla biométrica
Política de escritura o ejecución excluyentes (W^X)
Prevención de acceso en modo supervisor a páginas de usuario (SMAP)
Prevención de ejecución en modo supervisor de páginas de usuario (SMEP)
Programación orientada a retornos (ROP)
R
Recorrido de directorios
Recuperación de memoria mediante un controlador globo (ballooning)
Registro de auditoría
Revocación de capacidades
S
Sal criptográfica (salt)
Salida de la máquina virtual (VM exit)
HLT del invitado permite que el hipervisor deje de planificar la vCPU inactiva y ejecute otra carga de trabajo.Seccomp
Sistema invitado
Sobreasignación de memoria
Socket del entorno de ejecución de contenedores
T
Tabla de páginas sombra
Tasa de falsas aceptaciones
Tasa de falsos rechazos
Token de acceso
Traducción binaria
U
Unidad de gestión de memoria (MMU)
Unidad de gestión de memoria de entrada/salida (IOMMU)
V
Virtio
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.