Skip to content
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

NameTypeDirDescription
addrcaddr_t-
lensize_t-
protint-

Historique des versions

XNU tagmacOS#
xnu-1456.1.26macOS 10.6 Snow Leopard74
xnu-1486.2.1174
xnu-1504.15.374
xnu-1504.3.1274
xnu-1504.7.474
xnu-1504.9.1774
xnu-1504.9.2674
xnu-1504.9.3774

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