Syscall BSD#74
svc · unix #74
mprotect
Modifie la protection (lecture / écriture / exécution) d'une plage de pages mappées.
Prototype
int mprotect(caddr_t addr, size_t len, int prot);Retour: int
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| addr | caddr_t | - | |
| len | size_t | - | |
| prot | int | - |
Historique des versions
| XNU tag | macOS | # |
|---|---|---|
| xnu-1456.1.26 | macOS 10.6 Snow Leopard | 74 |
| xnu-1486.2.11 | — | 74 |
| xnu-1504.15.3 | — | 74 |
| xnu-1504.3.12 | — | 74 |
| xnu-1504.7.4 | — | 74 |
| xnu-1504.9.17 | — | 74 |
| xnu-1504.9.26 | — | 74 |
| xnu-1504.9.37 | — | 74 |
Exemples
C — make a page executable
if (mprotect(jit, 0x4000, PROT_READ | PROT_EXEC) != 0) {
perror("mprotect");
}Notes
mprotect(2) se traduit par un mach_vm_protect() sur le vm_map de la tâche. Avec le hardened runtime, passer une page à PROT_EXEC exige que l'objet sous-jacent ait été créé avec MAP_JIT ou chargé depuis un Mach-O signé. Sur Apple Silicon, la bascule est couplée à pthread_jit_write_protect_np() qui ajuste le mode W^X APRR/SPRR par thread.
Détection
Endpoint Security émet ES_EVENT_TYPE_NOTIFY_MPROTECT avec les bits de protection et la plage. La sonde syscall::mprotect:entry de DTrace fournit l'équivalent à faible coût.
API associées
mmapmach_vm_protectvm_protectpthread_jit_write_protect_np