Protección del sistema operativo y máquinas virtuales

Aprende cómo un sistema operativo se protege a sí mismo y a sus usuarios. Sigue cómo los niveles de privilegio del procesador, las llamadas al sistema y los permisos de las tablas de páginas mantienen separados los programas; cómo el sistema comprueba quién eres y almacena las contraseñas de forma segura; y cómo las listas de control de acceso, las capacidades, los permisos de Unix y Windows y las políticas obligatorias deciden quién puede usar cada recurso. Después, descubre cómo los hipervisores ejecutan sistemas operativos completos en paralelo en máquinas virtuales y cómo los contenedores aíslan aplicaciones mediante espacios de nombres, grupos de control y límites de privilegios, para que puedas elegir el límite de aislamiento adecuado para una carga de trabajo.

IntermedioUnidad 9 de 9 del curso Curso de Sistemas operativos

Lo que aprenderás

  1. 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úcleo
      Explica 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 sistema
      Sigue 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 dispositivos
      Usa 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úcleo
      Explica 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.
  2. 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 procesos
      Sigue 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 segura
      Explica 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 eres
      Compara 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.
  3. 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 capacidades
      Almacena 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 Windows
      Interpreta 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 roles
      Distingue 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.
  4. 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 hipervisores
      Define 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 procesador
      Explica 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 memoria
      Traduce 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 virtuales
      Compara los dispositivos emulados, paravirtuales y asignados directamente, y explica las ventajas y los límites del aislamiento entre máquinas virtuales.
  5. 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 nombres
      Explica 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 control
      Organiza 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 virtuales
      Reduce 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.

Guía de estudio de Protección del sistema operativo

5 capítulos

1

Explica 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
ArquitecturaAplicaciónNúcleoOtros niveles
x86Anillo 3Anillo 0Existen los anillos 1 y 2, pero los núcleos ordinarios de Linux y Windows no los usan
ARMv8-AEL0EL1EL2 da soporte a un hipervisor; EL3 da soporte al monitor de firmware seguro
RISC-VModo UModo SEl 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:

  1. Entra por su punto de entrada registrado y guarda los registros de usuario.
  2. Selecciona el manejador de la tabla de llamadas al sistema y rechaza los números desconocidos.
  3. Lee la identidad y las credenciales de quien hace la llamada a partir del proceso actual.
  4. Comprueba los argumentos, los derechos de acceso y los objetos implicados.
  5. Realiza la operación o devuelve un error.
  6. 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 228 posiciones, una suposición a ciegas tiene una probabilidad de éxito de 1 entre 268 435 456. Con solo 28=256 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.
2

Autentica 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:

  1. Un servicio de inicio de sesión privilegiado, como login, sshd o un gestor de inicio de sesión gráfico, recibe las credenciales.
  2. PAM, módulos de autenticación conectables, las comprueba mediante los módulos de autenticación configurados.
  3. El servicio establece los grupos suplementarios y el GID del usuario y después cambia el UID para renunciar a root.
  4. Inicia el intérprete de comandos. Los procesos hijos heredan estas credenciales mediante fork() y normalmente las conservan tras execve().

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 268=208 827 064 576 cadenas. A 1010 intentos por segundo, agotar el espacio tarda unos 21 segundos. A 104 intentos por segundo, tarda unos 2,09×107 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 9,5×1016 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 106 contraseñas candidatas, comprobadas a 104 hashes por segundo. Sin sales, calcular la lista una vez tarda 100 segundos y sirve para todas las cuentas. Las sales únicas requieren 109 cálculos, unos 105 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.

TasaPoblación usada como denominadorError contabilizado
Tasa de falsas aceptaciones (FAR)Intentos de impostoresImpostores aceptados
Tasa de falsos rechazos (FRR)Intentos legítimosUsuarios 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.
3

Controla 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.

PreguntaACLLista de capacidades
¿Quién puede usar este objeto?Examinar su listaBuscar a todos los poseedores
¿Qué puede usar este sujeto?Examinar muchos objetosExaminar sus tokens
¿Cómo se delegan derechos limitados?Añadir o cambiar entradasPasar tokens seleccionados sin añadir derechos
¿Qué dificulta la revocación?Pueden permanecer identificadores ya concedidosPueden 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:

UmaskArchivo nuevoDirectorio nuevo
022644755
027640750
000666777

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.
4

Ejecuta 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ñoDónde se ejecuta el hipervisorEjemplos
Tipo 1, directamente sobre el hardwareControla directamente el hardwareESXi, Xen, Hyper-V
Tipo 2, alojadoSe ejecuta como una aplicación que usa un sistema operativo anfitriónVirtualBox, 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:

EnfoqueCómo intercepta la operaciónCambio en el invitado
Traducción binariaReescribe 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ónSustituye las operaciones privilegiadas por hiperllamadas explícitasNúcleo invitado modificado
Asistencia de hardwareProporciona funcionamiento separado para el invitado y salidas controladas de la VMPuede 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:

  1. Divídela en la página 2 y el desplazamiento 0xABC.
  2. Sustituye la página 2 por el marco 7 del invitado, lo que da 0x7ABC.
  3. Sustituye el marco 7 del invitado por el marco 42 de la máquina, 0x2A en hexadecimal.
  4. 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
EnfoqueInterfaz del invitadoPrincipal compensación
EmulaciónUn modelo de un dispositivo físico conocidoFuncionan los controladores existentes, pero las operaciones sobre registros requieren trabajo de software
Dispositivo paravirtualUn controlador preparado para la virtualización y colas compartidasAgrupación eficiente, pero el invitado necesita el controlador
Asignación directaUn dispositivo físico o una función virtual asignadosAcceso 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.
5

Aí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 nombresQué separa
MontajesSistemas de archivos montados y árbol de archivos visible
PIDNúmeros de proceso y visibilidad de procesos
RedInterfaces, direcciones, rutas, puertos y reglas de cortafuegos
UTSNombre de anfitrión y nombre de dominio NIS
IPCObjetos IPC de System V y colas de mensajes POSIX
UsuariosCorrespondencias de identificadores de usuario y grupo y capacidades de alcance limitado
CgroupParte visible de la jerarquía de cgroups
TiempoDesplazamientos 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_ADMIN y CAP_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_privs para 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
NecesidadLímite adecuadoMotivo
Servicios Linux de un equipo que se despliegan con frecuenciaContenedores restringidosArranques rápidos y poca sobrecarga en un solo núcleo
Código de clientes que no confían entre síVM o micromáquinas virtualesLos núcleos invitados separados reducen la exposición al núcleo compartido
Una aplicación exclusiva de Windows en anfitriones LinuxVMLa 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

5 Lecciones Interactivas

1

Sigue una solicitud a través del límite del núcleo

16 pasos
Sigue la ejecución, las comprobaciones de argumentos, los permisos de memoria y las defensas contra exploits a través de un pequeño servicio.
  1. 1
    Introducció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.

  2. 2
    Explicació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.

  3. 3
    Desafí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.

  4. 4
    Explicació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.

  5. 5
    EjemploExamina 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.

  6. 6
    Desafí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ó con O_RDONLY. ¿Qué debe comprobar el núcleo y debe terminar el proceso?

    ---reveal---

    Comprueba el acceso concedido al descriptor y rechaza la escritura con EBADF en 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.

  7. 7
    Idea 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_NOFOLLOW cuando no se quieran enlaces simbólicos.

  8. 8
    Explicació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.

  9. 9
    EjemploInterpreta 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.

  10. 10
    Desafí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.

  11. 11
    Explicació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.

  12. 12
    Conexió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.

  13. 13
    Desafí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.

  14. 14
    Explicació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.

  15. 15
    Desafí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.

  16. 16
    RepasoLocaliza 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.

2

Sigue el inicio de sesión hasta las credenciales de proceso

14 pasos
Relaciona la verificación de contraseñas y otros factores con la identidad que realmente lleva un programa en ejecución.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónConvierte un inicio de sesión en una identidad en ejecución
  2. 2
    ExplicaciónEstablece los grupos antes de renunciar a root
  3. 3
    EjemploSigue un programa auxiliar de contraseñas con setuid
  4. 4
    DesafíoActualiza una cuenta durante una sesión
  5. 5
    ExplicaciónVuelve a calcular un verificador sin recuperar una contraseña
  6. 6
    EjemploMide el trabajo de adivinación para una cuenta
  7. 7
    EjemploRepite el trabajo para distintas sales
  8. 8
    DesafíoUn bloqueo no alcanza al archivo robado
  9. 9
    ExplicaciónDistingue un código de una firma vinculada a un sitio
  10. 10
    EjemploElige el denominador antes de calcular
  11. 11
    DesafíoDos secretos siguen siendo un solo tipo de factor
  12. 12
    ConexiónDeja que el núcleo identifique al otro extremo local
  13. 13
    DesafíoIdentifica cuándo deja de importar la solidez del inicio de sesión
  14. 14
    RepasoMantén separadas la prueba y los derechos resultantes
3

Analiza una decisión de acceso

15 pasos
Usa las credenciales, las operaciones de directorio y la política conjuntamente para explicar un resultado de acceso.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónNombra la operación y su objeto
  2. 2
    ExplicaciónOrganiza los derechos por objeto o por sujeto
  3. 3
    EjemploPasa una concesión limitada a un trabajador
  4. 4
    DesafíoCambia los permisos después de conceder un identificador
  5. 5
    ExplicaciónSelecciona una clase antes de sumar sus bits
  6. 6
    EjemploCrea un archivo con una máscara
  7. 7
    EjemploComprueba el acceso con el modo resultante
  8. 8
    DesafíoElimina un nombre sin leer sus datos
  9. 9
    ConsejoInterpreta el límite de la ACL además de la entrada
  10. 10
    ExplicaciónAñade una política que el propietario no puede dejar sin efecto
  11. 11
    EjemploSigue la información confidencial entre niveles
  12. 12
    DesafíoExplica la lectura denegada a un servicio root
  13. 13
    ConexiónCambia un puesto mediante roles
  14. 14
    DesafíoSigue una concesión a través de varios controles
  15. 15
    RepasoSigue la decisión en un orden útil
4

Ejecuta un invitado sin ceder el control del anfitrión

17 pasos
Sigue la interceptación de CPU, la traducción de páginas y la gestión de dispositivos a través del límite de una máquina virtual.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDa a un núcleo su propio equipo aparente
  2. 2
    ExplicaciónPlanifica un procesador virtual
  3. 3
    DesafíoEvalúa una afirmación sobre consolidación
  4. 4
    ExplicaciónEmula solo el estado de control del invitado
  5. 5
    EjemploCorrige una instrucción que no provoca una trampa
  6. 6
    DesafíoMantén bajo control el anillo 0 del invitado
  7. 7
    ExplicaciónDistingue los tres nombres de direcciones
  8. 8
    EjemploAplica primero el mapeo del invitado
  9. 9
    EjemploAplica después el mapeo del hipervisor
  10. 10
    DesafíoTraduce otro byte de la página
  11. 11
    ConexiónElige dónde se mantiene el mapeo combinado
  12. 12
    Idea claveRecupera memoria con ayuda del invitado
  13. 13
    ExplicaciónIntercambia compatibilidad de dispositivos por menos transiciones
  14. 14
    DesafíoReduce las salidas frecuentes por dispositivos
  15. 15
    ExplicaciónProtege un límite que va más allá de los mapeos de páginas
  16. 16
    DesafíoPrepara una máquina en ejecución para otro anfitrión
  17. 17
    RepasoMantén el control en cada interfaz virtual
5

Construye y evalúa un límite para contenedores

16 pasos
Combina vistas de espacios de nombres, presupuestos de recursos y restricciones de privilegios, y después elige una capa de aislamiento adecuada.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónSepara tres funciones dentro de un contenedor
  2. 2
    ExplicaciónDa a los procesos vistas privadas de los recursos
  3. 3
    EjemploInicia el primer hijo en un espacio de nombres de PID
  4. 4
    EjemploAsigna una identidad interna al anfitrión
  5. 5
    DesafíoElige la vista que resuelve un conflicto
  6. 6
    ExplicaciónInterpreta un presupuesto estricto de CPU
  7. 7
    EjemploDivide el presupuesto de un grupo padre entre sus hijos
  8. 8
    DesafíoDeja que un grupo competidor quede inactivo
  9. 9
    ExplicaciónContén el crecimiento de memoria y tareas
  10. 10
    DesafíoConsulta el límite en la capa que lo aplica
  11. 11
    ExplicaciónReduce lo que puede solicitar el proceso
  12. 12
    DesafíoUn UID mapeado sigue llegando a un servicio privilegiado
  13. 13
    ConexiónElige dónde corresponde un núcleo separado
  14. 14
    ExplicaciónReconoce las capas de aislamiento añadidas
  15. 15
    DesafíoUbica trabajos no confiables con límites de recursos
  16. 16
    RepasoRelaciona cada necesidad con su mecanismo

Ejercicios de Protección del sistema operativo

60 Preguntas de Práctica en 6 sets

Set 1: Sigue los límites del hardware y del núcleo10 Preguntas de Práctica

Pregunta 1 de 10

Una calculadora propiedad de root está sumando dos enteros en su función principal. ¿En qué modo de CPU se ejecuta normalmente este código de aplicación?
  1. En modo núcleo.
  2. En modo VMX raíz.
  3. En modo usuario.
  4. En el modo raíz.
Mostrar respuestaOcultar respuesta
Respuesta: C
Root es una credencial usada en las comprobaciones de acceso del núcleo; no cambia el modo de ejecución del código ordinario de una aplicación. La suma se ejecuta directamente en modo usuario. Entrar en modo núcleo requiere un evento controlado, como una llamada al sistema, un fallo o una interrupción, incluso para una aplicación propiedad de root.

Pregunta 2 de 10

Un proceso de usuario intenta instalar una tabla de interrupciones de sustitución con LIDT de x86. ¿Qué impide que tome el control de la gestión de interrupciones?
  1. El planificador rechaza su siguiente intervalo de tiempo.
  2. La CPU provoca una trampa por la instrucción privilegiada.
  3. La biblioteca C reescribe la dirección de la tabla.
  4. La caché de páginas descarta el contenido de su tabla.
Mostrar respuestaOcultar respuesta
Respuesta: B
Instalar la tabla de interrupciones real es una operación privilegiada, por lo que el procesador provoca una trampa cuando lo intenta código en modo usuario. El manejador registrado del núcleo recibe el control antes de que pueda producirse la sustitución solicitada. Una comprobación de biblioteca no bastaría porque el código máquina puede ejecutarse sin pasar por esa biblioteca.

Pregunta 3 de 10

Un proceso salta repetidamente a su propio código y no realiza llamadas al sistema. ¿Cómo puede otro proceso listo recibir tiempo de CPU?
  1. Su siguiente llamada al sistema selecciona automáticamente el otro proceso.
  2. Los saltos en modo usuario pierden privilegios tras suficientes repeticiones.
  3. La MMU cuenta los saltos y finalmente invalida la página de código.
  4. Una interrupción del temporizador entra en el núcleo, que puede volver a planificar.
Mostrar respuestaOcultar respuesta
Respuesta: D
El temporizador de hardware proporciona al núcleo una vía de entrada independiente de las llamadas voluntarias al sistema. Su interrupción permite que el planificador seleccione otro proceso listo. Esperar a que el programa en bucle llame al núcleo fallaría en este caso, y el código de usuario no puede desactivar el mecanismo privilegiado del temporizador para impedir la expropiación.

Pregunta 4 de 10

Un programa abre un archivo en modo de solo lectura y después llama a write() mediante ese descriptor. ¿Qué error de Linux corresponde a la falta de acceso de escritura en el descriptor?
  1. EBADF.
  2. EFAULT.
  3. EACCES.
  4. EAGAIN.
Mostrar respuestaOcultar respuesta
Respuesta: A
El descriptor se abrió sin acceso de escritura, por lo que 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

Un programa auxiliar de exportación privilegiado comprueba una ruta, hace una pausa y después la abre. Otro proceso sustituye la ruta durante la pausa. ¿Qué cambio aborda la condición de carrera?
  1. Comprobar la ruta dos veces antes de abrir con todos los privilegios.
  2. Copiar el texto de la ruta y mantener la comprobación separada original.
  3. Aumentar la demora de inicio de sesión antes de iniciar el programa auxiliar.
  4. Abrir el objeto real con las credenciales reducidas previstas.
Mostrar respuestaOcultar respuesta
Respuesta: D
La decisión de permiso debe cubrir el objeto que realmente se abre con las credenciales previstas. Repetir la comprobación anterior sigue dejando una ventana para la sustitución antes de la apertura privilegiada. Mantener una copia sin cambios de la cadena de la ruta tampoco mantiene sin cambios el objeto del sistema de archivos situado detrás de ese nombre.

Pregunta 6 de 10

Un manejador del núcleo confía en un nombre de usuario proporcionado por quien hace la llamada, valida el primer byte de un búfer y después copia en él una longitud proporcionada por quien hace la llamada. ¿Qué corrección completa se necesita?
  1. Usar las credenciales del núcleo y validar solo la primera página del destino.
  2. Usar las credenciales del núcleo y validar todo el rango del destino.
  3. Confiar en el nombre de usuario tras comprobar todo el rango del destino.
  4. Mantener la comprobación del nombre y copiar con una instrucción en modo núcleo.
Mostrar respuestaOcultar respuesta
Respuesta: B
Hay dos errores de confianza independientes: el cliente proporciona la identidad que declara y su rango de memoria. El manejador debe usar credenciales autenticadas que mantiene el núcleo y validar todo el destino determinado por la dirección y la longitud. Comprobar solo la primera página puede dejar bytes posteriores fuera del rango permitido.

Pregunta 7 de 10

Una escritura en una página de datos de solo lectura provoca un fallo después de fork(). Los registros del núcleo la marcan como de copia en escritura. ¿Qué respuesta conserva el comportamiento normal del programa?
  1. Terminar el proceso porque toda escritura en una página de solo lectura es fatal.
  2. Permitir la escritura en la página física compartida para ambos procesos.
  3. Crear una copia privada que permita escritura y reintentar la operación.
  4. Devolver EACCES como resultado de la instrucción de escritura.
Mostrar respuestaOcultar respuesta
Respuesta: C
El estado de solo lectura es intencionado y forma parte de la gestión de copia en escritura, por lo que el núcleo puede copiar la página, actualizar el mapeo de este proceso y volver a intentarlo. Permitir la escritura en la página compartida original haría que la escritura afectara al otro proceso. Un fallo por sí solo no decide si la recuperación es posible; lo deciden los registros del mapeo.

Pregunta 8 de 10

Un proceso tiene una página de código ejecutable de solo lectura que no es de copia en escritura y una página de datos de solo lectura marcada para copia en escritura y compartida después de 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?
  1. Mantener protegido el código, copiar de forma privada los datos escritos y limitar el DMA con una IOMMU.
  2. Mantener protegido el código, copiar de forma privada los datos escritos y limitar el DMA solo con la MMU de la CPU.
  3. Mantener protegido el código, permitir la escritura en los datos compartidos originales y limitar el DMA con una IOMMU.
  4. Permitir escribir en el código tras el fallo, copiar los datos de forma privada y limitar el DMA con una IOMMU.
Mostrar respuestaOcultar respuesta
Respuesta: A
La escritura en el código no es válida, mientras que el fallo en los datos debe crear una copia privada que permita escritura para que los datos del otro proceso no cambien. El dispositivo necesita una IOMMU porque el DMA no pasa por la MMU de la CPU. Permitir la escritura en todas las páginas que provocan fallos eliminaría la protección prevista del código y gestionaría incorrectamente los datos compartidos.

Pregunta 9 de 10

Un atacante redirige la ejecución a bytes inyectados en una página de pila marcada como NX. ¿Qué protección inmediata se aplica?
  1. Los bytes inyectados se borran primero.
  2. La búsqueda de instrucciones en esa página provoca un fallo.
  3. La página se mueve a un marco físico aleatorio.
  4. El UID efectivo desciende al de un usuario ordinario.
