系统管理指南:安全性服务

防止可执行文件危及安全

在将可执行栈的权限设置为读写和执行时,很多安全错误与缺省可执行栈有关。虽然允许栈拥有执行权限,但大多数程序可以在不使用可执行栈的情况下正常运行。

使用 noexec_user_stack 变量,可以指定栈映射是否可执行。从 Solaris 2.6 发行版开始,可以使用该变量。缺省情况下,该变量被设置为零(64 位应用程序中除外),这将提供兼容 ABI 的行为。如果将该变量设置为非零值,则系统会将系统中每个进程的栈标记为可读写,但不可执行。

设置此变量后,将向尝试执行其栈中代码的程序发送一个 SIGSEGV 信号。此信号通常将导致程序终止,同时进行核心转储。这样的程序还将生成一条警告消息,该消息中包括违例程序的名称、进程 ID 和运行该程序的用户的实际 UID。例如:


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 消息用于观察可能的安全问题。通过设置此变量,该消息还将确定依赖于可执行栈(已被禁止,无法正确执行操作)的有效程序。如果不想记录任何消息,则可以在 /etc/system 文件中将 noexec_user_stack_log 变量设置为零。即使未记录消息,SIGSEGV 信号仍可能会导致执行程序终止,同时进行核心转储。

如果希望程序显式将其栈标记为可执行,则可以使用 mprotect() 功能。有关更多信息,请参见 mprotect(2) 手册页。

由于硬件限制,在大多数基于 x86 的系统中不能使用捕获和报告可执行栈问题的功能。AMD64 产品系列中的系统可以捕获和报告可执行栈问题。