2 puntos por GN⁺ 2024-10-27 | 1 comentarios | Compartir por WhatsApp

Análisis profundo de la nueva llamada al sistema mseal de Linux

  • mseal es una nueva llamada al sistema introducida en la versión 6.10 del kernel de Linux, que ofrece una función de "sellado de memoria" para la protección de memoria.
  • Esta llamada al sistema vuelve inmutable una región de memoria frente a modificaciones ilegítimas durante la ejecución del programa, impidiendo que un atacante cambie permisos de memoria o manipule el diseño de memoria.
  • mseal está pensado para evitar la ejecución de código por parte de atacantes remotos, y es diferente de memfd_create y memfd_secret, que ya existían para defenderse de atacantes locales que almacenan datos sensibles en memoria.

Cómo funciona mseal

  • La firma de la función mseal es simple: recibe una dirección inicial y una longitud, y sella la región de memoria correspondiente.
  • La función do_mseal bloquea la región de memoria, y mediante check_mm_seal y apply_mm_seal valida y sella esa región.
  • En una región de memoria sellada no es posible cambiar permisos, desmapearla ni redimensionarla mediante llamadas al sistema como mprotect, munmap y mremap.

Técnicas de ataque contra las que protege mseal

  • Refuerzo de NX: mseal impide cambiar los permisos de ejecución de la VMA, evitando ataques basados en shellcode.
  • Mitigación de ataques de solo datos basados en desmapeo: mseal evita la liberación arbitraria y el remapeo de regiones de memoria, bloqueando ataques de solo datos.

Fortalecimiento de software con mseal

  • mseal puede reforzar la seguridad sellando regiones específicas de memoria del software.
  • Los desarrolladores pueden usar mseal para sellar de forma selectiva regiones de memoria que puedan contener datos no confiables.
  • A medida que avance su integración con glibc, podría añadirse una función de sellado automático.

Resumen de GN⁺

  • mseal es una nueva función de seguridad incorporada al kernel de Linux que sella regiones de memoria para impedir la ejecución de código por parte de atacantes remotos.
  • A diferencia de métodos previos de protección de memoria, esta llamada al sistema evita cambios de permisos y el desmapeo de memoria, bloqueando ataques de solo datos.
  • La incorporación de mseal cumple un papel importante en el fortalecimiento de la seguridad del software, y se esperan más casos de uso mediante su integración con glibc.
  • Otros proyectos con funciones similares incluyen memfd_create y memfd_secret para la protección de memoria.

1 comentarios

 
GN⁺ 2024-10-27
Opiniones de Hacker News
  • Se mencionó una "discusión acalorada" en la lista de correo del kernel. Hay un comentario preguntando si alguien con conocimiento interno podría resumir las objeciones y preocupaciones. La lista de correo tiende a evitarse porque es demasiado intensa

    • El mecanismo en sí parece razonable, pero sorprende que no existiera ya en el kernel
  • Chrome quiere esta llamada, pero no puede desellar páginas selladas porque un atacante podría volver a mapearlas con otras banderas

    • Esto significa que no puede usarse para páginas asignadas en tiempo de ejecución, y por lo tanto no sirve a menos que se pretenda conservarlas durante toda la vida del proceso
    • Se plantea la pregunta de si eso significa que no puede usarse para memoria como la de un sandbox de JS
    • No está claro por qué esto no sería un problema, ya que no se conoce bien cómo Chrome gestiona su memoria/procesos
  • Se proporciona un enlace al artículo sobre mseal() y a artículos posteriores

  • Hay tristeza por el hecho de que, aunque las arquitecturas modernas (x86_64) tienen muchas funciones para fomentar la programación segura, los sistemas operativos todavía tengan que implementar llamadas como esta

    • Los intentos de seguir parchando sistemas antiguos frenan el progreso de la computación y ponen en riesgo a miles de millones de personas
    • Existen bugs de arquitectura, pero el software no está aprovechando correctamente las capacidades actuales
  • Hay una pregunta sobre si la llamada al sistema mseal podría invalidarse con un truco de LD_PRELOAD

  • El prototipo de mseal() en el artículo no es sintácticamente correcto. El primer argumento debería ser unsigned long start_addr y no unsigned start addr

  • OpenBSD ha tenido esta funcionalidad desde hace mucho tiempo. Surge la duda de por qué recién ahora se está introduciendo en Linux