假设我们有一个进程可能会在某些第三方库中有可能dlopen()
。该库可以在用户只能写入访问的某个文件上执行open("write_only_logfile", O_WRONLY)
。如果这个库试图打开一个文件,我们需要能够得到通知,所以稍后我们可能会返回描述符和重定向输出。 有使拦截更难一些限制:在Linux中拦截文件的开启事件
LD_PRELOAD
是被禁止的 - 没办法挂钩open()
inotify(7)
没有帮助,因为用户对"write_only_logfile"
没有读取权限,它是由管理员拥有- 我们无法访问库源,因此无法修改它
"write_only_logfile"
在库内部硬编码,所以我们无法通过其他名称来执行重定向
我想知道Linux是否有一种有效的方法来帮助这种情况。 特别考虑到进程可能会经常需要open()
杂项文件。
P.S.为了避免混淆和更好理解 - 这是一个带有加载JVM的常规Android应用程序。如果应用程序挂起(所谓的ANR) - 系统将SIGQUIT
发送给它。信号是通过专用线程open()
s /data/anr/traces.txt
接收的,并向其写入JVM状态。这些数据对调试非常有用。但是由于安全原因,应用程序无法直接读取该文件(所有应用程序都会写入该文件,因此可能会有些敏感)。无论如何,我认为拦截我的流程写入内容的内容是绝对公平的。
P.S.S.在最坏的情况下,可以找到JVM库映像(libart.so
)并手动修补跳转槽open()
。但听起来不太好。
与其他操作系统相比,Linux使这一点相对困难。微软的分层驱动架构使其相对容易。许多Windows驱动程序书籍都包含强制性加密文件系统的驱动程序示例。我从来没有见过在Linux中分层的好例子。在目前的设计下可能是不可能的。 – jww
这可能是重复的:[在Linux上拦截文件操作](https://stackoverflow.com/q/40161522/608639)。在40161522问题中,他不能使用'LD_PRELOAD',因为它对他不可靠。 – jww
@jww很好的建议,但'LD_PRELOAD'被划掉了,不是因为它不能正常工作,而是因为我的应用程序是作为半准备过程的分支开始的。我感兴趣的图书馆已经加载。请参阅编辑的问题。 – Sergio