gpt4 book ai didi

android - 在 Linux 中拦截文件打开事件

转载 作者:搜寻专家 更新时间:2023-11-01 09:33:30 28 4
gpt4 key购买 nike

假设我们有一个进程可以dlopen()一些第三方库。该库可能会对用户只有写入权限的某些文件执行open("write_only_logfile", O_WRONLY)。我们需要能够在该库尝试打开文件时收到通知,因此稍后我们可以 dup() 返回描述符并重定向输出。几乎没有什么限制会使拦截变得更加困难:

  • LD_PRELOAD 被禁止 - 无法 Hook 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() 手动修补跳槽。但这听起来不太好。

最佳答案

听起来你遇到了麻烦。下面简要提到的大多数解决方案肯定会干扰 SELinux,所以请不要相信我的话。

使用strace 调试自己的进程来拦截open 是普通Linux 上常用的解决方案之一。我不确定它是否适用于 Android;对于从某些新版本开始的不可调试应用程序,它肯定会成为禁区(如果尚未被禁止)。

seccomp-bpf 是另一种可能性。可能不适用于较旧的 Android 版本,但由于 Android O seccomp 将成为 Android 安全设置的保证部分。在仅警告模式下拦截 open 并在发生有趣的事情时(通过调试或信号)将控制权交还给你自己。

如果/data/anr/traces.txt是按需打开的,你应该可以通过观察/proc/self/fd/的内容来观察使用 inotify 或通过轮询。您可以通过设置打开线程的 io niceness 来减少比赛的影响……

以上所有只是部分解决方案,您可能仍然需要解码发生的实际 open 系统调用(strace 源代码可能对 strace/seccomp 解决方案有帮助,请阅读 /proc 的链接/self/fd/) 并对其采取行动(dup2,正如您已经提到的)。

"write_only_logfile" is hardcoded inside the library

是否可以修改库/可执行文件数据段的内存? Afaik mprotectPROTECT_EXEC 特别受到严格限制,但至少肯定允许 mmap(以支持 JIT 编译器等)。可能会编写一些东西来就地编辑字符串常量(只要这样做是可能和允许的,我自己对此不确定)。

关于android - 在 Linux 中拦截文件打开事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45266324/

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