4 votes

MacOS efface-t-il automatiquement la mémoire libérée (pour éviter la fuite d'informations laissées dans la mémoire libérée) ?

Je m'occupe à la fois de MacOS et de Linux.

Linux efface automatiquement toute mémoire libérée afin d'empêcher la fuite d'informations laissées dans la mémoire libérée, et également pour empêcher les attaques qui recherchent ou s'appuient sur les informations laissées dans la mémoire libérée (par exemple, les attaques de variables non initialisées, les attaques d'utilisation après libération, les attaques de réutilisation, les expositions du contenu de la pile et les expositions du contenu du tas) ( https://www.kernel.org/doc/html/v4.18/security/self-protection.html ). J'aime cette fonctionnalité de Linux, et je me demande si MacOS la possède également.

  1. MacOS efface-t-il automatiquement toute la mémoire libérée ?

  2. (En supposant que le n°1 est positif) Depuis quelle version de MacOSX, OSX ou MacOS, est-il équipé de cette fonctionnalité d'effacement automatique de la mémoire libérée ?

Lorsque vous répondez, essayez d'indiquer un document officiel d'Apple (soit sur developer.apple.com ou support.apple.com mais PAS sur forum.apple.com) qui étaye votre réponse.

À propos, l'autoprotection du noyau Linux comprend l'"empoisonnement de la mémoire", qui fait plus que l'"effacement de la mémoire". Le "Memory Poisoning" remplit la mémoire libérée avec une signature spéciale afin d'identifier les données de mémoire mauvaises ou corrompues et d'avertir le système lorsque ces mauvaises données sont éventuellement lues ( https://patents.google.com/patent/US20140006879A1/en ).

2 votes

"Linux efface automatiquement toute la mémoire libérée" Non, il ne le fait pas, pas sans un correctif tiers du noyau (et je n'en connais pas un qui soit actuellement maintenu et librement disponible : c'est une partie de Grsecurity ).

0 votes

@Gilles'SO-stopbeingevil', il fait partie de la ligne principale de Linux depuis un certain temps (Kernel Hacking -> Memory Debugging -> Poison pages after freeing), mais en raison de l'impact sur les performances, il n'est pas toujours activé.

0 votes

Veuillez préciser. Qu'entendez-vous par "mémoire libérée" ? Il peut s'agir de la mémoire libérée dans les pools du noyau (première réponse) ou de la mémoire physique libérée dans la liste des mémoires libres (réponse moins populaire). Si c'est la première réponse, je supprimerai ma réponse.

13voto

Jose Chavez Points 645

Votre question est un peu vague et il est donc difficile d'y répondre.

Contrairement à ce que vous écrivez, Linux n'efface pas automatiquement chaque partie de la mémoire libérée sur le système. Pour répondre à votre question 1, MacOS ne le fait pas non plus.

Je pense que votre idée fausse sur Linux vient du fait que Linux peut libérer Noyau la mémoire, si elle est configurée pour le faire. Sur les systèmes normaux, cela ne représente qu'une petite fraction de la mémoire totale du système.

Si vous regardez les applications de l'espace utilisateur sur MacOS, le développeur peut les configurer de manière à ce que la mémoire soit vidée ou empoisonnée à la libération. Pour des raisons de performance, ceci est principalement fait avec des parties de la mémoire où des secrets peuvent être divulgués (comme par exemple les clés cryptographiques).

Si vous vous intéressez uniquement au noyau lui-même, sachez que le noyau de MacOS possède également des fonctionnalités liées à la mise à zéro et à l'empoisonnement de la mémoire libérée. Le noyau comprend un allocateur de zone, où les zones peuvent être configurées pour être mises à zéro, empoisonnées (par exemple, 0xdeadbeef écrit partout) ou simplement canariées (par exemple, un canari - des octets de données spécifiques - est écrit au début et à la fin de l'allocation - principalement pour attraper les bogues).

Par défaut, le noyau permet l'empoisonnement instantané pour les très petites allocations (jusqu'à la taille de la ligne de cache du CPU - cela dépend du CPU, mais pourrait par exemple être de 64 octets). Pour les allocations plus importantes, la mémoire libérée est empoisonnée périodiquement avec une fréquence qui dépend de la taille de l'allocation. L'empoisonnement instantané de très grandes allocations a un impact sur les performances, donc ceci réduit ou au moins étale cet impact.

Vous pouvez trouver le code source de l'allocateur de zone ici :

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

En consultant l'historique des versions, je constate que l'empoisonnement de la mémoire a été inclus comme option en 2009, soit juste avant Mac OS X Snow Leopard.