Mostrar respuestaOcultar respuesta
Respuesta: B
NX prohíbe la ejecución desde la página marcada, por lo que el intento de buscar instrucciones provoca un fallo. No borra los bytes ni corrige el desbordamiento original. ASLR aborda una cuestión diferente al dificultar la predicción de direcciones; no es el permiso de página que bloquea este salto concreto.

Pregunta 10 de 10

Una filtración revela una dirección dentro de una biblioteca compartida conocida. La pila se aleatoriza de forma independiente. ¿Qué puede deducir un atacante de la filtración?
  1. La base de la biblioteca y los desplazamientos conocidos de gadgets, pero no la base de la pila.
  2. Tanto la base de la biblioteca como la base independiente de la pila.
  3. Solo el byte filtrado, porque los desplazamientos cambian dentro de la biblioteca.
  4. La base de la pila, pero ninguna otra dirección dentro de la biblioteca.
Mostrar respuestaOcultar respuesta
Respuesta: A
Para una distribución conocida de la biblioteca, restar el desplazamiento del símbolo filtrado revela la base y, por tanto, otros desplazamientos conocidos de esa biblioteca. Ese cálculo no resuelve la aleatorización independiente de la pila. Tratar una filtración de dirección como una derrota completa de todas las regiones aleatorizadas supone una relación que la pregunta no proporciona.
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

Dos nombres de cuenta locales tienen el UID 2400. ¿Cómo distingue el núcleo Unix su identidad como propietario de archivos?
  1. Compara la escritura de sus nombres de inicio de sesión.
  2. Da a cada uno un UID nuevo al iniciar el intérprete.
  3. Compara sus algoritmos de hash de contraseñas.
  4. Trata ambos como la misma identidad numérica de usuario.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un programa auxiliar de inicio de sesión cambia permanentemente del UID 0 al UID 2400 antes de sustituir sus grupos suplementarios. ¿Por qué es inseguro este orden?
  1. Puede perder la autoridad necesaria para sustituir los grupos privilegiados.
  2. Cambia todos los archivos existentes al grupo principal del usuario.
  3. Hace que el UID real del usuario se convierta en el identificador del grupo anterior.
  4. Concede al usuario permiso para establecer cualquier grupo después.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Se añade a Nora al grupo de archivo mientras su terminal permanece abierta. ¿Por qué un comando iniciado desde esa terminal aún puede fallar una comprobación del grupo de archivo?
  1. El propietario del archivo debe cambiar primero el nombre del grupo.
  2. Hereda la antigua lista de grupos de proceso de la terminal.
  3. Solo el UID real puede registrar un grupo suplementario.
  4. Los nuevos procesos hijos siempre descartan los grupos suplementarios.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una base de datos de contraseñas robada contiene una sal aleatoria diferente junto a cada hash. ¿Deben mantenerse ocultas las sales para que funcione su protección principal?
  1. Sí; son las claves para descifrar las contraseñas.
  2. Sí; una sal pública hace reversible cada hash almacenado.
  3. No; impiden reutilizar el trabajo de cálculo de hashes incluso cuando son públicas.
  4. No; la propia sal sustituye el secreto de la contraseña del usuario.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un espacio de prueba tiene 81 000 000 de contraseñas igualmente posibles. Un atacante sin conexión comprueba 3000 por segundo. ¿Cuánto tarda en agotar el espacio?
  1. 13 500 segundos.
  2. 27 000 segundos.
  3. 243 000 segundos.
  4. 270 000 segundos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un servicio añade una sal pública única por cuenta y un bloqueo en línea, pero conserva un único hash rápido. Se roba su base de datos de verificadores. ¿Qué protección sigue faltando?
  1. Un esquema de cálculo de hashes de contraseñas costoso para cada intento sin conexión.
  2. Un segundo bloqueo en línea aplicado a la base de datos robada.
  3. Un cifrado que permita al servicio recuperar contraseñas olvidadas.
  4. Una sal común oculta en el archivo público de nombres de cuenta.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un servicio que solo usa contraseñas sigue NIST SP 800-63B-4. ¿Qué política se ajusta a su guía sobre longitud mínima y cambios periódicos?
  1. Al menos 8 caracteres, con un cambio obligatorio cada mes.
  2. Al menos 12 caracteres, con un símbolo obligatorio en cada contraseña.
  3. Al menos 15 caracteres, con un cambio obligatorio cuando haya indicios de compromiso.
  4. Al menos 15 caracteres, con un cambio obligatorio en cada inicio de sesión correcto.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un inicio de sesión solicita una contraseña y después un PIN que el usuario recuerda. ¿Cuántos tipos de factores usa?
  1. Dos: más posesión.
  2. Uno: identidad.
  3. Dos: uno por pantalla.
  4. Uno: conocimiento.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

En una prueba biométrica, tienen éxito 6 de 30 000 intentos de impostores y fallan 18 de 900 intentos legítimos. ¿Cuáles son la FAR y la FRR?
  1. FAR 0,02 %; FRR 2 %.
  2. FAR 2 %; FRR 0,02 %.
  3. FAR 0,02 %; FRR 0,06 %.
  4. FAR 0,2 %; FRR 20 %.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un atacante roba la base de datos de verificadores de un servicio y controla un sitio falso que antes retransmitía códigos TOTP recientes. El servicio sustituye ese inicio de sesión por FIDO2. ¿Pueden las claves públicas almacenadas o las respuestas obtenidas para el sitio falso proporcionar una firma válida para el sitio real?
  1. Las claves públicas pueden firmar nuevos desafíos, pero las respuestas del sitio falso no son válidas para el real.
  2. Ninguna basta: las claves públicas no pueden firmar y las respuestas del sitio falso no son válidas para el real.
  3. Las claves públicas no pueden firmar, pero una respuesta reciente del sitio falso puede retransmitirse como un código TOTP.
  4. Ambas bastan mientras un desafío sea reciente, porque la aceptación depende del tiempo y no de la identidad del sitio.
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

Un administrador quiere revisar a todas las personas autorizadas a leer un objeto de una base de datos. ¿Qué representación agrupa directamente esos derechos?
  1. La lista de capacidades de cada usuario.
  2. La ACL del objeto de la base de datos.
  3. La cola de ejecución del planificador.
  4. Las tablas de páginas de cada proceso.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un trabajador hereda un descriptor que permite escritura para metrics.bin. Después, el propietario elimina el permiso de escritura del modo del archivo. ¿Qué ocurre con las escrituras ordinarias mediante ese descriptor?
  1. Pueden continuar con el acceso concedido al abrir el archivo.
  2. Fallan en cuanto la siguiente comprobación del modo detecta que no hay bit de escritura.
  3. Continúan solo si el trabajador se convierte en propietario del archivo.
  4. Vuelven a abrir la ruta automáticamente con el UID del trabajador.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Un supervisor debe dar a un trabajador acceso de lectura a un archivo de entrada ya abierto, sin permitir la búsqueda por rutas, y conservar todos sus demás derechos. ¿Qué diseño se ajusta más directamente?
  1. Compartir las credenciales completas de la cuenta del supervisor.
  2. Añadir al trabajador al grupo de los directorios de entrada.
  3. Pasar al trabajador una capacidad de objeto de solo lectura.
  4. Conceder un privilegio de Linux que eluda las comprobaciones de acceso a archivos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Qué derechos concede el modo Unix 652 al grupo propietario?
  1. Lectura y escritura.
  2. Solo escritura.
  3. Solo lectura.
  4. Lectura y ejecución.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Mina es propietaria de un archivo con modo 046. Sin tener en cuenta las ACL ni las excepciones por privilegios, ¿puede leerlo mediante la comprobación del propietario?
  1. Sí, porque la clase de grupo concede lectura.
  2. No, porque la clase de propietario no tiene derechos.
  3. Sí, porque la clase de los demás concede lectura.
  4. Sí, porque se combinan las tres clases.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un programa solicita el modo 666 para un archivo nuevo con umask 037. ¿Qué modo resulta?
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Omar tiene derechos ordinarios de escritura y ejecución en el directorio de Leena, que tiene el bit de permanencia activado. Un archivo con modo 000 dentro también pertenece a Leena. Omar no es propietario de ninguno de los dos ni tiene privilegios que eludan las comprobaciones. ¿Puede leerlo o eliminarlo ahora, y podría eliminarlo si solo se quitara el bit de permanencia?
  1. No puede leerlo ahora, pero ya puede eliminarlo y podrá seguir haciéndolo si se quita el bit.
  2. Puede leerlo y eliminarlo ahora porque el directorio concede escritura y ejecución.
  3. No puede hacer ninguna de las dos cosas ahora, y el modo 000 sigue impidiendo la eliminación tras quitar el bit.
  4. No puede leerlo ni eliminarlo ahora; podrá eliminarlo después de quitar el bit de permanencia.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Las comprobaciones Unix de un servicio root permiten una lectura, pero SELinux en modo de aplicación deniega al dominio acceso al tipo del archivo. ¿Cuál es el resultado?
  1. El UID 0 anula la denegación de SELinux.
  2. La comprobación DAC anterior permite la lectura.
  3. La política obligatoria deniega la lectura.
  4. La lectura se registra, pero aun así se permite.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un proceso de nivel Secreto necesita enviar notas Secretas a un almacenamiento Confidencial. Puede escribir directamente o pedir a un programa auxiliar de nivel Confidencial que lea su búfer etiquetado como Secreto y después escriba en el almacenamiento. Según Bell–LaPadula, ¿qué ocurre con estas dos vías?
  1. Solo falla la escritura directa; el programa auxiliar puede leer hacia arriba antes de escribir en su propio nivel.
  2. Solo falla la vía del programa auxiliar; el proceso Secreto puede escribir en cualquier destino que pueda leer.
  3. Ambas fallan: la escritura directa es hacia abajo y la lectura del programa auxiliar es hacia arriba.
  4. Ambas tienen éxito porque el programa auxiliar de nivel Confidencial puede escribir en el destino final.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una empresa gestiona 72 empleados con 24 permisos cada uno. Seis roles de trabajo sin solapamiento contienen 24 permisos cada uno; cada persona tiene un rol. ¿Cuántas asignaciones necesita este diseño RBAC y por qué?
  1. 216: 72 vínculos de usuario a rol más 144 vínculos de permiso a rol.
  2. 144: solo cuentan los seis conjuntos de vínculos de permiso a rol.
  3. 1728: cada usuario debe seguir recibiendo directamente todos los permisos.
  4. 288: 72 vínculos de usuario a rol más 216 vínculos de permiso a rol.
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

