【发布时间】:2017-07-23 14:42:15
【问题描述】:
假设我们有一个可能dlopen() 某个第三方库的进程。这个库可以对用户只有写权限的文件执行open("write_only_logfile", O_WRONLY)。如果这个库试图打开一个文件,我们需要能够得到通知,所以稍后我们可以dup() 返回描述符并重定向输出。
有一些限制会使拦截变得更加困难:
-
LD_PRELOAD被禁止 - 无法钩住open() -
inotify(7)没有帮助,因为用户对"write_only_logfile"没有读取权限,并且它归管理员所有 - 我们无权访问库资源,因此无法修改它
-
"write_only_logfile"在库中是硬编码的,所以我们不能传递另一个名称来执行重定向
我想知道 Linux 在这种情况下是否有一种有效的方法来提供帮助。
特别是考虑到进程可能经常open() 杂项文件这一事实。
附:为了避免混淆和更好地理解 - 它是一个加载了 JVM 的常规 Android 应用程序。如果应用程序挂起(所谓的 ANR)- 系统会发送 SIGQUIT 给它。通过open()s /data/anr/traces.txt 的专用线程接收信号并将JVM状态写入它。这些数据对于调试极为有用。但是由于安全原因,应用程序无法直接读取该文件(所有应用程序都写入该文件,因此可能有些敏感)。无论如何,我相信拦截我的进程将写入它的内容是绝对公平的。
附言在最坏的情况下,可以找到 JVM 库映像 (libart.so) 并手动修补 open() 的跳转槽。但听起来不太好。
【问题讨论】:
-
与其他操作系统相比,Linux 使这相对困难。 Microsoft 的分层驱动程序架构使其相对容易。许多 Windows 驱动程序手册包含强制加密文件系统的驱动程序示例。我从未见过 Linux 中分层的好例子。在目前的设计下可能是不可能的。
-
这可能是重复的:Intercepting file operations on Linux。在 40161522 问题中,他不能使用
LD_PRELOAD,因为这对他来说不可靠。 -
@jww 不错的建议,但
LD_PRELOAD被划掉不是因为它不能很好地工作,而是因为我的应用程序是作为半准备过程的分支开始的。我感兴趣的库已经加载了。请查看已编辑的问题。
标签: android linux unix posix inotify