从 OpenBSD 6.0 开始,强制实施 W^X 强制执行。
需要权限才能违反此规则的二进制文件可以使用 ld 命令进行标记:
根据 ld -zwxneeded 设置的 WX_OPENBSD_WXNEEDED 标志,在 execve(2) 时识别 W^X 标记的二进制文件。
我试过:
ld -b <binary> -zwxneeded
ld <binary> -zwxneeded
# ld -b sbcl -zwxneeded
ld: no input files
# ld sbcl -zwxneeded
sbcl: could not read symbols: File format not recognized
我一直在阅读 ld 手册页,但无法找出文件 I/O 设置所需标志的正确语法。非常感谢任何帮助/建议。
答案1
重读 openBSD 升级指南后找到答案,必须在 fstab 中调整文件系统挂载选项。
wxallowed 挂载选项。 W^X 现在默认严格执行;仅当程序位于使用 wxallowed mount(8) 选项挂载的文件系统上时,程序才能违反它。只要 /usr/local 是一个单独的文件系统,这就可以使基本系统更加安全。
基本系统没有违反 W^X 的程序,但 ports 树包含相当多的程序:chromium、mono、node、gnome、libreoffice、jdk、zeal 等。如果您想定期运行这些 ports 中的任何一个,您需要将 wxallowed 添加到 fstab(5) 中 /usr/local 的挂载选项中,例如:
01020304050607.h /usr/local ffs rw,nodev,wxallowed 1 2
小磁盘可能没有单独的 /usr/local 分区。在这种情况下,请将 wxallowed 添加到包含它的最小分区:/usr 或 /。
从没有 wxallowed 挂载选项的分区启动违反 W^X 的程序将产生核心转储,并且 dmesg(8) 将包含诸如 soffice.bin(15529): mprotect W^X 违规之类的条目。您可以通过发出 mount -uo wxallowed /usr/local 来暂时允许违反 W^X 的端口。