Una aplicación de virtualización depende de un sistema operativo anfitrión ordinario que controla el hardware. ¿De qué diseño de hipervisor se trata?
  1. Tipo 1, nativo.
  2. Basado en contenedores.
  3. Tipo 2, alojado.
  4. Basado en asignación directa.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Ocho servidores de igual tamaño usan cada uno una media del 7 % de CPU. ¿Qué puede indicar su media combinada a quien planifica la consolidación?
  1. Su media es del 56 %, por lo que se garantiza que un anfitrión cubrirá toda la demanda futura.
  2. Su media es del 7 %, porque los invitados simultáneos comparten los mismos núcleos físicos.
  3. Su media es del 87,5 %, por lo que no hace falta comprobar la demanda de memoria y dispositivos.
  4. Su media es del 56 % de una máquina equivalente, pero los picos siguen necesitando margen.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Con Intel VT-x, un núcleo invitado se ejecuta en el anillo 0 en modo VMX no raíz. ¿Le da ese número de anillo la autoridad del hipervisor sobre el hardware?
  1. No; el modo VMX raíz sigue siendo una capa de control separada.
  2. Sí; toda instrucción del anillo 0 pertenece al núcleo anfitrión.
  3. Sí; el modo no raíz solo cambia el UID del invitado.
  4. No; el anillo 0 es el anillo de protección x86 menos privilegiado.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una instrucción de un invitado clásico con privilegios reducidos deja silenciosamente sin cambios un indicador de interrupciones en lugar de provocar una trampa. ¿Por qué no basta la intercepción y emulación sencilla?
  1. La instrucción es demasiado costosa de calcular para ejecutarse directamente.
  2. El hipervisor no recibe ningún evento para emular el cambio previsto por el invitado.
  3. El invitado debe traducir primero el indicador mediante tablas de páginas anidadas.
  4. El hipervisor ya ha cedido la tabla física de interrupciones.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un invitado no puede modificarse y la CPU disponible carece de asistencia de virtualización adecuada. Su núcleo usa instrucciones sensibles que no provocan trampas. ¿Qué enfoque puede conservar el comportamiento del invitado y mantener el control?
  1. Ejecutar el núcleo invitado directamente con todos los privilegios del anfitrión.
  2. Sustituir esas instrucciones por hiperllamadas en su código fuente.
  3. Usar tablas de páginas anidadas para que toda instrucción de CPU provoque una trampa.
  4. Traducir las instrucciones problemáticas del núcleo invitado antes de ejecutarlas.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Con páginas de 4 KiB, la página virtual 5 del invitado se mapea al marco 12 del invitado, que se mapea al marco 29 de la máquina. ¿Qué dirección de máquina corresponde a 0x53D0?
  1. 0x1D3D0.
  2. 0xC3D0.
  3. 0x1D53D0.
  4. 0x533D0.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una VM usa paginación anidada por hardware con tres niveles de tablas de páginas del invitado y cuatro niveles del hipervisor. En una traducción completamente sin caché, ¿cuántas referencias a memoria para tablas de páginas se necesitan antes de acceder a los datos y debe cada modificación de las tablas del invitado provocar una trampa para sincronizar las tablas sombra?
  1. 7 referencias; la paginación anidada por hardware no requiere sincronizar una tabla sombra en cada modificación.
  2. 19 referencias; cada modificación de las tablas del invitado debe provocar una trampa para sincronizar una tabla sombra por software.
  3. 19 referencias; la paginación anidada por hardware no requiere sincronizar una tabla sombra en cada modificación.
  4. 24 referencias; cada par de tablas anidadas tiene la misma longitud de recorrido independientemente de su profundidad.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un anfitrión sobreasigna memoria entre clientes distintos. Cada invitado sabe qué datos puede descartar, y se prohíbe compartir páginas entre clientes. ¿Qué estrategia de recuperación usa ese conocimiento y qué ocurre si después todos los invitados necesitan toda la memoria que se les prometió?
  1. Usar intercambio ciego del anfitrión; este sabe directamente qué páginas del invitado están libres y evita la presión con demanda completa.
  2. Usar un controlador globo; aun así, no puede proporcionar toda la RAM prometida si la demanda activa combinada supera la del anfitrión.
  3. Usar un controlador globo; aumenta permanentemente la capacidad del anfitrión para cumplir todas las asignaciones prometidas.
  4. Fusionar páginas idénticas; respeta la restricción de compartición porque las páginas fusionadas comienzan siendo de solo lectura.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un controlador de almacenamiento del invitado coloca muchas solicitudes en una cola de memoria compartida antes de notificar al componente que las atiende. ¿Qué modelo de dispositivo ilustra esto?
  1. Un dispositivo emulado registro a registro.
  2. Una interfaz de dispositivo paravirtual.
  3. Un dispositivo físico compartido sin mediación.
  4. Un emulador del conjunto de instrucciones de la CPU.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Las VM tienen mapeos de páginas privados correctos, pero un atacante deduce datos mediante los tiempos de una caché compartida. El operador considera actualizar el microcódigo de la CPU y evitar que distintos clientes usen los hilos de hardware del mismo núcleo. ¿Qué diagnóstico relaciona la exposición con esos controles?
  1. Un canal lateral de hardware compartido necesita mitigaciones de CPU y una asignación cuidadosa de los hilos del mismo núcleo.
  2. Un escape mediante el modelo de dispositivos solo necesita corregir la emulación; los tiempos de caché no pueden cruzar mapeos correctos.
  3. Un canal lateral de caché compartida solo necesita actualizaciones de CPU; estas eliminan todo riesgo de compartir hilos del mismo núcleo.
  4. Un canal lateral de caché compartida solo necesita separar los hilos; entonces las vulnerabilidades de CPU no necesitan actualizaciones.
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

Dos grupos del mismo nivel con suficientes hilos ejecutables compiten por seis CPU igualmente disponibles. Sus pesos son 200 y 400, sin cuotas. ¿Qué proporción recibe el primero y qué ocurre si el segundo queda inactivo?
  1. Unas dos CPU durante la competencia; sigue limitado a dos cuando está solo.
  2. Unas dos CPU durante la competencia; puede usar las seis cuando está solo.
  3. Unas tres CPU durante la competencia; puede usar las seis cuando está solo.
  4. Unas cuatro CPU durante la competencia; sigue limitado a cuatro cuando está solo.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un servicio necesita sus propias interfaces, tabla de encaminamiento y espacio de puertos de escucha. ¿Qué espacio de nombres de Linux proporciona esa vista?
  1. Red.
  2. Montajes.
  3. PID.
  4. Cgroup.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una correspondencia de UID es 0 220000 8000. ¿Qué UID del anfitrión corresponde al UID interno 1750?
  1. 220 000.
  2. 228 000.
  3. 221 750.
  4. 218 250.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un supervisor llama a 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?
  1. El proceso de registro sobrevive como PID 1 y el supervisor entra en el espacio de nombres del hijo.
  2. El proceso de registro sobrevive en el espacio de nombres del anfitrión y el supervisor conserva su pertenencia anterior.
  3. Se termina el proceso de registro y también el supervisor porque ambos comparten el mismo núcleo.
  4. Se termina el proceso de registro y el supervisor permanece en su espacio de nombres de PID original.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un grupo tiene el valor 120000 100000 en cpu.max. ¿Qué asignación de CPU representa?
  1. El equivalente a 0,12 CPU de tiempo por periodo.
  2. El equivalente a 1,2 CPU de tiempo por periodo.
  3. El equivalente a 12 CPU de tiempo por periodo.
  4. Un peso relativo de planificación de 1,2.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un grupo padre limita a dos hijos ocupados a 1,5 equivalentes de CPU. El hijo A tiene peso 100 y su propia cuota de 0,5 CPU; B tiene peso 200. A debe conservar su tercio durante la competencia, pero aprovechar toda la capacidad disponible del padre cuando B esté inactivo. ¿Qué cambio se ajusta a ese objetivo?
  1. Eliminar la cuota propia de A y conservar ambos pesos y el límite del padre.
  2. Elevar el peso de A a 300 y conservar su cuota propia y el límite del padre.
  3. Elevar solo el límite del padre y conservar la cuota propia de A y ambos pesos.
  4. Dar a B una cuota menor y conservar la cuota propia de A y ambos pesos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un grupo padre tiene un 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?
  1. Sí; A está por debajo de su límite local de 40, por lo que el total del padre no importa.
  2. Sí; el padre solo cuenta los seis procesos principales, por lo que quedan 24 puestos de tareas.
  3. No; las 28 tareas de A más las 2 de B ya llenan el límite de 30 tareas del padre.
  4. No; A ya supera su límite local porque cada proceso añade siete líderes adicionales.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un equipo quiere ejecutar en servidores Linux una aplicación que requiere un núcleo Windows. ¿Qué límite puede proporcionar ese núcleo?
  1. Un contenedor de Windows.
  2. Un espacio de nombres con UID 0.
  3. Un árbol de Windows montado.
  4. Una VM que ejecute Windows.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un contenedor sin privilegios de administrador en el anfitrión recibe un socket utilizable de un entorno de ejecución del anfitrión propiedad de root. ¿Por qué puede fallar la correspondencia de UID al proteger al anfitrión frente a sus solicitudes?
  1. El UID mapeado da a las solicitudes del entorno solo la autoridad reducida del contenedor.
  2. La correspondencia bloquea los cambios de privilegios en el cliente, por lo que las solicitudes no pueden afectar a objetos del anfitrión.
  3. El entorno de ejecución actúa con su propia autoridad privilegiada ante las solicitudes que puede enviar el cliente.
  4. El socket solo permite acciones locales al espacio de nombres porque su cliente está en uno de usuarios.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un proveedor ejecuta código subido por clientes no relacionados. Los clientes A y C necesitan Linux; B necesita Windows. Quiere desplegar contenedores rápidamente dentro del entorno de cada cliente y mantener dentro de ese cliente las consecuencias de un núcleo invitado comprometido. ¿Cómo debe organizar los límites?
  1. Usar una VM o micromáquina virtual separada por cliente, con el sistema operativo necesario y contenedores compatibles dentro.
  2. Usar una VM por sistema operativo, mezclando los contenedores de A y C en Linux y colocando a B en una VM Windows.
  3. Usar una VM Linux compartida con contenedores separados sin privilegios de administrador y dar a B un árbol de archivos de Windows.
  4. Usar una VM Windows compartida con espacios de nombres de PID separados y empaquetar las bibliotecas de los tres clientes.
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

