Théoriquement, si je devais construire un programme qui a affecté toute la mémoire inutilisée sur un système et a continué à demander de plus en plus de mémoire que d'autres applications publiées de mémoire qu'elles n'ont plus besoin, seraient-elles possible de lire la mémoire récemment libérée d'une autre application ? Ou est-ce une en quelque sorte protégée par le système d'exploitation moderne?
Je n'ai aucune demande pratique pour cela, je suis juste curieux. Je me rends compte qu'il y a des problèmes avec l'allocation de "toutes les mémoires disponibles" dans la vie réelle.
Edit: Pour clarifier, je demande spécifiquement de la mémoire "publiée", sans accéder à la mémoire qui est actuellement allouée par une autre application.
Non, car un bon noyau essuie le contenu de la mémoire avant qu'il soit délivré à un processus de protection contre le type d'attaque que vous proposez.
Sur les systèmes UNIXY, la mémoire est allouée aux processus en extension de ce qu'on appelle la touche pause-programme, qui est la limite d'espace pratiquement adressable qu'un processus peut utiliser. Un processus indique au noyau qu'il souhaite étendre son espace adressable et le noyau lui permettra si la mémoire est disponible ou que l'appel échoue, sinon. (Le nom de l'appel du système brk()
vient de ce concept.)
En pratique, de grands blocs de mémoire libérés ne sont pas souvent recouverts de la pause du programme, ce qui serait nécessaire pour un processus de retour au noyau en rétrécissant la pause du programme. Cela dépend bien sûr de la mise en œuvre de votre système de malloc()
et free()
. Si vous avez des sources disponibles, ils vous diront que la mémoire est jamais revenue.
Il n'y a pas d'implications de sécurité pour malloc()
non initialisation de la mémoire, car tout ce qu'il a eu via brk()
_ aura été nettoyé et tout ce qui aura précédemment free()
D aura été écrits par le même processus .
Oui, il est théoriquement possible de lire une autre mémoire de processus. C'était la source d'un certain nombre d'attaques d'escalade de privilège de retour dans la journée. En raison de cela, les systèmes d'exploitation sont aujourd'hui efficacement zéro de la mémoire si elle était précédemment allouée par un autre processus. La raison pour laquelle vous ne voyez pas toujours la mémoire zéro est parce qu'elle est plus efficace de ne pas zéro de la mémoire si elle était précédemment allouée par le même processus. Le système d'exploitation tente de redonner des pages de mémoire au même processus s'il le peut.
Il y a plusieurs couches impliquées ici qui affectent la réponse.
Si vous supposez un système d'exploitation de mémoire virtuelle moderne, vous ne pourrez pas voir les restes d'un autre processus de données dans les pages que vous allouez.
Lorsqu'un processus est chargé d'abord, la table de page est chargée et potentiellement des cadres de mémoire réelle sont attribués à ces pages. Au minimum, la table de page ou sa table supplémentaire contiendra une carte de toutes les mémoires que le processus peut allouer. C'est également là que la pause initiale du processus, mentionnée ci-dessus, est définie.
Tandis que MALLOC () peut, si le processus est autorisé, car le processus de rupture de processus change, ajoutant plus de pages à une table de processus (page complémentaire) pour satisfaire la demande, l'endroit où un processus peut "obtenir un autre" processus de processus est à la couche de mémoire réelle inférieure.
Dans ces deux scénarios, un système d'exploitation moderne utilisant la pagination de la demande ou une allocation paresseuse n'est pas encore allouée à la mémoire physique (cadres). Le système d'exploitation vient de "prendre des notes" sur quelle mémoire virtuelle pour ce processus est considérée comme valide. La mémoire réelle n'est assignée que si nécessaire.
La mémoire physique ou les cadres sont alloués à un processus lorsque la page virtuelle est réalisée et mappée dans une table de processus de processus, il existe le potentiel d'exposition des données. Cela se produit pendant une faute de page. L'exposition est dû au fait qu'un processus précédent a peut-être pu utiliser ce même cadre et ses données ont été abandonnées ou échangées, afin de faire de la place pour la demande de mémoire physique actuelle. Le système d'exploitation doit veiller à ce que les données de processus demandeurs soient correctement échangées dans ou que le cadre est effacé (zéro) avant de reprendre le processus. Ceci est également mentionné ci-dessus comme un problème "vieux mais résolu".
Cela le rend quelque peu pertinent si l'autre processus de processus était "libéré" ou non. Un autre processus "publié" la mémoire réside toujours dans des pages attribuées à ce processus et ne sont généralement pas malappelées tant que le processus se termine car ils seront simplement échantillonnés lorsque la mémoire devient faible ou qu'elles sont expulsées. MALLOC () et GRATUIT () Gérer la mémoire virtuelle attribuée au processus au niveau (utilisateur).
Dans votre question, votre processus continue de demander de plus en plus de mémoire, en théorie, en poussant tous les autres processus hors de la mémoire. En réalité, il existe des stratégies d'allocation de trames - globales et locales - cela pourrait également affecter la réponse. Il est aussi probable que le processus obligeait ses propres pages hors de mémoire avant qu'il ne soit autorisé à dépasser le système d'exploitation et à tous les autres processus. Bien que cela dépasse votre question initiale.
Tout cela est discutable dans un système comme MS-DOS. MS-DOS (et d'autres systèmes simples) n'utilise pas de mémoire virtuelle (par elles-mêmes) et vous pouvez facilement piquer et pousser à un autre "processus".
Certaines bonnes références qui peuvent être plus faciles à comprendre que le code source Linux constitueraient un bon livre de texte de systèmes d'exploitation, des concepts de systèmes d'exploitation de SilbersCatz, de Gavin et de la conception de systèmes d'exploitation par Andrew Tanenbaum. Aussi quelque chose comme les nachos de Berkeley ou Pintos de Stanford sont de petits systèmes d'exploitation construits pour apprendre et avoir ces mêmes idées en eux.