Pour autant que je sache, l'empoisonnement de la mémoire a été inclus dans iOS 2 (appelé à l'époque iPhone OS), ce qui signifie qu'il a probablement été mis en œuvre par Apple en 2008. Le dump source public du noyau de MacOS l'inclut en 2009. Il me semble qu'il a été introduit comme une fonctionnalité dans Linux en 2009 dans ce patch :

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

En plus de la fonction générique de VM, le noyau MacOS dispose également d'un système similaire au Kernel Address Sanitizer (KASAN) de Linux qui effectue également un empoisonnement de la mémoire. Pour autant que je sache, il a été introduit en 2017.

Vous pouvez trouver le code source de cette fonctionnalité ici :

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

0 votes

Corrigez-moi si je me trompe, mais votre réponse ne concerne-t-elle pas l'allocation de mémoire virtuelle (par exemple, les zones du noyau proviennent de la mémoire virtuelle du noyau) ? J'ai compris que la question de l'OP portait sur le niveau physique et sur le fait de savoir si les pages physiques sont mises à zéro lors de l'allocation. Et est-ce que github.com/apple/darwin-xnu/tree/main/osfmk/vm est le code correspondant ?

0 votes

Je soupçonne que vous appliquez au mot "virtuel" une sémantique légèrement différente de celle d'autres personnes ici présentes. Qu'entendez-vous exactement par "mémoire virtuelle" ? (je vérifie juste que nous parlons bien de la même chose avant d'expliquer plus en détail)

0 votes

J'ai oublié de vous envoyer un ping dans le commentaire précédent @Gilby. Notez que je demande simplement parce que je vois souvent que beaucoup utilisent le mot "mémoire virtuelle" pour signifier quelque chose de différent lorsqu'il est utilisé de manière décontractée.

-3voto

user43889 Points 266

Pour répondre à vos questions :

  1. Oui
  2. Depuis 1985, bien que cela nécessite quelques explications.

MacOS utilise un noyau hybride (XNU) basé sur Mach et BSD. Le composant Mach gère les processus et les threads, la communication interprocessus et la gestion des données. gestion de la mémoire . Bien qu'Apple ait ajouté des raffinements, Mach reste la base des parties les plus internes du noyau XNU.

Nous pouvons remonter jusqu'en 1985 pour les origines de Mach fonctionnant sur un DEC VAX. Ce document Mach : Une nouvelle fondation de noyau pour le développement d'UNIX inclut "Mach fournit quelques services de pagination de base à l'intérieur du noyau. La mémoire sans pager est automatiquement remplie à zéro, et la sortie de la mémoire est effectuée vers un pager par défaut."

Ainsi, à partir de 1985, la mémoire était automatiquement remplie de zéro dans les projets/produits basés sur Mach. Cela inclut et toutes les versions de MacOS et OS X.

Pour la documentation actuelle d'Apple, lisez Aperçu de Mach qui comprend : " Le pager par défaut gère la mémoire non persistante, connue sous le nom de mémoire anonyme. La mémoire anonyme est initialisée à zéro,...". Ceci est repris directement de Mac et confirme que la mémoire est initialisée à zéro.

Pour en savoir plus :

  • Extrait de la documentation destinée aux développeurs Apple Guide de programmation du noyau
  • Si vous avez des compétences en programmation de noyaux ou si vous êtes intéressé(e), voir darwin-xnu qui fait partie du code source ouvert d'Apple.
  • Pour une discussion approfondie sur les internes, vous ne pouvez pas faire mieux que le document *Internes du système d'exploitation des livres de Jonathan Levin.
  • Il y a de nombreuses questions sur la gestion de la mémoire de MacOS (OS X) (mais pas votre question spécifique) dans Ask Different. Vous pouvez commencer par aquí .

Je dois préciser que si j'ai toujours eu un intérêt pour les noyaux et les systèmes d'exploitation, je n'ai pas de compétences en programmation de systèmes d'exploitation depuis 1980 environ.

0 votes

Cette réponse est incorrecte, car elle concerne la situation lors de l'allocation de mémoire, alors que la question porte sur la libération de mémoire.

0 votes

@jksoegaard Je pourrais dire que vous coupez les cheveux en quatre. C'est une question de timing. Si vous n'êtes pas d'accord, présentez le cas contraire.

5 votes

L'intérêt de cette fonction est qu'elle peut être utilisée pendant le temps libre, ce qui permet de bénéficier des avantages décrits dans la question. Vous n'obtiendrez pas ces avantages en effectuant la remise à zéro au moment de l'attribution. Il ne s'agit absolument pas de couper les cheveux en quatre.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X