「PaX」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(update Pkg/AUR templates)
 
1行目: 1行目:
[[Category:カーネル]]
+
#redirect[[セキュリティ#カーネルの防御]]
[[Category:セキュリティ]]
 
[[en:PaX]]
 
{{Related articles start}}
 
{{Related|grsecurity}}
 
{{Related|セキュリティ}}
 
{{Related articles end}}
 
 
[[Wikipedia:ja:PaX|PaX]] は [[grsecurity]] パッチのサブセットとして開発されており、公式リポジトリの {{pkg|linux-grsec}}{{Broken package link|{{aur-mirror|linux-grsec}}}} パッケージに含まれています。スタンドアロンのパッケージとして [[AUR]] の {{aur|linux-pax}}{{Broken package link|package not found}} でインストールすることも可能です。
 
 
PaX にはメモリ破損を利用する攻撃から身を守る [[grsecurity]] の機能のほとんどが含まれています。完全な[[Wikipedia:ja:アドレス空間配置のランダム化|アドレス空間配置のランダム化]]、カーネルとユーザー空間のコード/データの分離の強化、情報を漏洩する恐れがある様々なクラスの排除など、PaX は様々な方法でカーネルやユーザー空間のプロセスを堅牢化します。カーネルのハードニング機能はユーザーには大きな影響がありませんが、MPROTECT / RANDMMAP 機能はいくつかのアプリケーションを別扱いにする必要を生じさせます。
 
 
PaX だけを使用するのは推奨されません。他の grsecurity の機能と一緒に使うことによる相乗効果が重要だからです。例えば、完全な PaX の ASLR でも、攻撃者がファイルシステムにアクセスできる場合は、[https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Harden_ASLR_against_information_leaks_and_entropy_reduction GRKERNSEC_PROC_MEMMAP 機能] がないと打破される可能性があります。
 
 
== パフォーマンス ==
 
 
=== 調整可能パラメータ ===
 
 
{{ic|1=pax_sanitize_slab=0}} オプションを kernel 行に設定することでスラブオブジェクトサニタイズを無効化することができます。この設定をするとカーネルから情報が漏洩する危険性が増えますが、{{ic|CONFIG_PAX_MEMORY_SANITIZE}} によるパフォーマンスの影響が減ります (デフォルトのカーネルコンパイルなら ~3%)。
 
 
{{ic|1=pax_nouderef}} オプションを kernel 行に設定することで UDEREF を無効化することができます。i686 ではあまり意味がありません。メモリのセグメンテーションを利用できるようになり仮想環境によってはパフォーマンスに大きな問題を発生させることがあるからです。x86_64 では、UDEREF の実装は3つあります:
 
 
* 遅くて脆弱なレガシーな実装 (~10% ほどカーネルコンパイルが遅くなります)
 
* Sandy Bridge 以降で使える強固な実装 (サポートされている場合はデフォルト、{{ic|1=nopcid}} でレガシーな実装が使えます)
 
