セキュリティのバグの多くは、デフォルトで読み取り権、書き込み権、および実行権が設定された実行可能スタックで発生します。実行可能スタックには実行権が割り当てられていますが、ほとんどのプログラムは実行可能スタックがなくても正しく機能します。
Solaris 2.6 から、noexec_user_stack 変数が利用できるようになりました。この変数によって、スタックを実行可能として割り当てるかどうかを指定できます。デフォルトでは、この変数は 0 に設定されるため (64 ビットアプリケーションを除く)、プログラムは 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) のマニュアルページを参照してください。
このメッセージは、潜在的なセキュリティの問題を調べるときに役立ちます。また、この変数を設定することによって、正しく動作しなくなった、実行可能スタックに依存する有効なプログラムを確認するのにも役立ちます。メッセージを記録したくない場合、システム管理者は、/etc/system ファイルで noexec_user_stack_log 変数を 0 に設定して無効にします。この場合でも実行プログラムは、SIGSEGV シグナルによってコアダンプします。
プログラムのスタックが実行可能であると明示的にマークを付ける場合は、mprotect を使用します。詳細は、mprotect(2) のマニュアルページを参照してください。
ハードウェアの制限のため、実行可能スタックの問題を捕捉して報告する機能は、sun4m と sun4u プラットフォームでしか利用できません。
スーパーユーザーになるか、同等の役割を引き受けます。
/etc/system ファイルを編集して、次の行を追加します。
set noexec_user_stack=1 |
リブートします。
# init 6 |