gpt4 book ai didi

c++ - 多线程应用程序中注入(inject)的 mprotect 调用的切换标志

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:49 25 4
gpt4 key购买 nike

我正在开发一个项目,其中动态库 (.so) 在运行时(动态检测)注入(inject)到某个目标程序中。该库使用 mmap/munmap 处理自己的内存。出于安全原因,要求库中的某些映射区域可通过库中公开的 API 进行写入。

我们所做的是在库的序言/结尾使用 mprotectPROT_WRITE切换内存区域的写标志功能,例如:

void foo(void) {
mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE);
...
...
mprotect(addr, PAGE_SIZE, PROT_READ);
}

这适用于单线程应用程序。对于多线程应用程序,如果 之后发生上下文切换(到同一进程中的不同任务),则同一进程中的其他任务可能能够写入映射的库区域PROT_WRITE 已设置(因此内存可写)并且之前它被清除。

因此,问题是:是否可以在 foo 返回之前禁用进程中的其他任务?如果不是,您建议如何解决这个问题?

最佳答案

您的安全模型无效。如果您的库代码可以mprotect 这些区域可写,那么程序的任何其他部分也可以。你无法内省(introspection)地阻止这种情况。这种安全属性只能通过某种外部监督来实现,直接由内核或通过跟踪过程(例如使用传统的 ptrace 或 seccomp 跟踪)。

如果您实际上并不需要安全 属性,而只是想通过已经信任的代码可靠地捕获写入,您可以通过跟踪您所有的线程,用 pthread_kill 向它们发出信号,并让信号处理程序阻塞,直到信号线程允许它们继续。

关于c++ - 多线程应用程序中注入(inject)的 mprotect 调用的切换标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com