* Sandy Bridge 以降で使える高速で脆弱な実装 (使用するには {{ic|1=pax_weakuderef}} と設定します)
 
 
=== カスタムカーネル ===
 
 
カスタムカーネルをビルドすることで、パフォーマンスとセキュリティの妥協点を自由にコントロールすることができます。ビルド済みの {{pkg|linux-grsec}}{{Broken package link|{{aur-mirror|linux-grsec}}}} パッケージはパフォーマンスよりもセキュリティを優先しています。i686 では、{{ic|CONFIG_PAX_MEMORY_SANITIZE}} と {{ic|CONFIG_PAX_MEMORY_STACKLEAK}} を無効化することでパフォーマンスへの影響を抑えられます。x86_64 では、前記のオプションと共に {{ic|CONFIG_PAX_MEMORY_UDEREF}} を無効化することで同じことになります。ただし、上で説明したように {{ic|pax_nouderef}} で実行時に変えることもできます。
 
 
== PaX 例外 ==
 
 
PaX による脆弱性攻撃の緩和機能には特定のアプリケーションを実行できなくしてしまうものも含まれており、実行可能ファイルを例外として指定する必要があります。拡張属性を使って実行可能ファイルから機能の適用を除外することが可能です。例えば、MPROTECT と RANDMMAP 機能を無効化するには:
 
 
$ setfattr -n user.pax.flags -v "emr" /usr/bin/問題のバイナリ
 
 
{{Note|{{pkg|linux-grsec}}{{Broken package link|{{aur-mirror|linux-grsec}}}} パッケージは拡張属性''のみを''サポートしています。ELF 例外マーカーのサポートは含まれていません。拡張属性は特殊なツールを必要とせず、バイナリに変更を加える必要もありません。従ってずっと優れた設定方法です。}}
 
 
様々な機能の中でも MPROTECT 機能が一番問題を起こしやすく、{{pkg|linux-grsec}}{{Broken package link|{{aur-mirror|linux-grsec}}}} ではデフォルトでカーネルログに[[Grsecurity#監査|違反を記録]]しています。[[Grsecurity]] の PaX サブセットだけではこうした問題を判断するのは困難です。
 
 
{{pkg|pax-utils}} パッケージに便利なツールが含まれています。例えば、{{ic|pspax}} ユーティリティはカーネルのパースペクティブとケーパビリティから PaX のパーミッションを表示することができます。{{ic|scanelf}} ツールを使えばバイナリの属性を確認できます。
 
 
One might also use getfattr to retrieve extended attributes set above (or set by paxd described below) if they choose not to run pax-utils or if they want to check the attributes of a process not running:
 
$ getfattr -n user.pax.flags /usr/bin/problematic_binary
 
 
=== paxd パッケージを使う ===
 
 
公式リポジトリの {{pkg|paxd}}{{Broken package link|package not found}} パッケージには、実行可能ファイルが更新されたり設定ファイルが修正されたときに自動で {{ic|/etc/paxd.conf}} から PaX の例外を適用するデーモンが入っています。パッケージによって提供されているバイナリに例外を適用する方法として、公式でサポートされています。
 
 
==== ユーザーの例外 ====
 
 
A user service is provided for users to apply exceptions, primarily to files in their home directory. It can be started / enabled with {{ic|systemctl --user}} and will apply exceptions from {{ic|$XDG_CONFIG_HOME/paxd.conf}} (falling back to {{ic|~/.config/paxd.conf}}).
 
 
=== ソフトモード ===
 
 
[[sysctl]] で {{ic|1=kernel.pax.softmode=1}} を設定すると、例外を設定する代わりに、脆弱性対策の許諾を設定するようになります。サーバーで動作するウェブサービスなど、リスクが高い特定のバイナリだけに対策を課したいときに使うことができます。ただし、脆弱性緩和機能の例外を設定するほうがセキュリティ上効果が高く、{{pkg|paxd}}{{Broken package link|package not found}} を使えば大体の作業は自動化することが可能です。
 
 
== ユーザー空間の機能のテスト ==
 
 
{{pkg|paxtest}} ツールを使うことで、ユーザー空間の脆弱性攻撃の緩和機能をテストすることができます。
 
 
{{hc|Vanilla kernel (x86_64)|Executable anonymous mapping : Killed
 
Executable bss : Killed
 
Executable data : Killed
 
Executable heap : Killed
 
Executable stack : Killed
 
Executable shared library bss : Killed
 
Executable shared library data : Killed
 
Executable anonymous mapping (mprotect) : Vulnerable
 
Executable bss (mprotect) : Vulnerable
 
Executable data (mprotect) : Vulnerable
 
Executable heap (mprotect) : Vulnerable
 
Executable stack (mprotect) : Vulnerable
 
Executable shared library bss (mprotect) : Vulnerable
 
Executable shared library data (mprotect): Vulnerable
 
Writable text segments : Vulnerable
 
Anonymous mapping randomisation test : 28 quality bits (guessed)
 
Heap randomisation test (ET_EXEC) : 13 quality bits (guessed)
 
Heap randomisation test (PIE) : 28 quality bits (guessed)
 
Main executable randomisation (ET_EXEC) : 28 quality bits (guessed)
 
Main executable randomisation (PIE) : 28 quality bits (guessed)
 
Shared library randomisation test : 28 quality bits (guessed)
 
VDSO randomisation test : 11 quality bits (guessed)
 
Stack randomisation test (SEGMEXEC) : 28 quality bits (guessed)
 
Stack randomisation test (PAGEEXEC) : 28 quality bits (guessed)
 
Arg/env randomisation test (SEGMEXEC) : 20 quality bits (guessed)
 
Arg/env randomisation test (PAGEEXEC) : 20 quality bits (guessed)
 
Randomization under memory exhaustion @~0: 28 bits (guessed)
 
Randomization under memory exhaustion @0 : 28 bits (guessed)
 
Return to function (strcpy) : paxtest: return address contains a NULL byte.
 
Return to function (memcpy) : Killed
 
Return to function (strcpy, PIE) : paxtest: return address contains a NULL byte.
 
Return to function (memcpy, PIE) : Killed
 
}}
 
 
{{hc|PaX kernel (x86_64 without UDEREF)|Executable anonymous mapping : Killed
 
Executable bss : Killed
 
Executable data : Killed
 
Executable heap : Killed
 
Executable stack : Killed
 
Executable shared library bss : Killed
 
Executable shared library data : Killed
 
Executable anonymous mapping (mprotect) : Killed
 
Executable bss (mprotect) : Killed
 
Executable data (mprotect) : Killed
 
Executable heap (mprotect) : Killed
 
Executable stack (mprotect) : Killed
 
Executable shared library bss (mprotect) : Killed
 
Executable shared library data (mprotect): Killed
 
Writable text segments : Killed
 
Anonymous mapping randomisation test : 33 quality bits (guessed)
 
Heap randomisation test (ET_EXEC) : 22 quality bits (guessed)
 
Heap randomisation test (PIE) : 40 quality bits (guessed)
 
Main executable randomisation (ET_EXEC) : 33 quality bits (guessed)
 
Main executable randomisation (PIE) : 33 quality bits (guessed)
 
Shared library randomisation test : 33 quality bits (guessed)
 
VDSO randomisation test : 33 quality bits (guessed)
 
Stack randomisation test (SEGMEXEC) : 40 quality bits (guessed)
 
Stack randomisation test (PAGEEXEC) : 40 quality bits (guessed)
 
Arg/env randomisation test (SEGMEXEC) : 44 quality bits (guessed)
 
Arg/env randomisation test (PAGEEXEC) : 44 quality bits (guessed)
 
Randomization under memory exhaustion @~0: 33 bits (guessed)
 
Randomization under memory exhaustion @0 : 33 bits (guessed)
 
Return to function (strcpy) : paxtest: return address contains a NULL byte.
 
Return to function (memcpy) : Killed
 
Return to function (strcpy, PIE) : paxtest: return address contains a NULL byte.
 
Return to function (memcpy, PIE) : Killed
 
}}
 
 
{{hc|PaX kernel (x86_64 with UDEREF)|Executable anonymous mapping : Killed
 
Executable bss : Killed
 
Executable data : Killed
 
Executable heap : Killed
 
Executable stack : Killed
 
Executable shared library bss : Killed
 
Executable shared library data : Killed
 
Executable anonymous mapping (mprotect) : Killed
 
Executable bss (mprotect) : Killed
 
Executable data (mprotect) : Killed
 
Executable heap (mprotect) : Killed
 
Executable stack (mprotect) : Killed
 
Executable shared library bss (mprotect) : Killed
 
Executable shared library data (mprotect): Killed
 
Writable text segments : Killed
 
Anonymous mapping randomisation test : 29 quality bits (guessed)
 
Heap randomisation test (ET_EXEC) : 22 quality bits (guessed)
 
Heap randomisation test (PIE) : 35 quality bits (guessed)
 
Main executable randomisation (ET_EXEC) : 29 quality bits (guessed)
 
Main executable randomisation (PIE) : 29 quality bits (guessed)
 
Shared library randomisation test : 29 quality bits (guessed)
 
VDSO randomisation test : 29 quality bits (guessed)
 
Stack randomisation test (SEGMEXEC) : 35 quality bits (guessed)
 
Stack randomisation test (PAGEEXEC) : 35 quality bits (guessed)
 
Arg/env randomisation test (SEGMEXEC) : 39 quality bits (guessed)
 
Arg/env randomisation test (PAGEEXEC) : 39 quality bits (guessed)
 
Randomization under memory exhaustion @~0: 29 bits (guessed)
 
Randomization under memory exhaustion @0 : 29 bits (guessed)
 
Return to function (strcpy) : paxtest: return address contains a NULL byte.
 
Return to function (memcpy) : Killed
 
Return to function (strcpy, PIE) : paxtest: return address contains a NULL byte.
 
Return to function (memcpy, PIE) : Killed
 
}}
 
 
== 参照 ==
 
* [https://pax.grsecurity.net/docs/ PaX ドキュメント]
 

2017年5月14日 (日) 11:58時点における最新版