Un investigador necesita registros de inicios de sesión fallidos y usos de comandos con privilegios elevados. ¿Qué mecanismo proporciona esas pruebas?
  1. La aleatorización de direcciones.
  2. El registro de auditoría.
  3. La paginación anidada.
  4. Una cuota de ejecución de CPU.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un sistema biométrico acepta demasiados impostores. El operador eleva su umbral de similitud. ¿Qué compensación deben buscar las pruebas?
  1. Más aceptaciones de impostores y menos rechazos de usuarios legítimos.
  2. Menos aceptaciones de impostores y menos rechazos de usuarios legítimos.
  3. Más aceptaciones de impostores y más rechazos de usuarios legítimos.
  4. Menos aceptaciones de impostores y más rechazos de usuarios legítimos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una ACL POSIX da lectura y escritura a un usuario nombrado, pero su máscara es de solo lectura. La entrada del archivo para los demás tiene escritura. El usuario no es el propietario. ¿Puede el usuario nombrado escribir mediante una nueva apertura?
  1. No; la máscara limita la entrada nombrada y no puede pasar a la de los demás.
  2. Sí; la entrada nombrada de lectura y escritura elude la máscara de la clase de grupo.
  3. Sí; la escritura de los demás se combina con la entrada nombrada limitada por la máscara.
  4. No; todo usuario nombrado debe unirse al grupo propietario antes de usar una ACL.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un programa auxiliar privilegiado copia una ruta en memoria privada, la comprueba con access() y después la abre con todos sus privilegios. Un atacante puede sustituir la entrada nombrada. ¿Qué fallo persiste?
  1. Copiar la cadena ha eliminado tanto la condición de carrera de memoria como la de la ruta.
  2. La copia cambia el UID real del programa auxiliar para que coincida con el propietario de la ruta.
  3. La cadena estable aún puede resolverse a un objeto diferente al abrirla.
  4. La copia hace invisibles los enlaces simbólicos en todas las búsquedas posteriores de nombres.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Con páginas de 4 KiB, un invitado mapea la página virtual 9 al marco 4 del invitado y después al marco 51 de la máquina. Su IOMMU también permite a un dispositivo asignado acceder a los marcos 48–55 de la máquina. ¿Cuál es la dirección de CPU para 0x9B20 y está el marco resultante dentro del mapeo del dispositivo?
  1. 0x4B20; no, el marco 4 está fuera del intervalo permitido.
  2. 0x33B20; no, el desplazamiento está fuera del intervalo permitido.
  3. 0x33B20; sí, el marco 51 está dentro del intervalo permitido.
  4. 0x9B20; sí, el número de página virtual está dentro del intervalo permitido.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un anfitrión de ocho CPU da a un cgroup padre una cuota de dos CPU. Dos hijos ejecutables del mismo nivel tienen pesos 100 y 300, no tienen cuotas menores y cuentan con suficiente trabajo paralelo. ¿Qué proporciones sostenidas resultan mientras ambos compiten?
  1. Unas 2 y 6 CPU de las ocho CPU del anfitrión.
  2. Unas 0,5 y 1,5 CPU dentro del límite del padre.
  3. Unas 1 y 1 CPU con la cuota dividida por igual.
  4. Unas 2 y 2 CPU con una cuota completa cada uno.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un supervisor abre un archivo, pasa un descriptor de solo lectura a un trabajador y después cambia el modo del archivo para denegar a ese trabajador futuras aperturas. ¿Qué autoridad conserva el trabajador mediante el descriptor?
  1. Conserva el acceso de lectura mediante el descriptor existente.
  2. Pierde el descriptor en el siguiente cambio del planificador.
  3. Obtiene acceso de escritura porque los descriptores ignoran los modos de acceso.
  4. Puede volver a abrir cualquier archivo del mismo directorio mediante ese descriptor.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una VM usa asignación directa para una tarjeta capaz de realizar DMA y memoria del invitado cifrada por hardware. El operador quiere migración en vivo y restringir el acceso del dispositivo a la VM correcta. ¿Qué trabajo sigue siendo necesario?
  1. Usar la IOMMU, pero migrar solo el disco y omitir el estado del dispositivo asignado.
  2. Transferir el estado del dispositivo, pero restringir su DMA solo con las tablas de páginas del invitado.
  3. Dejar que el cifrado de memoria sustituya la restricción del DMA y copiar solo el estado de CPU.
  4. Restringir el DMA con una IOMMU y gestionar el estado de migración del dispositivo asignado.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un contenedor tiene un espacio de nombres de PID nuevo, pero comparte el espacio de nombres de red del anfitrión. ¿Puede su aislamiento de PID por sí solo permitirle asociarse a un puerto ya ocupado en el anfitrión?
  1. No; el puerto permanece en el espacio de nombres de red compartido.
  2. Sí; cada espacio de nombres de PID tiene un espacio de puertos independiente.
  3. Sí; el PID 1 recibe automáticamente una pila de red nueva.
  4. No; los contenedores nunca pueden asociarse a puertos de red.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un atacante entra en un contenedor de la VM del cliente A y explota un error para controlar el núcleo invitado de esa VM. Otros clientes tienen VM separadas en el mismo anfitrión físico. ¿Qué cargas de trabajo quedan directamente expuestas y qué falta para ejecutar código en el anfitrión?
  1. Solo queda expuesto el contenedor original; su espacio de nombres de PID sigue confinando el núcleo invitado controlado.
  2. Quedan expuestos otros contenedores de la VM de A; ejecutar código en el anfitrión sigue requiriendo cruzar el límite de la VM.
  3. Todas las VM de los clientes quedan directamente expuestas; cualquier núcleo invitado controla el anfitrión físico compartido.
  4. Solo quedan expuestos los contenedores con el mismo UID; un núcleo invitado controlado sigue teniendo que respetar cada UID.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

113 Términos Clave, cada uno con su definición

A

Acceso directo a memoria (DMA)
El acceso directo a memoria permite que un dispositivo transfiera datos hacia o desde la RAM sin enviar esos accesos a través de la MMU de la CPU.
Un dispositivo de red que usa acceso directo a memoria necesita un límite independiente para las direcciones de RAM que puede alcanzar.
Aislamiento de las tablas de páginas del núcleo (KPTI)
El aislamiento de las tablas de páginas del núcleo elimina la mayoría de los mapeos del núcleo durante la ejecución en modo usuario para reducir la exposición en procesadores afectados por Meltdown.
El aislamiento de las tablas de páginas del núcleo cambia los mapeos activos cuando la ejecución cruza el límite entre usuario y núcleo.
Aleatorización de la distribución del espacio de direcciones (ASLR)
ASLR aleatoriza las ubicaciones de las regiones de memoria para que los atacantes no puedan predecir con fiabilidad las direcciones para reutilizar código o dirigirse a datos.
Una filtración de información puede revelar la dirección base de una biblioteca y debilitar ASLR para los gadgets de esa biblioteca.
Anillo de protección
Un anillo de protección es un nivel de privilegio de x86; el anillo 0 es el más privilegiado y el anillo 3 es el menos privilegiado.
Linux normalmente sitúa el código de las aplicaciones en el anillo de protección 3 y el código de su núcleo en el anillo de protección 0.
Arranque medido
El arranque medido registra hashes de los componentes de inicio, a menudo en un TPM, para que otra parte pueda verificar qué se cargó.
El arranque medido proporciona mediciones del inicio para la atestación sin ser por sí mismo el mecanismo de rechazo basado en firmas.
Arranque seguro
El arranque seguro verifica firmas de confianza a lo largo de la cadena de arranque y rechaza los componentes que no superan las comprobaciones de confianza configuradas.
El arranque seguro puede rechazar un cargador de arranque modificado antes de que este reciba el control de la máquina.
Asignación directa de dispositivos (device passthrough)
La asignación directa de dispositivos entrega un dispositivo físico o una función directamente a una VM, con una IOMMU que restringe su acceso mediante DMA.
La asignación directa de dispositivos puede mejorar el rendimiento de la red y, al mismo tiempo, dificultar la compartición y la migración en vivo.
Ataque de diccionario
Un ataque de diccionario prueba contraseñas probables, incluidas opciones filtradas y variantes predecibles, antes que cadenas menos probables.
Un ataque de diccionario puede encontrar «Winter2027!» pronto, pese a su combinación de letras, dígitos y signos de puntuación.
Ataque de fuerza bruta
Un ataque de fuerza bruta prueba sistemáticamente cada candidata de un espacio de contraseñas definido hasta encontrar un verificador coincidente.
Un ataque de fuerza bruta contra contraseñas de ocho letras minúsculas tiene un espacio de búsqueda de 26 elevado a la octava potencia.
Ataque sin conexión
Un ataque sin conexión prueba contraseñas candidatas contra verificadores robados en el hardware del atacante sin consultar al servicio de inicio de sesión.
Un ataque sin conexión continúa a su propio ritmo aunque la cuenta real se bloquee después de inicios de sesión fallidos.
Autenticación (autentificación)
La autenticación comprueba que una entidad que declara una identidad controla las credenciales o los factores asociados a ella.
Una autenticación correcta permite que el servicio de inicio de sesión asocie las credenciales de la cuenta a un nuevo intérprete de comandos.
Autenticación multifactor
La autenticación multifactor requiere pruebas de distintos tipos de factores, como conocimiento más posesión de un dispositivo.
Una contraseña y un código de una aplicación de autenticación proporcionan autenticación multifactor, a diferencia de dos preguntas de conocimiento.
Autenticador de clave pública
Un autenticador de clave pública demuestra la posesión de una clave privada firmando un desafío que un servidor verifica con su clave pública.
Un autenticador de clave pública puede completar el inicio de sesión sin transmitir su clave privada de firma al servidor.
Autorización
La autorización decide si una entidad de seguridad autenticada puede realizar una operación concreta sobre un recurso protegido.
La autorización de archivos puede denegar a un usuario que ha iniciado sesión el permiso para leer un informe que pertenece a otra cuenta.

