在 Oracle® Solaris 11.2 中确保文件的安全和确认文件完整性

退出打印视图

更新时间: 2014 年 7 月
 
 

防止可执行文件危及安全

程序读写栈中的数据。通常,程序从内存中专为代码指定的只读部分开始执行。一些可导致栈中的缓冲区溢出的攻击尝试向栈中插入新代码,从而致使程序执行该代码。删除栈内存的执行权限可使这些攻击无法成功。换句话说,大多数程序可以在不使用可执行栈的情况下正常工作。

64 位进程的栈通常不可执行。缺省情况下,32 位 SPARC 进程具有可执行栈。利用 noexec_user_stack 变量,可以指定 32 位进程的栈是否可执行。

设置此变量后,将向尝试执行其栈中代码的程序发送一个 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 编译的程序都将使栈不可执行。