W ^ X e "Once-writable, never executable" sono entrambi sotto-casi di DEP. DEP si occupa di rendere gli accessi in lettura e gli accessi all'esecuzione distinti (una pagina scrivibile è anche una pagina leggibile). W ^ X riguarda l'uso di DEP per applicare un criterio specifico, ovvero che una determinata pagina non può mai essere scrivibile ed eseguibile allo stesso tempo.
La conformità al criterio W ^ X può essere richiesta dal programmatore perché scrivere "dati" e quindi eseguirli in modo affidabile comporta lo svuotamento di alcune cache, che è un'operazione esplicita e costosa. Passare attraverso il kernel (con una chiamata mprotect()
) non è un modo difficile per farlo. D'altra parte, forzare il programmatore a fare queste cose in modo esplicito significa che non succederà in altre situazioni, in particolare quando un utente malintenzionato tenta di sfruttare un overflow del buffer. Questa è una generalizzazione della funzione "stack non eseguibile". (Il buffer overflow è ancora lì, però: W ^ X rende solo la vita più difficile per l'attaccante.)
La politica "scrivibile una volta, mai eseguibile" mi sembra sospetta: non è compatibile con i compilatori JIT. Ad ogni modo, sarebbe un sotto-caso di W ^ X: come W ^ X, in cui la transizione W- > X è proibita.