B

Base de computación de confianza (TCB)
La base de computación de confianza es el hardware, el firmware y el software de cuyo funcionamiento correcto depende la seguridad del sistema.
Un fallo en un programa auxiliar de inicio de sesión de confianza puede comprometer la base de computación de confianza aunque el núcleo funcione correctamente.
Bit de no ejecución (NX)
Un bit de no ejecución es un permiso de página que impide ejecutar instrucciones desde la página, mientras los demás accesos se controlan por separado.
Una página de pila con el bit de no ejecución activado puede contener datos, pero provoca un fallo si el programa intenta ejecutarla.
Bit de permanencia (sticky bit)
El bit de permanencia restringe la eliminación y el cambio de nombre en un directorio a los propietarios de archivos, al propietario del directorio o a procesos privilegiados.
El bit de permanencia impide que un usuario ordinario elimine la entrada de otro usuario en un directorio temporal compartido con modo 1777.

C

Capacidad de Linux
Una capacidad de Linux es una parte asignable por separado de los privilegios de root que autoriza una clase de operaciones privilegiadas.
La 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
Una capacidad de objeto es un token infalsificable que identifica un objeto y las operaciones que su poseedor puede realizar sobre él.
Un proceso padre puede pasar una capacidad de objeto para un archivo de entrada sin dar a su trabajador acceso a todo el directorio.
Clave de acceso (passkey)
Una clave de acceso es una credencial de clave pública usada para la autenticación vinculada a un sitio, almacenada en un dispositivo o sincronizada de forma segura entre dispositivos.
Una clave de acceso sincronizada permite iniciar sesión en otro dispositivo y hace que la cuenta de la plataforma forme parte de la protección de la credencial.
Compartición de páginas
La compartición de páginas fusiona páginas idénticas en una copia de solo lectura y restablece copias separadas cuando un invitado escribe en una de ellas.
La compartición de páginas entre clientes puede revelar datos coincidentes mediante el tiempo necesario para crear una copia privada que permita escritura.
Computación confidencial
La computación confidencial usa protección por hardware y atestación para proteger la memoria del invitado frente a un anfitrión potencialmente no confiable.
La computación confidencial puede mantener las claves de memoria de la VM inaccesibles para el hipervisor mientras el hardware verifica el estado de arranque.
Condición de carrera entre comprobación y uso (TOCTTOU)
Una condición de carrera TOCTTOU ocurre cuando un objeto o una condición comprobados cambian antes de su uso, lo que deja sin efecto la decisión anterior.
Una condición de carrera TOCTTOU permite que un enlace simbólico sustituido redirija un programa auxiliar privilegiado después de su comprobación de permisos.
Contenedor
Un contenedor es uno o más procesos del núcleo del anfitrión aislados mediante vistas privadas, controles de recursos y restricciones de privilegios.
Un contenedor puede llevar archivos de otra distribución Linux y seguir ejecutándose en el mismo núcleo que el anfitrión.
Contenedor sin privilegios de administrador en el anfitrión (rootless)
Un contenedor sin privilegios de administrador en el anfitrión se ejecuta con autoridad sin privilegios en el anfitrión y normalmente mapea su identidad root interna mediante un espacio de nombres de usuarios.
Un contenedor sin privilegios de administrador en el anfitrión reduce los privilegios en él, pero sigue dependiendo de que su núcleo rechace las operaciones inseguras.
Contraseña de un solo uso basada en el tiempo (TOTP)
Una TOTP es un código de corta duración derivado de un secreto compartido y un intervalo de tiempo, usado habitualmente para demostrar la posesión de un autenticador.
Una página de inicio de sesión falsa puede retransmitir una TOTP al servicio real mientras el código siga siendo válido.
Control de acceso basado en roles
El control de acceso basado en roles asigna permisos a roles de trabajo y concede esos permisos a los usuarios mediante su pertenencia a los roles.
El control de acceso basado en roles permite que un cambio de puesto modifique la pertenencia a roles sin editar cada regla individual de archivo.
Control de acceso discrecional
El control de acceso discrecional permite que el propietario de un objeto decida qué otras entidades de seguridad pueden acceder a él y con qué derechos.
El control de acceso discrecional permite que el propietario de un archivo conceda acceso de lectura, incluso mediante un programa que se ejecuta como ese propietario.
Control de acceso obligatorio
El control de acceso obligatorio aplica una política definida por el administrador independientemente de las decisiones discrecionales del propietario de un objeto.
El control de acceso obligatorio puede denegar a un servidor web la lectura de un directorio personal que el modo ordinario del archivo permite.
Controlador de grupos de control
Un controlador de grupos de control mide o regula una clase de recursos para los grupos de la jerarquía de grupos de control.
Un padre habilita el controlador de memoria de grupos de control para sus hijos antes de configurar sus límites de memoria.
Correspondencia de identificadores de usuario
Una correspondencia de identificadores de usuario relaciona un intervalo de identificadores de usuario dentro de un espacio de nombres con otro fuera de él mediante dos valores iniciales y una longitud.
Una correspondencia de UID que comienza en 0 dentro y en 100000 en el anfitrión traduce el 1000 interno al 101000 del anfitrión.
Coste del cálculo del hash de contraseña
El coste del cálculo del hash de contraseña establece el cálculo deliberado y, en ocasiones, la memoria necesarios para calcular un verificador de contraseña.
Elevar el coste del cálculo del hash de contraseña ralentiza tanto una comprobación legítima de inicio de sesión como cada intento del atacante.
CPU virtual
Una CPU virtual es un procesador visible para el invitado cuyo estado de ejecución planifica el hipervisor en un procesador físico.
Una CPU virtual inactiva puede esperar su interrupción virtual mientras el núcleo físico ejecuta otro invitado.
cpu.max
cpu.max es el archivo de cgroup v2 que especifica una cuota de ejecución de CPU y un periodo en microsegundos, o una cuota ilimitada.
Un valor de cpu.max de 75000 100000 permite como máximo tres cuartos del tiempo de una CPU por periodo.
cpu.weight
cpu.weight establece la proporción relativa de CPU de un cgroup durante la contención sin imponer un límite estricto al tiempo que de otro modo esté disponible.
Un valor mayor de 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
Un desbordamiento de búfer es una escritura fuera de los límites de un búfer que puede corromper datos cercanos, incluida una dirección guardada del flujo de control.
Un desbordamiento de búfer en la pila puede sustituir una dirección de retorno aunque la operación prevista solo copiara texto.
Descriptor de archivo (descriptor de fichero)
Un descriptor de archivo es un índice local a un proceso que apunta a un recurso abierto mantenido por el núcleo y registra el acceso concedido al abrirlo.
Un descriptor de archivo heredado que permite escritura puede seguir siendo utilizable después de que el modo del archivo deje de permitir nuevas aperturas para escritura.
Dirección física del invitado
Una dirección física del invitado identifica memoria en la vista física del sistema operativo invitado y requiere traducción a una dirección real de máquina.
Una dirección física del invitado de cero puede mapearse a distintos marcos de máquina en dos VM que se ejecutan en un mismo anfitrión.
Directorio con setgid
Un directorio con setgid hace que los archivos recién creados hereden su grupo, lo que ayuda a un equipo a mantener los archivos compartidos bajo una misma identidad de grupo.
Un directorio de proyecto con setgid mantiene los documentos nuevos asignados al grupo del proyecto en lugar de al grupo principal de cada autor.
Dominio de SELinux
Un dominio de SELinux es una etiqueta de proceso usada por la política de control por tipos para determinar a qué tipos de objetos puede acceder el proceso.
Un dominio de SELinux para un servidor web puede permitir la lectura de páginas y denegar la lectura de tipos de archivos de directorios personales.

E

