在多线程应用程序中为注入的mprotect调用切换标志
Toggling flags for injected mprotect calls in multi-threaded applications
我正在研究一个动态库(.so
)在运行时注入一些目标程序(动态检测)的项目。库使用mmap/munmap
处理自己的内存。出于安全原因,要求库中仅的某些映射区域可以通过库中的公开api写入。
我们所做的是在库函数的序言/尾声使用mprotect
和PROT_WRITE
切换内存区域的写标志,例如:
void foo(void) {
mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE);
...
...
mprotect(addr, PAGE_SIZE, PROT_READ);
}
这在单线程应用程序中工作得很好。对于多线程应用程序,如果上下文切换(到同一进程中的不同任务)发生在设置 PROT_WRITE
之后(因此内存是可写的)并且在被清除之前,则同一进程中的其他任务可能能够写入映射的库区域。所以,问题是:在foo
返回之前,是否有可能禁用进程中的其他任务?如果没有,你建议如何解决这个问题?
您的安全模型无效。如果您的库代码可以mprotect
这些区域可写,那么程序的任何其他部分也可以。你不能自省地防止这种情况。这样的安全属性只能通过某种外部监督来实现,要么直接由内核实现,要么通过跟踪进程实现(例如使用传统的ptrace或seccomp跟踪)。
如果您实际上不需要安全性属性,而只是希望可靠地捕获已经可信的代码的写入,那么可以通过跟踪所有线程,使用pthread_kill
向它们发送信号,并让信号处理程序阻塞,直到信号线程允许它们继续。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- 在多线程应用程序中为注入的mprotect调用切换标志
- 经过一定次数的调用后,Mprotect失败