4 votos

¿Borra MacOS automáticamente la memoria liberada (para evitar la fuga de información que queda en la memoria liberada)?

Me dedico tanto a MacOS como a Linux.

Linux borra automáticamente toda la memoria liberada para evitar la fuga de información que queda en la memoria liberada, y también para evitar los ataques que buscan o se basan en la información que queda en la memoria liberada (por ejemplo, los ataques de variables no inicializadas, los ataques de uso después de la liberación, los ataques de reutilización, la exposición del contenido de la pila y la exposición del contenido del montón) ( https://www.kernel.org/doc/html/v4.18/security/self-protection.html ). Me gusta esta característica de Linux, y me pregunto si MacOS también tiene esta característica.

  1. ¿Borra MacOS automáticamente toda la memoria liberada?

  2. (Suponiendo que el número 1 sea positivo) ¿Desde qué versión de MacOSX, OSX o MacOS, se ha dotado de esta función de borrado automático de la memoria liberada?

Cuando respondas, intenta señalar un documento oficial de Apple (ya sea en developer.apple.com o support.apple.com pero NO en forum.apple.com) que apoye tu respuesta.

Por cierto, la autoprotección del núcleo de Linux incluye el "envenenamiento de la memoria", que hace algo más que el "borrado de la memoria". "El envenenamiento de la memoria" llena la memoria liberada con una firma especial con el fin de identificar los datos de memoria malos o corruptos y advertir al sistema cuando estos datos malos son eventualmente leídos ( https://patents.google.com/patent/US20140006879A1/en ).

2 votos

"Linux borra automáticamente todas las memorias liberadas" No, no lo hace sin un parche de terceros para el kernel (y no conozco ninguno que esté actualmente mantenido y disponible gratuitamente: es una parte de Grseguridad ).

0 votos

@Gilles'SO-stopbeingevil', forma parte de Linux mainline desde hace tiempo (Kernel Hacking -> Memory Debugging -> Poison pages after freeing), pero debido al impacto en el rendimiento, no siempre está activado.

0 votos

Por favor, aclárelo. ¿Qué quiere decir con "memoria liberada"? Podría significar memoria liberada a los pools del kernel (como primera respuesta) o memoria física liberada a la lista de libres (respuesta menos popular). Si es lo primero, borraré mi respuesta.

13voto

Jose Chavez Puntos 645

Su pregunta es un poco vaga y, por tanto, difícil de responder.

Al contrario de lo que escribes, Linux no borra automáticamente cada bit de memoria liberada en el sistema. Para responder a tu pregunta #1, MacOS tampoco lo hace.

Creo que tu idea errónea sobre Linux viene del hecho de que Linux puede liberar núcleo memoria, si está configurado para ello. En los sistemas normales eso es sólo una pequeña fracción de la memoria total del sistema.

Si miras las aplicaciones del espacio de usuario en MacOS, el desarrollador puede configurarlo para que la memoria se borre o se envenene al liberarse. Por razones de rendimiento, esto se hace sobre todo con partes de la memoria en las que se pueden filtrar secretos (como por ejemplo las claves criptográficas).

Si lo que te interesa es el núcleo en sí, el núcleo de MacOS también tiene funciones relacionadas con la puesta a cero y el envenenamiento de la memoria liberada. El kernel incluye un asignador de zonas, donde las zonas pueden ser configuradas para ser puestas a cero, envenenadas (es decir, 0xdeadbeef escrito por todas partes) o simplemente canaried (es decir, un canario - bytes de datos específicos - se escribe al principio y al final de la asignación - principalmente para detectar errores).

Por defecto, el kernel permite el envenenamiento instantáneo para alociaciones muy pequeñas (hasta el tamaño de la línea de caché de la CPU - depende de la CPU, pero podría ser, por ejemplo, de 64 bytes). Para asignaciones más grandes, la memoria liberada se envenena periódicamente con una frecuencia que depende del tamaño de la asignación. El envenenamiento instantáneo de asignaciones muy grandes tiene un impacto en el rendimiento, por lo que esto reduce o al menos reparte ese impacto.

Puede encontrar el código fuente del asignador de zonas aquí:

https://github.com/apple/darwin-xnu/blob/main/osfmk/kern/zalloc.c

Mirando el historial de versiones, puedo ver que el envenenamiento de la memoria se incluyó como una opción en 2009 - esto lo situaría justo antes de Mac OS X Snow Leopard.

Por lo que sé, el envenenamiento de memoria se incluyó en iOS 2 (entonces llamado iPhone OS), lo que significa que probablemente fue implementado por Apple en 2008. El volcado de código fuente público del kernel de MacOS lo incluye en 2009. Me parece que se introdujo como una característica en Linux en 2009 en este parche:

https://lwn.net/Articles/321595/

Además de la función genérica de VM, el kernel de MacOS también cuenta con un sistema similar al Kernel Address Sanitizer de Linux (KASAN) que también hace envenenamiento de memoria. Por lo que sé, se introdujo en 2017.

Puede encontrar el código fuente de la función aquí:

https://github.com/apple/darwin-xnu/tree/main/san

0 votos

Corrígeme si me equivoco, pero ¿tu respuesta no se refiere a la asignación de memoria virtual (por ejemplo, las zonas del núcleo proceden de la memoria virtual del núcleo)? Tomé la pregunta del OP para estar en el nivel físico y si las páginas físicas se ponen a cero en la asignación. Y sería github.com/apple/darwin-xnu/tree/main/osfmk/vm sea el código pertinente?

0 votos

Sospecho que usted aplica a la palabra "virtual" una semántica ligeramente distinta a la de los demás aquí presentes. ¿A qué te refieres exactamente cuando dices "memoria virtual"? (sólo para asegurarme de que estamos hablando de lo mismo antes de seguir explicando).

0 votos

Olvidé hacerte ping en el comentario anterior @Gilby. Tenga en cuenta que sólo estoy preguntando porque a menudo veo que muchos utilizan la palabra "memoria virtual" para significar algo diferente cuando se utiliza casualmente.

-3voto

user43889 Puntos 266

En respuesta a sus preguntas:

  1. Desde 1985, aunque eso necesita alguna explicación.

MacOS utiliza un núcleo híbrido (XNU) basado en Mach y BSD. El componente Mach gestiona los procesos e hilos, la comunicación entre procesos y gestión de la memoria . Aunque Apple ha añadido mejoras, Mach sigue siendo la base de las partes más internas del núcleo XNU.

Podemos remontarnos al año 1985 para conocer los orígenes de Mach corriendo en un DEC VAX. Este documento Mach: Una nueva base de kernel para el desarrollo de UNIX incluye "Mach proporciona algunos servicios básicos de paginación dentro del núcleo. La memoria sin paginador se llena automáticamente de cero, y la salida de la página se hace a un paginador por defecto."

Así que a partir de 1985 la memoria se llenó automáticamente de cero proyectos/productos basados en Mach. Eso incluye y todas las versiones de MacOS y OS X.

Para la documentación actual de Apple, lea Visión general de Mach que incluye: "El localizador por defecto maneja memoria no persistente, conocida como memoria anónima. La memoria anónima se inicializa a cero,...". Esto realmente se traslada directamente desde Mac y confirma que la memoria es de inicialización cero.

Para más información:

  • De la documentación para desarrolladores de Apple Guía de programación del núcleo
  • Si tiene conocimientos de programación del núcleo o le interesa ver darwin-xnu que forma parte del código abierto de Apple.
  • Para una discusión en profundidad de los aspectos internos, no se puede hacer nada mejor que el *Internas del SO libros de Jonathan Levin.
  • Hay numerosas preguntas sobre la gestión de la memoria de MacOS (OS X) (aunque no tu pregunta específica) en Ask Different. Puede que quieras empezar aquí .

Debo señalar que, aunque siempre me han interesado los núcleos y los sistemas operativos, carezco de conocimientos de programación de sistemas operativos desde aproximadamente 1980.

0 votos

Esta respuesta es incorrecta, ya que se refiere a la situación cuando se asigna memoria, mientras que la pregunta es sobre la liberación de memoria.

0 votos

@jksoegaard Yo podría argumentar que usted está dividiendo los pelos. Es una cuestión de tiempo. Si no estás de acuerdo presenta el caso contrario.

5 votos

Lo importante es hacerlo en el tiempo libre, ya que así se obtienen las ventajas descritas en la pregunta. No se obtienen esas ventajas haciendo la puesta a cero en tiempo de asignación. Definitivamente no es un caso de división de pelos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X