EFAULT
EFAULT es un error de Linux que indica que una dirección proporcionada para un acceso a memoria de una llamada al sistema no es una dirección de usuario válida y permitida.
Una llamada a read() con un destino en la memoria del núcleo puede devolver EFAULT en lugar de sobrescribir el núcleo.
Ejecución directa limitada
La ejecución directa limitada ejecuta instrucciones ordinarias de forma nativa mientras las comprobaciones de hardware y las trampas controladas conservan el control del supervisor.
La ejecución directa limitada da a una aplicación velocidad de cálculo nativa sin permitirle sustituir las tablas de páginas.
Emulación de dispositivos
La emulación de dispositivos presenta un modelo de software de hardware físico para que un invitado pueda usar un controlador de ese dispositivo.
La emulación de dispositivos puede traducir una escritura del invitado en un registro de tarjeta de red en trabajo realizado por un programa auxiliar del anfitrión.
Entidad de seguridad
Una entidad de seguridad es una entidad, como una persona o una cuenta de servicio, a la que se asignan derechos y en cuyo nombre actúan los procesos.
Un servicio de copias de seguridad se ejecuta como una entidad de seguridad independiente para que sus derechos sobre archivos puedan gestionarse por separado de los de un usuario humano.
Entrada de control de acceso (ACE)
Una entrada de control de acceso es una regla individual de una ACL de Windows que identifica un SID y los derechos que se permiten, deniegan o auditan.
Una entrada de control de acceso que deniega la escritura a un grupo al que se aplica puede detener una solicitud que incluya acceso de escritura.
Entrada en la máquina virtual (VM entry)
Una entrada en la máquina virtual restaura la ejecución del invitado bajo virtualización por hardware después de que el hipervisor haya seleccionado y preparado su estado.
Después de gestionar una notificación de dispositivo, el hipervisor realiza una entrada en la máquina virtual para reanudar el invitado afectado.
Escape de máquina virtual
Un escape de máquina virtual vulnera el límite del invitado mediante un fallo del hipervisor o de un dispositivo virtual expuesto y alcanza la autoridad del anfitrión.
Un dispositivo emulado defectuoso puede permitir un escape de máquina virtual aunque los mapeos ordinarios de páginas del invitado estén separados.
Espacio de nombres (namespace)
Un espacio de nombres da a los procesos su propia instancia o vista de una categoría de estado del sistema Linux que normalmente es global.
Un espacio de nombres puede separar listas de montajes sin establecer ningún límite de CPU para los procesos que usan esa vista.
Espacio de nombres de montajes
Un espacio de nombres de montajes separa la lista de sistemas de archivos montados de un grupo de procesos y permite un árbol de archivos visible privado.
Un espacio de nombres de montajes permite que un entorno de ejecución construya una raíz de contenedor sin sustituir la lista de montajes del anfitrión.
Espacio de nombres de PID
Un espacio de nombres de PID da a los procesos una jerarquía separada de numeración y visibilidad con su propio ciclo de vida del PID 1.
Un proceso puede ser PID 1 dentro de un espacio de nombres de PID mientras el anfitrión identifica el mismo proceso con otro número.
Espacio de nombres de red
Un espacio de nombres de red proporciona interfaces, direcciones, rutas, puertos y otros estados separados pertenecientes a una pila de red.
Dos servicios en espacios de nombres de red diferentes pueden escuchar en el puerto 80 sin un conflicto de puerto dentro de cada espacio.
Espacio de nombres de usuarios
Un espacio de nombres de usuarios establece correspondencias de identificadores de usuario y grupo entre las vistas interna y externa y limita las capacidades a sus recursos.
Un espacio de nombres de usuarios puede mapear el UID 0 del contenedor a un UID sin privilegios del anfitrión en lugar de a root del anfitrión.

F

Fallo de página
Un fallo de página es una excepción causada por una comprobación fallida de traducción de página o de permisos, que el núcleo debe interpretar.
Un fallo de página en un mapeo de copia en escritura puede dar lugar a una copia privada de la página y a un reintento satisfactorio de la instrucción.

G

Grupo de control (cgroup)
Un grupo de control organiza procesos jerárquicamente para medir y controlar recursos, con restricciones heredadas de los antecesores.
Un grupo de control puede limitar el uso de CPU de un trabajo por lotes sin ocultarle los nombres de los procesos del anfitrión.
gVisor
gVisor interpone un núcleo en espacio de usuario para las llamadas al sistema de los contenedores, lo que reduce la exposición directa de la carga de trabajo al núcleo del anfitrión.
gVisor gestiona gran parte de la superficie de llamadas al sistema de un entorno aislado antes de que determinadas operaciones lleguen al núcleo real del anfitrión.

H

Hash de contraseña
Un hash de contraseña es un verificador unidireccional que se vuelve a calcular a partir de una contraseña presentada y de parámetros almacenados para comprobar un inicio de sesión.
Un hash de contraseña robado puede comprobarse frente a contraseñas candidatas sin revelar una contraseña mediante descifrado.
Hiperllamada
Una hiperllamada es una solicitud explícita del software invitado al hipervisor para que realice una operación en nombre del invitado.
Una hiperllamada puede pedir al monitor que cambie el estado de la máquina virtual de un invitado sin simular que controla el anfitrión.
Hipervisor
Un hipervisor es la capa de software que crea VM, asigna sus recursos y conserva el control de la máquina física.
El hipervisor guarda el estado de CPU de un invitado antes de planificar otro invitado en el mismo núcleo físico.

I

Identificador de usuario efectivo (UID efectivo)
El UID efectivo es la identidad de un proceso Unix usada en la mayoría de las comprobaciones de acceso y puede diferir de la identidad que lo inició.
Un programa auxiliar de contraseñas setuid propiedad de root tiene el UID efectivo 0 y conserva el UID real de quien lo invocó.
Instantánea (snapshot)
Una instantánea conserva el estado de una VM para restaurarlo más adelante; una instantánea del estado en ejecución incluye la ejecución y la memoria, además de los discos.
Restaurar una instantánea completa devuelve una VM de prueba a su estado guardado de CPU, memoria y almacenamiento.
Instrucción privilegiada
Una instrucción privilegiada realiza una operación protegida solo con suficientes privilegios de CPU y, de lo contrario, provoca una trampa.
El intento de una aplicación de ejecutar la instrucción privilegiada HLT en x86 provoca un fallo de protección.
Instrucción sensible
Una instrucción sensible cambia la configuración de la máquina o se comporta de forma diferente según el nivel de privilegio de ejecución.
Una instrucción sensible que cambia de comportamiento silenciosamente puede frustrar la interceptación de la intercepción y emulación clásica.
Intercepción y emulación (trap-and-emulate)
La intercepción y emulación intercepta las operaciones protegidas de un invitado con privilegios reducidos y aplica sus efectos al estado de la máquina virtual.
La intercepción y emulación actualiza el indicador virtual de interrupciones de un invitado sin permitirle desactivar las interrupciones del anfitrión.
Interrupción del temporizador
Una interrupción del temporizador es un evento de hardware que devuelve al núcleo el control de la CPU después de un intervalo programado.
La interrupción del temporizador permite que el planificador sustituya un proceso incluso cuando este nunca cede la CPU voluntariamente.

K

Kata Containers
Kata Containers coloca cada entorno aislado de contenedores en una VM ligera, lo que proporciona núcleos invitados separados a entornos aislados distintos.
Kata Containers puede colocar varios contenedores de un pod dentro de un entorno aislado que comparte un núcleo invitado protegido.

L

Lista de control de acceso (ACL)
Una lista de control de acceso almacena los sujetos y derechos asociados a un objeto, lo que corresponde a una columna de la matriz de acceso.
La lista de control de acceso de un informe puede dar acceso de escritura a una cuenta y acceso de lectura a una segunda cuenta.
Lista de control de acceso discrecional (DACL)
Una DACL es la lista ordenada de entradas de autorización y denegación de un objeto de Windows que determina qué derechos solicitados se conceden.
Una DACL puede conceder una lectura solicitada mediante una entrada explícita antes de que la evaluación llegue a una denegación heredada.
Llamada al sistema
Una llamada al sistema es una solicitud controlada de un programa de usuario al núcleo para obtener un servicio que requiere autoridad del núcleo.
La función envoltorio 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
Una máquina virtual presenta un equipo virtual completo a un sistema operativo invitado mientras un hipervisor controla los recursos reales.
Una máquina virtual puede ejecutar un núcleo Windows en hardware compatible gestionado por un anfitrión basado en Linux.
Máscara de ACL POSIX
Una máscara de ACL POSIX limita los derechos efectivos de las entradas de usuarios nombrados, grupos nombrados y del grupo propietario.
Una máscara de ACL POSIX de solo lectura hace que la entrada de lectura y escritura de un usuario nombrado sea efectivamente de solo lectura.
Máscara de creación de archivos (umask)
Una umask es una configuración de proceso que desactiva determinados bits de permisos del modo solicitado cuando se crea un objeto.
Con una umask de 027, una solicitud de archivo ordinario de 666 de un programa crea el modo 640, no un archivo ejecutable.
Matriz de acceso
Una matriz de acceso representa las operaciones permitidas con un sujeto por fila, un objeto por columna y los derechos en cada celda.
Una matriz de acceso puede mostrar que un proceso de copias de seguridad puede leer un informe, pero no tiene derecho a usar una impresora.
Mecanismo setuid
Setuid es un mecanismo de archivos ejecutables que inicia un programa con la identidad efectiva de usuario de su propietario según las reglas normales de ejecución.
Setuid permite que el programa auxiliar de contraseñas actualice un archivo protegido de verificadores mientras su código comprueba qué cuenta puede cambiarse.
memory.high
memory.high es un umbral de presión de memoria de cgroup que ralentiza las tareas que asignan memoria y activa una recuperación agresiva por encima de él.
Un grupo puede superar memory.high mientras aumenta la presión para recuperar memoria, a diferencia de una asignación fija simple.
memory.max
memory.max es un límite estricto de memoria de cgroup que puede provocar la terminación local de un proceso por falta de memoria cuando la recuperación no puede satisfacer la demanda.
Después de agotar la recuperación de caché y el espacio de intercambio utilizable, memory.max puede forzar la terminación de una tarea elegible del grupo.
Micromáquina virtual (microVM)
Una micromáquina virtual es una máquina virtual pequeña diseñada con un modelo mínimo de dispositivos para aislar eficientemente cargas de trabajo ligeras.
Una plataforma puede colocar una función no confiable en una micromáquina virtual Firecracker para darle un límite de núcleo invitado separado.
Migración en vivo
La migración en vivo transfiere una VM en ejecución entre anfitriones, normalmente copiando la memoria antes de una breve transferencia final de la ejecución.
Un dispositivo asignado directamente puede complicar la migración en vivo porque también debe gestionarse su estado de hardware activo.
Modelo de Bell–LaPadula
El modelo de Bell–LaPadula protege la confidencialidad al prohibir las lecturas por encima del nivel de un sujeto y las escrituras por debajo de él.
Según el modelo de Bell–LaPadula, un proceso de nivel Secreto puede leer datos Confidenciales, pero no puede escribir en un archivo Confidencial.
Modo de permisos en octal
Un modo de permisos en octal codifica las clases de permisos de Unix usando lectura 4, escritura 2 y ejecución 1, con bits especiales opcionales.
El modo de permisos en octal 640 concede lectura y escritura al propietario, lectura al grupo y ningún acceso mediante la clase de los demás.
Modo núcleo
El modo núcleo es el nivel de privilegio de la CPU que permite al sistema operativo ejecutar instrucciones protegidas y gestionar el hardware.
Un controlador que se ejecuta en modo núcleo puede cambiar estados de la máquina que una aplicación ordinaria no puede controlar directamente.
Modo usuario
El modo usuario es el nivel restringido de privilegio de la CPU en el que las instrucciones de las aplicaciones se ejecutan sujetas a comprobaciones de protección por hardware.
Un editor de texto propiedad de root sigue ejecutando sus instrucciones ordinarias en modo usuario y solicita al núcleo las operaciones con archivos.
Módulos de autenticación conectables (PAM)
PAM es un marco de autenticación de Linux que permite a los servicios de inicio de sesión usar módulos configurados para comprobar credenciales y aplicar políticas relacionadas.
Un servicio de inicio de sesión SSH puede usar PAM para comprobar las credenciales antes de establecer la identidad de proceso del usuario.
Monitor de referencia
Un monitor de referencia es un mecanismo protegido que media en el acceso, no puede eludirse y es lo bastante pequeño para comprobarlo con cuidado.
El monitor de referencia comprueba una solicitud de mapeo; después, el hardware hace cumplir el acceso ya concedido en su tabla de páginas.

