1

我正在开发一个项目,其中动态库(.so)在运行时(动态检测)注入到某个目标程序中。该库使用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返回之前禁用进程中的其他任务?如果没有,你建议如何解决这个问题?

4

1 回答 1

1

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

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

于 2015-08-04T04:45:14.840 回答