ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Oracle Solaris の管理: セキュリティーサービス Oracle Solaris 11 Information Library (日本語) |
パート II システム、ファイル、およびデバイスのセキュリティー
特殊なファイルアクセス権 (setuid、setgid、スティッキービット)
セキュリティーリスクのあるプログラムからの保護 (タスクマップ)
10. Oracle Solaris のセキュリティー属性 (参照)
22. Kerberos エラーメッセージとトラブルシューティング
プログラムはスタック上でデータの読み取りと書き込みを行います。通常、それらはコード用に特別に指定されたメモリーの読み取り専用部分から実行されます。スタック上のバッファーをオーバーフローさせる一部の攻撃では、新しいコードをそのスタックに挿入し、プログラムにそれを実行させようとします。スタックメモリーから実行権を削除すると、これらの攻撃が成功するのを防ぐことができます。つまり、ほとんどのプログラムは、実行可能スタックを使用せずに正しく機能できます。
64 ビットプロセスには通常、非実行可能スタックがあります。noexec_user_stack 変数を使用すると、32 ビットプロセスのスタックを実行可能にするかどうかを指定できます。32 ビットの SPARC ABI に準拠するために、デフォルト値は 0 になっており、この指定ではスタックは実行可能になります。
この変数が設定されている場合、プログラムがスタック上でコードを実行しようとすると SIGSEGV シグナルが送信されます。このシグナルが送信されると、通常、プログラムはコアダンプして終了します。このようなプログラムは、違反しているプログラム名、プロセス ID、およびプログラムを実行した実ユーザー ID を含む警告メッセージも生成します。例:
a.out[347] attempt to execute code on stack by uid 555
メッセージは、syslog kern 機能が notice レベルの設定されているときに、syslog デーモンによってログに記録されます。このログへの記録は、デフォルトで syslog.conf ファイルに設定されていて、メッセージがコンソールと /var/adm/messages ファイルの両方に送信されることを意味します。詳細は、syslogd(1M) および syslog.conf(4) のマニュアルページを参照してください。
syslog メッセージは、潜在的なセキュリティーの問題を調べるときに役立ちます。また、このメッセージで、noexec_user_stack 変数を設定したために正しく動作しなくなった、実行可能スタックに依存する有効なプログラムを特定することもできます。メッセージを記録しない場合は、/etc/system ファイルで noexec_user_stack_log 変数を 0 に設定します。メッセージは記録されなくなりますが、SIGSEGV シグナルは引き続き送られるので、実行中のプログラムはコアダンプで終了します。
mprotect() 関数を使用すれば、プログラムのスタックが実行可能であることを明示的にマーク付けできます。詳細は、mprotect(2) のマニュアルページを参照してください。また、-M /usr/lib/ld/map.noexstk を使ってプログラムをコンパイルすると、システム全体の設定に関係なく、スタックを非実行可能にできます。