【发布时间】:2011-12-28 01:14:59
【问题描述】:
我有一个小程序,它映射有潜在危险的可执行代码(使用 PROT_EXEC),调用prctl(PR_SET_SECCOMP, 1),然后执行这个映射的代码。这一切都很好,并且允许我通过将 mmap'd 区域同步到磁盘来“保存”评估状态,并稍后重新加载(很可能在另一台机器上进行负载平衡)。然而,这种技术并不总是有效——因为这段代码可能已经对不在 mmap'd 区域中的程序进行了更改,并且这些信息将会丢失。
所以我想做的是在调用代码之前将所有内容(除了这个 mmap'd 区域)设为只读。这样我就可以保证可执行代码不能改变除了 mmap'd 区域以外的任何东西的状态,我可以随意序列化/反序列化。
顺便说一句,这是 x86_64 上的 Linux
谢谢
【问题讨论】:
-
如果你成功将内存设为只读,你的程序在尝试写入时不会失败吗?
-
如果它试图在其 mmap'd 区域之外写入,那么失败就可以了
-
hmmm...如果您有 mprotect 代码的权限,并且您在不放弃这些权限的情况下运行可执行代码,则可执行代码只需调用 mprotect 即可重新获得这些权限。
-
@gby 否,因为 prctl 调用禁用了执行系统调用的能力
标签: c linux posix sandbox mprotect