测试是否可以在Linux中访问内存

问题描述 投票:0回答:3

给定一个不受信任的内存地址,Linux中有没有办法测试它是否指向有效的可访问内存?

例如,在mach中,您可以使用vm_read_overwrite()尝试从指定位置复制数据。如果地址无效或无法访问,它将返回错误代码而不是崩溃进程。

linux memory
3个回答
1
投票

这是TOCTOU的典型案例 - 你在某些时候检查内存是可写的,然后你尝试写入它,并以某种方式(例如因为应用程序解除分配它),内存不再可访问。

只有一种有效的方法可以实现这一点,也就是说,当您真正需要使用它时,可以捕获从写入中获得的错误。

当然,您可以使用技巧来判断内存是否“可写”,但实际上您无法确保它是可写的。

您可能想稍微解释一下您实际上要做的事情,如果您更具体,我们可能会有更好的想法。


1
投票

write来自那个记忆(例如,进入/dev/null(编辑:使用/dev/null它可能无法按预期工作,使用管道)),如果地址无法访问,您将收到EFAULT错误。

我不知道如何在不破坏其内容的情况下测试可写内存(如果它是可写的)。


0
投票

您可以尝试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
}

但是这个功能可能很慢,不应该用于性能危急情况。

© www.soinside.com 2019 - 2024. All rights reserved.