PaX
PaX は、あるメモリページが書き込み可能でかつ実行可能とならないことを保証する。mprotect() という関数は、メモリ領域のパーミッションを変更する機能を持つ。Single UNIX Specification では、mprotect() について以下のように記述されている。
「prot で指定されたアクセス型の組合せをサポートできない実装である場合、mprotect() コールは失敗するだろう」
PaX では、mprotect() で PROT_WRITE と PROT_EXEC を同時に指定できないよう制限している。そのような mprotect() コールには EACCESS というエラーが返される。これにより、単純なコード注入攻撃を防ぐ。また、PROT_EXEC が既に ON になっていないページについて PROT_EXEC を ON にする mprotect() コールも失敗する。これは、予めコードを書き込んだデータ用ページを後から実行可能にするような攻撃を防ぐ。
mprotect() の制限を ON にしていると、プログラムは PaX が最初に設定したメモリ確保のポリシーを逸脱するような動作が不可能となる。これをしないで実行不可ページを厳密に実行不可にしても、あまり意味がない。
Stack Smashing Protector や StackGuard はバッファオーバフローそのものを検出し、そのような動作をしようとしたプログラムを終了させる。このような手法を Stack Smashing Protection と呼び、実際にオーバフロー状態となる前に防ぐ。一方 PaX はより汎用的な手法であり、オーバフローが発生してから実際のダメージが発生するのを防ぐ。どちらの手法でも結果的には同じ効果が得られるが、完全に重複する手法というわけではない。従って、両方の手法を同時に使うことで、システムをより安全にすることが(原理的には)可能である。一部のLinuxディストリビューションでは、PaX と Stack Smashing Protection の両方を採用している。
2004年中ごろ、PaXはLinuxカーネルのメインのソースツリーには含まれていなかった。これは、PaXチームがPaXを不完全であると考えていたためである。x86を含む多くのCPUアーキテクチャでは完全に機能しているが、いくつかのアーキテクチャでは部分的にしか実装されていないか、全く実装されていない。PaXが実装されているアーキテクチャとしては、IA-32 (x86)、AMD64、IA-64、Alpha、PA-RISC、MIPS、PowerPC、SPARC がある。