Mémoire · Section 2
munmap(2)
Démappe une région mémoire précédemment créée par mmap.
Signature
#include <sys/mman.h>
int munmap(void * addr, size_t length);- addr
- Adresse de départ alignée page de la plage à démapper.
- length
- Taille de la plage en octets. Arrondie au multiple supérieur de la taille de page.
Description
munmap() retire les projections pour la plage [addr, addr+length). Toute référence ultérieure dans cette plage génère SIGSEGV. Le noyau arrondit length au multiple supérieur de la taille de page ; addr doit déjà être aligné page. Démapper une partie d'une projection plus large est légal et fréquent : le noyau découpe le VMA en conséquence. Démapper une plage sans projection est aussi légal (l'appel réussit sans rien faire). À la sortie du processus toutes les projections sont retirées automatiquement ; munmap() explicite sert aux processus longs souhaitant libérer la mémoire vite, aux JIT qui jettent leur code généré, ou aux bacs à sable imposant W^X en démappant les copies inscriptibles après recopie vers des pages exécutables.
Numéros par architecture
| Architecture | Numéro | ABI | Point d'entrée |
|---|---|---|---|
| x86 (i386) | 91 | i386 | sys_munmap |
| x64 (x86_64) | 11 | common | sys_munmap |
| ARM64 (aarch64) | 215 | — | sys_munmap |
Historique noyau
Introduit dans Linux 1.0.
1.0
munmap() est présent dans Linux depuis 1.0 avec la sémantique POSIX classique.
seccomp & conteneurs
Docker default profile
Autorisé
Podman default profile
Autorisé
munmap() est autorisé par défaut et en pratique impossible à bloquer : tout programme qui appelle mmap() appelle aussi munmap(). Pas de filtre d'arguments utile — la disposition de l'espace d'adressage étant imprévisible avec ASLR, on ne peut pas restreindre par plage d'addr.
libseccomp
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(munmap), 0);Exemple strace
$ strace -e mmap,munmap cat /etc/hostname > /dev/null
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3a8c4f3000
munmap(0x7f3a8c4f3000, 4096) = 0munmap() dans strace est peu informatif isolément ; c'est la queue de chaque paire mmap()/free-grand-bloc. Utile pour traquer les fuites mémoire : un processus qui mmap() sans munmap() montre une croissance régulière du RSS — strace -c révèle le déséquilibre immédiatement.
Sécurité & observabilité
munmap() apparaît rarement directement dans les attaques, mais les motifs JIT-spray et loaders de shellcode incluent mmap(PROT_RWX) → write → mprotect(PROT_RX) → exécution, avec munmap() de nettoyage final. La détection cible l'étape mmap+mprotect, pas le munmap. Le tracepoint eBPF sys_enter_munmap existe mais est rarement utilisé en supervision — trop bruyant et trop tardif.
Erreurs
- EINVAL
- addr non aligné page, length nul, ou la plage déborde de l'espace d'adressage.