跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:安全服务 Oracle Solaris 11 Information Library (简体中文) |
程序读写栈中的数据。通常,程序从内存中专为代码指定的只读部分开始执行。一些可导致栈中的缓冲区溢出的攻击尝试向栈中插入新代码,从而致使程序执行该代码。删除栈内存的执行权限可使这些攻击无法成功。换句话说,大多数程序可以在不使用可执行栈的情况下正常工作。
64 位进程的栈通常不可执行。通过 noexec_user_stack 变量,您可以指定 32 位进程的栈是否可执行。为了符合 32 位 SPARC 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 消息用于观察可能的安全问题。通过设置 noexec_user_stack 变量,该消息还将确定依赖于可执行栈(已被禁止,无法正确执行操作)的有效程序。如果不想记录任何消息,则可以在 /etc/system 文件中将日志变量 noexec_user_stack_log 设置为零。即使未记录消息,SIGSEGV 信号仍可能会导致执行程序终止,同时进行核心转储。
如果希望程序显式将其栈标记为可执行,则可以使用 mprotect() 功能。有关更多信息,请参见 mprotect(2) 手册页。也可以使用 -M /usr/lib/ld/map.noexstk 编译您的程序,从而忽略系统级设置而使栈不可执行。