Introduction

Un comportement peu connu du pseudofichier /proc/*/mem est sa sémantique de « punch through ». Les écritures effectuées via ce fichier réussissent même si la mémoire virtuelle de destination est marquée comme non modifiable. Ce comportement est intentionnel et utilisé par des projets tels que le compilateur JIT Julia et le débogueur rr.

Contexte Technique

Le noyau Linux utilise le pseudofichier /proc/self/mem pour permettre l'accès à la mémoire virtuelle d'un processus. Cependant, les mécanismes de protection de la mémoire, tels que la bit Write Protect (CR0.WP) et le Supervisor Mode Access Prevention (SMAP), sont censés empêcher l'accès non autorisé à la mémoire. Le noyau contourne ces mécanismes en utilisant des appels système spéciaux, tels que get_user_pages_remote() et kmap(), pour accéder à la mémoire virtuelle.

Analyse et Implications

L'implémentation de /proc/*/mem dans fs/proc/base.c utilise une fonction mem_rw() qui appelle access_remote_vm() pour effectuer les écritures. Cette fonction utilise get_user_pages_remote() pour traduire l'adresse virtuelle de destination en adresse physique, puis kmap() pour mapper cette adresse physique dans l'espace d'adressage virtuel du noyau en tant que modifiable. Enfin, copy_to_user_page() effectue l'écriture. Ce processus contourne les mécanismes de protection de la mémoire, permettant au noyau d'écrire dans des pages de mémoire non modifiables.

Perspective

Ce comportement soulève des questions sur la relation entre le noyau et les mécanismes de protection de la mémoire. Il est important de comprendre comment le noyau contourne ces mécanismes pour accéder à la mémoire virtuelle. Les implications de ce comportement doivent être prises en compte pour assurer la sécurité et la stabilité du système. Les développeurs doivent être conscients de ces mécanismes pour éviter les erreurs de programmation qui pourraient compromettre la sécurité du système.