Oracle® Solaris 11.2 でのファイルのセキュリティー保護とファイル整合性の検証

印刷ビューの終了

更新: 2014 年 7 月
 
 

実行可能ファイルを原因とするセキュリティーへの悪影響を防止する

プログラムは、スタック上のデータの読み取りと書き込みを行います。通常、それらはコード用に特別に指定されたメモリーの読み取り専用部分から実行されます。スタック上のバッファーをオーバーフローさせる一部の攻撃では、新しいコードをそのスタックに挿入し、プログラムにそれを実行させようとします。スタックメモリーから実行権を削除すると、これらの攻撃が成功するのを防ぐことができます。つまり、ほとんどのプログラムは、実行可能スタックを使用せずに正しく機能できます。

64 ビットプロセスには通常、非実行可能スタックがあります。デフォルトでは、32 ビット SPARC プロセスには実行可能スタックがあります。noexec_user_stack 変数を使用すると、32 ビットプロセスのスタックを実行可能にするかどうかを指定できます。

この変数が設定されている場合、プログラムがスタック上でコードを実行しようとすると 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 でコンパイルされたプログラムは、システム全体の設定には関係なく、スタックを非実行可能にします。