7
votes

Quels sont les drapeaux de protection de la mémoire alloués par Malloc?

Selon Ce fil , mémoire allouée par malloc < / code> au moins avoir prot_read | Prot_exec , sinon la fonction contanée ne peut pas être exécutée.

homme malloc ne mentionne rien de la protection ainsi la question.


4 Réponses :


2
votes

5 commentaires

Semble pas, voir le paragraphe lié, il n'implique pas mProtect qui indique la mémoire renvoyée par malloc a déjà prot_exec activé.


@Je rog: ok - je suis surpris que Linux se distingue prot_exec par défaut pour la mémoire Malloc'd - il se peut que d'autres systèmes d'exploitation prennent une approche plus défensive - si votre question est spécifique à Linux, alors Vous devriez probablement étiqueter linux .


Oui, c'est le cas, je veux savoir quels autres drapeaux sont définis mais Man Malloc ne donne aucun indice. De plus, je ne sais pas si c'est spécifique Linux, alors je ne pense pas qu'il soit approprié d'ajouter cette balise.


@JE ROG: Il est probablement préférable de ne pas faire d'hypothèses, en particulier si vous vous souciez de la portabilité et d'être une preuve future.


Les anciens processeurs X86 n'ont pas d'exécution de bits d'autorisation pour les pages, de sorte que la permission est généralement une autorisation implicite de l'exécution. Les CPU plus récents ont un bit NX (non exécuté).



5
votes

malloc () retournera normalement la mémoire avec des autorisations de lecture et d'écriture. Certaines architectures (E.G: plus âgée x86) peuvent ne pas permettre la désactivation de l'exécution de l'autorisation de manière simple, mais c'est juste une dégénéfice de la plate-forme.

Si vous souhaitez exécuter du code à partir de la mémoire que vous avez alloué, vous devrez donner des autorisations d'exécution explicitement, et éventuellement vous devrez supprimer les autorisations d'écriture, car il est à la fois d'écrire et d'exécuter des autorisations sur la même mémoire est considérée comme potentiellement dangereuse. sur certains systèmes (communément appelé w ^ x).

Il y a eu plusieurs autres threads sur l'exécution du code de la mémoire allouée par le programmeur:

allouer de la RAM exécutable en C sur Linux
est-il possible d'exécuter du code de la pile en standard c?


1 commentaires

Avez-vous une machine qui a le bit NX pour le tester?



6
votes

MALLOC n'est pas le bon outil d'attribution de mémoire pour le code. Vous devez utiliser MMAP et, en fonction des stratégies de sécurité paranoïaque de votre système, vous devrez peut-être utiliser MProtect pour changer les autorisations.

Parmi les raisons MALLOC n'est pas le bon outil:

  • Les autorisations sont définies uniquement avec la granularité de la page, mais la mémoire obtenue par MALLOC est peu susceptible d'être alignée à la page, et vous finirez ainsi de définir des autorisations sur la mémoire adjacente aussi, éventuellement casser des choses. < / li>
  • Si vous ne restaurez pas les anciennes autorisations avant d'appeler GRATUIT , vous risquez de casser MALLOC S internals.

8 commentaires

En ce qui concerne Les autorisations sont définies uniquement avec la granularité de page , avez-vous la mémoire renvoyée par VOID * MMAP (VOID * Démarrer, Taille_T Longueur, int Prot, Int Drapeaux, int FD, Off_T Offset); < / code> est toujours dans l'unité de page? Ne semble pas être garnuant par paramètre .


@JE ROG: Oui, MMAP () crée des mappages de mémoire, qui ont une granularité de page (sauf sur! MMU Systems)


Et "! MMU" ne peut pas être conforme à POSIX (qui nécessite une protection de la mémoire).


@ninjalj, la longueur n'a pas besoin d'être un multiple de page, comment venir? Cela signifie-t-il si nous MMAP 4000 octets, puis 96 octets seront gaspillés?


@Je ROG: Ils seront mappés, voir / proc / / maps sur Linux.


La longueur sera arrondie jusqu'à la taille de la page multiple.


Un fichier est mappé en multiples de la taille de la page. Pour un fichier qui n'est pas un multiple de la taille de la page, la mémoire restante est mise à zéro lorsque mappée et écrit à cette région n'est pas écrite dans le fichier. L'effet de la modification de la taille du fichier sous-jacent d'un mappage sur les pages correspondant à des régions ajoutées ou supprimées du fichier est indéterminée.


@R .., non arrondi, je pense que gaspillé est plus précis puisque l'effet de l'écriture sur les 96 octets supplémentaires n'est pas spécifié.



0
votes

La fonction de bibliothèque MALLOC () est spécifiée par la norme de langage C. Il est donc identique sur tous les systèmes d'exploitation. La protection de la mémoire est fonction du processeur et du système d'exploitation. Elle est donc faite différemment sur Windows, Linux, etc.

La manière dont ces travaux ont changé au fil des ans depuis que Malloc () a été défini. Je me souviens que la plupart des transformateurs n'avaient pas pris en charge une autorisation "exécutable" distincte pour la mémoire - si elle était lisible, elle était exécutable. De nombreux systèmes intégrés n'ont aucune protection de la mémoire, toutes les mémoires peuvent être lues, écrites et exécutées. La fonction MALLOC () fonctionne de la même manière dans tous ces cas.


0 commentaires