缓冲区溢出漏洞是当前最常见的网络安全威胁之一,大量系统被攻破并获取 ROOT 权限,背后往往源于本地或远程的缓冲区溢出攻击。那么,是否存在系统层面有效限制此类问题(尤其是堆栈溢出)的方法?下面介绍几种经过实践验证的有效防护方案。
首先来看 Solaris/SPARC 平台的防护手段。通过调整系统参数,可以阻止部分缓冲区溢出攻击,例如早期针对 rdist 的 exploit 程序。具体操作如下:
编辑 /etc/system 文件,添加以下两行配置:
set noexec_user_stack = 1
set noexec_user_stack_log = 1
这两行配置的作用是将系统栈的内存映射从“可读、可写、可执行”(RWX)改为“可读、可写”(RW),这实际上是对 SPARC V8 API 标准默认行为的一种修改。理论上,某些严格遵循该 API 的程序可能会受到影响,但实践中尚未发现兼容性问题。第二个参数更加直接:一旦检测到缓冲区溢出尝试,系统会通过 syslog 记录攻击行为,便于事后排查。
接下来讨论 x86 架构下的问题。对于这类平台,推荐使用 StackGuard 来限制缓冲区溢出攻击。StackGuard 通过在编译时插入“金丝雀”(canary)值,能够有效阻止大量基于栈溢出的攻击代码执行。不过,它的保护也并非绝对安全——《Phrack 56》上曾发表一篇关于绕过 StackGuard 的技术分析,该文也有中文译本(WARNING3 翻译)。这说明防护手段始终在与攻击技术赛跑。
总而言之,技术层面的加固固然重要,但最根本的安全保障始终是系统的基础安全工作,例如密码策略、文件权限管理等。如果连这道防线都没守住,外部防护手段再完善也无济于事。