N

Nivel de excepción
Un nivel de excepción es un nivel de privilegio de ejecución de ARMv8-A, desde EL0 para aplicaciones hasta EL3 para firmware seguro.
El hipervisor de ARM se ejecuta en el nivel de excepción EL2, mientras que un núcleo de sistema operativo invitado normalmente se ejecuta en EL1.
no_new_privs
no_new_privs es una opción de proceso de Linux que impide que la ejecución conceda nuevos privilegios mediante setuid o mecanismos relacionados.
Con no_new_privs establecido, un proceso de contenedor no puede obtener autoridad simplemente iniciando un ejecutable setuid.

P

Paginación anidada
La paginación anidada hace que el hardware realice la traducción de dirección virtual del invitado a física del invitado y de física del invitado a dirección de máquina.
La paginación anidada permite modificar las tablas de páginas del invitado sin requerir la interceptación por software de cada cambio.
Par de interfaces Ethernet virtuales (veth)
Un par veth es un par de interfaces de red virtuales enlazadas que puede conectar un espacio de nombres de red de contenedor con su anfitrión.
Un extremo de un par veth puede estar dentro de un contenedor y el otro en un puente de la pila de red del anfitrión.
Paravirtualización
La paravirtualización modifica una interfaz del invitado para solicitar operaciones virtuales explícitamente en lugar de depender por completo de la interceptación.
La paravirtualización de CPU modifica un núcleo invitado para realizar hiperllamadas en las operaciones que requieren control del hipervisor.
Perfil de AppArmor
Un perfil de AppArmor confina un programa especificando las rutas y operaciones permitidas, incluidas determinadas capacidades de Linux.
Un perfil de AppArmor puede permitir que un servicio lea su configuración, pero denegar el acceso a archivos personales no relacionados.
pids.max
pids.max es un límite de tareas de cgroup que cuenta tanto procesos como hilos e impide su creación por encima del total permitido.
Un servicio con múltiples hilos puede alcanzar pids.max incluso cuando su número de procesos distintos parece pequeño.
Plantilla biométrica
Una plantilla biométrica son datos de características almacenados, derivados de un rasgo físico y usados para comparar identidades mediante similitud.
Un sensor de huellas dactilares compara nuevas características con una plantilla biométrica en lugar de exigir imágenes idénticas.
Política de escritura o ejecución excluyentes (W^X)
W^X es una política de memoria que prohíbe que una página permita escritura y ejecución al mismo tiempo.
Con W^X, un compilador en tiempo de ejecución escribe primero el código y cambia los permisos antes de ejecutarlo.
Prevención de acceso en modo supervisor a páginas de usuario (SMAP)
SMAP es una protección de x86 que restringe el acceso a datos de páginas de usuario desde el modo supervisor fuera de las operaciones de copia autorizadas explícitamente.
SMAP exige que el código de copia del núcleo permita deliberadamente el acceso a memoria de usuario necesario para un búfer validado.
Prevención de ejecución en modo supervisor de páginas de usuario (SMEP)
SMEP es una protección de x86 que impide que el código en modo supervisor ejecute instrucciones en páginas marcadas como accesibles desde el modo usuario.
SMEP bloquea un retorno del núcleo alterado que intenta saltar a instrucciones controladas por un atacante en una página de usuario.
Programación orientada a retornos (ROP)
La programación orientada a retornos construye un comportamiento elegido por el atacante encadenando secuencias cortas de instrucciones ya presentes en memoria ejecutable.
La programación orientada a retornos puede reutilizar instrucciones de bibliotecas sin ejecutar bytes inyectados desde una página de datos.

R

Recorrido de directorios
El recorrido de directorios es la búsqueda a través de un directorio para llegar a una entrada y requiere permiso de ejecución en ese directorio.
El recorrido de directorios puede permitir abrir un nombre conocido incluso cuando el permiso de lectura no permite listar todos los nombres.
Recuperación de memoria mediante un controlador globo (ballooning)
La recuperación de memoria mediante un controlador globo usa un controlador del invitado para reservar páginas, de modo que el hipervisor pueda recuperar sus marcos de máquina con la cooperación del invitado.
El controlador globo permite que el invitado elija a qué páginas renunciar usando un conocimiento que el hipervisor no tiene.
Registro de auditoría
Un registro de auditoría recoge eventos relevantes para la seguridad para que los administradores puedan detectar usos indebidos y reconstruir lo ocurrido.
Un registro de auditoría remoto y protegido puede conservar constancia de un comando privilegiado después de que un atacante borre los archivos locales.
Revocación de capacidades
La revocación de capacidades retira un acceso basado en tokens concedido anteriormente y puede requerir control sobre las copias delegadas.
La revocación de capacidades es difícil cuando muchos procesos poseen copias de la concesión sobre un objeto que pueden usar de forma independiente.

S

Sal criptográfica (salt)
Una sal criptográfica es un valor aleatorio para cada contraseña que se almacena con su hash para impedir que contraseñas iguales compartan trabajo de verificación reutilizable.
Las sales diferentes hacen que dos cuentas con la misma contraseña produzcan hashes de contraseña almacenados distintos.
Salida de la máquina virtual (VM exit)
Una salida de la máquina virtual es una transferencia controlada por hardware desde la ejecución del invitado al hipervisor después de un evento configurado para su interceptación.
Una salida de la máquina virtual ante HLT del invitado permite que el hipervisor deje de planificar la vCPU inactiva y ejecute otra carga de trabajo.
Seccomp
Seccomp es un mecanismo de Linux que filtra las llamadas al sistema de un proceso y restringe los servicios del núcleo disponibles para él.
La política seccomp de un proceso de renderizado del navegador puede bloquear las llamadas para iniciar programas incluso después de que el proceso esté comprometido.
Sistema invitado
Un sistema invitado es un sistema operativo que se ejecuta dentro de una máquina virtual con una vista del hardware proporcionada por un hipervisor.
El sistema invitado actualiza sus tablas de páginas sin recibir el control directo de todos los marcos de máquina del anfitrión.
Sobreasignación de memoria
La sobreasignación de memoria promete a las VM más memoria total de la que posee el anfitrión, confiando en que sus demandas activas no alcancen el máximo al mismo tiempo.
La sobreasignación de memoria puede no ofrecer un buen rendimiento cuando cada invitado comienza a usar toda su asignación.
Socket del entorno de ejecución de contenedores
Un socket del entorno de ejecución de contenedores es una interfaz para controlar un entorno de ejecución cuya autoridad puede exponer operaciones privilegiadas en todo el anfitrión.
El acceso a un socket del entorno de ejecución de contenedores que pertenece a root puede anular la protección esperada de una correspondencia de UID sin privilegios.

T

Tabla de páginas sombra
Una tabla de páginas sombra mapea direcciones virtuales del invitado directamente a marcos de máquina y el hipervisor la mantiene mediante software.
Una tabla de páginas sombra debe actualizarse cuando el invitado cambia los mapeos que el hardware usará realmente.
Tasa de falsas aceptaciones
La tasa de falsas aceptaciones es la proporción de intentos de impostores que un sistema biométrico acepta incorrectamente como legítimos.
Un impostor aceptado entre 5000 intentos da una tasa de falsas aceptaciones del 0,02 %.
Tasa de falsos rechazos
La tasa de falsos rechazos es la proporción de intentos legítimos que un sistema biométrico rechaza incorrectamente.
Un umbral de similitud más estricto aumenta la tasa de falsos rechazos cuando más lecturas legítimas quedan por debajo del punto de corte.
Token de acceso
Un token de acceso es un objeto de credenciales de Windows que contiene los SID de usuario y grupo y los privilegios usados en las comprobaciones de acceso.
UAC inicia un programa ordinario de un administrador con un token de acceso filtrado antes de cualquier elevación aprobada.
Traducción binaria
La traducción binaria reescribe las instrucciones problemáticas del núcleo invitado en secuencias seguras antes de ejecutarlas y almacenar el resultado en caché.
La traducción binaria puede dar soporte a un núcleo invitado sin modificar en un procesador con instrucciones sensibles que no provocan trampas.

U

Unidad de gestión de memoria (MMU)
La unidad de gestión de memoria traduce las direcciones virtuales de la CPU y comprueba los permisos de página antes de permitir los accesos a memoria.
La unidad de gestión de memoria bloquea una escritura en modo usuario en una página marcada como exclusiva del supervisor en la tabla de páginas.
Unidad de gestión de memoria de entrada/salida (IOMMU)
Una IOMMU traduce las direcciones de los dispositivos y aplica mapeos que restringen la memoria a la que puede acceder cada dispositivo capaz de realizar DMA.
La IOMMU impide que un dispositivo de red asignado directamente escriba fuera de la memoria asignada a su VM.

V

Virtio
Virtio es una interfaz de dispositivo paravirtual que usa controladores preparados para el invitado y colas compartidas para reducir la sobrecarga de gestión de dispositivos.
Un controlador virtio pone varias solicitudes de almacenamiento en cola antes de notificar al componente que las atiende, lo que reduce las transiciones repetidas.

Sobre esta unidad

Por StudeliInformar de un error

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.

Comenzar