【发布时间】:2013-01-24 17:47:44
【问题描述】:
给定一个不受信任的内存地址,Linux 中有没有办法测试它是否指向有效的、可访问的内存?
例如,在 mach 中,您可以使用 vm_read_overwrite() 尝试从指定位置复制数据。如果地址无效或无法访问,它将返回错误代码而不是使进程崩溃。
【问题讨论】:
给定一个不受信任的内存地址,Linux 中有没有办法测试它是否指向有效的、可访问的内存?
例如,在 mach 中,您可以使用 vm_read_overwrite() 尝试从指定位置复制数据。如果地址无效或无法访问,它将返回错误代码而不是使进程崩溃。
【问题讨论】:
write 从该内存中(例如,进入/dev/null(编辑:使用/dev/null,它可能无法按预期工作,请使用管道)),如果地址为无法访问。
我不知道如何测试 可写 内存而不破坏它的内容,如果它是 可写的。
【讨论】:
这是TOCTOU 的典型案例 - 您在某个时刻检查内存是否可写,然后您尝试写入它,但不知何故(例如,因为应用程序释放了它),内存不再可访问.
实际上只有一种有效的方法可以做到这一点,那就是,当你真正需要使用它时,捕获你写给它的错误。
当然,您可以使用技巧来尝试确定内存是否“可写”,但实际上无法确保它是可写的。
您可能想稍微解释一下您实际尝试做的事情,如果您更具体,也许我们可以有一些更好的想法。
【讨论】:
你可以试试msync:
int page_size = getpagesize();
void *aligned = (void *)((uintptr_t)p & ~(page_size - 1));
if (msync(aligned, page_size, MS_ASYNC) == -1 && errno == ENOMEM) {
// Non-accessibe
}
但是这个功能可能会很慢,不应该在性能关键的情况下使用。
【讨论】: