OpenBSD默认未启用的额外内存加固机制技术问询
OpenBSD 默认未启用的内存加固机制(除指定项外)
针对你提到的需求,除了malloc.conf的"S"选项、调大kern.stackgap_random和移除wxallowed挂载选项外,OpenBSD还有这些默认未启用的内存相关加固机制——不少思路确实源自grsecurity,但因兼容性问题(大量端口应用会因代码不规范崩溃)默认关闭:
malloc.conf的F与J选项(内存填充与释放后标记)F会在分配内存前用0xff填充,释放后也用0xff覆盖,能有效检测未初始化内存使用和释放后重用的漏洞;J则是在分配的内存块前后加入随机化的 guard 区域,防止缓冲区溢出越界。- 开启方式:在
/etc/malloc.conf中添加FJ,或设置环境变量MALLOC_OPTIONS=FJ。 - 兼容性问题:部分老旧应用依赖未初始化内存的默认零值,或直接访问内存块边界外的区域,开启后会崩溃。
内核编译选项
options GCCRELR- 让内核使用相对重定位(RELR)替代传统的绝对重定位,彻底消除内核中的绝对内存地址,大幅提升ROP攻击的难度——这和grsecurity的RELRO加固思路一致。
- 开启方式:修改
/usr/src/sys/arch/$(uname -m)/conf/GENERIC配置文件,添加options GCCRELR,然后重新编译安装内核。 - 兼容性问题:少数闭源驱动或老旧内核模块依赖绝对地址,无法正常加载。
内核编译选项
options PAEXEC- 这是OpenBSD对标grsecurity PaX EXEC的实现,会强制严格执行内存页的WX规则,甚至拦截应用试图通过`mprotect`或`mmap`将数据页设置为可执行的操作,比默认的WX机制更严格。
- 开启方式:在GENERIC内核配置中添加
options PAEXEC,重新编译内核。 - 兼容性问题:大量依赖JIT(即时编译)的应用(如部分JavaScript引擎、游戏模拟器)会因无法生成可执行代码而崩溃。
内核编译选项
options SSP_STRONG- 增强版的栈溢出保护,会对内核中几乎所有函数应用栈保护(Stack Smashing Protector),而默认仅对高危函数启用。这能有效防范内核栈溢出漏洞。
- 开启方式:在GENERIC配置中添加
options SSP_STRONG,重新编译内核。 - 兼容性问题:部分内核代码(尤其是第三方驱动)因栈布局不规范,会触发保护机制导致内核 panic。
内核编译选项
options NOEXEC_USERSTACK- 强制用户空间栈不可执行,即使应用尝试通过系统调用修改栈的执行权限也会被内核拒绝,进一步阻断栈溢出后的代码执行攻击。
- 开启方式:在GENERIC配置中添加
options NOEXEC_USERSTACK,重新编译内核。 - 兼容性问题:一些老旧的自修改代码、手写汇编的应用(如部分复古游戏)会直接崩溃。
内容的提问来源于stack exchange,提问作者Hessnov
相关产品推荐
相关产品推荐

