Écrire sur l’image du processus en cours d’exécution sur Linux

Que se passe-t-il si le processus B écrit (avec un appel habituel à write () syscall) des données dans l’image du processus A pendant que ce dernier s’exécute? Ne va-t-il pas provoquer la corruption de quel processus A s’exécute?

Je suis nouveau sur Linux. Pour autant que je sache, Unix n’impose historiquement pas de verrous obligatoires (comme Windows le fait). Donc, écrire est tout à fait possible.

J’ai cherché sur le Web sans résultat. Lorsque je pose cette question à mes collègues expérimentés sous Linux, ils répondent tous que le processus A a son image entièrement en mémoire.

Néanmoins, à partir de ce que j’ai lu, le kernel peut facilement transférer certaines pages du fichier image de la mémoire, par exemple, lorsque les conditions de mémoire insuffisante sont stressées. Ainsi, sur le disque, certaines pages peuvent potentiellement être corrompues par un autre processus de graveur. ensuite, ils peuvent être échangés dans la mémoire vive et exécutés.

Pensez-vous à un processus d’écriture dans certains /proc/1234/mem d’un autre processus de pid_t 1234?

Ou envisagez-vous un processus écrit dans l’exécutable ELF d’un autre processus?

Les deux scénarios sont très rares et spécifiques à Linux (les autres Posix ne les ont pas), donc je ne sais pas ce qui peut arriver dans ce cas. Mais au moins, le mécanisme d’autorisation devrait en protéger certains.

Voir aussi l’erreur ETXTBSY .

En pratique (comme le montre strace -f /usr/bin/gcc hello.c -o hello ), le compilateur et l’éditeur de liens suppriment l’exécutable avant de l’ open pour écrire l’exécutable. :

 870 stat("hello", {st_mode=S_IFREG|0755, st_size=6096, ...}) = 0 870 unlink("hello") = 0 870 open("hello", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0777) = 17 870 fstat(17, {st_mode=S_IFREG|0755, st_size=0, ...}) = 0 

Donc, pour écrire dans un fichier exécutable, vous devez essayer fort. Bien sûr, lorsque vous faites cela, des accidents vilains peuvent se produire.

Qu’avez-vous lu qui suggère que les pages peuvent être échangées “vers le fichier image”?

Si le système manque de mémoire, les pages seront échangées sur la partition de swap sur le disque, ce qui est différent du fichier exécutable. L’écriture dans le fichier exécutable n’aura aucun effet jusqu’à la prochaine exécution du fichier.

Si, en quelque sorte, vous pouviez écrire sur la page exacte du fichier d’échange (ce qui serait difficile, car vous devriez savoir exactement où et quand les données ont été écrites sur le disque). Si vous l’avez fait, vous pourrez peut-être modifier le code de l’object. Proposez-vous de corrompre l’exécutable ou de modifier de manière intelligente un programme pendant son exécution?

En fait, il n’est pas nécessaire d’avoir une “condition de mémoire insuffisante” pour les pages à échanger. De toute façon, Linux charge les fichiers exécutables “à la demande”, de sorte qu’une page ne soit chargée que lorsqu’elle est requirejse.

Mais voyez ma réponse à la précédente Que se passe-t-il lorsque vous écrasez un exécutable mappé en mémoire?