代码之家  ›  专栏  ›  技术社区  ›  Sergio

在Linux中拦截文件打开事件

  •  2
  • Sergio  · 技术社区  · 7 年前

    dlopen() 一些第三方图书馆。此库可以执行 open("write_only_logfile", O_WRONLY) 在某些用户只有写访问权限的文件上。如果这个库试图打开一个文件,我们需要能够收到通知,所以稍后我们可能会收到通知 dup() 很少有限制使拦截更困难:

    • LD_PRELOAD 禁止-无法钩住 open()
    • inotify(7) 没有帮助,因为用户对没有读取权限 "write_only_logfile" 它归admin所有
    • 我们无法访问图书馆资源,因此无法对其进行修改
    • 是在库内部硬编码的,因此我们无法传递另一个名称来执行重定向

    特别是考虑到以下事实: 杂项文件经常出现。

    P、 为了避免混淆和更好地理解,它是一个带有加载JVM的常规Android应用程序。如果应用程序挂起(所谓的ANR)-系统发送 SIGQUIT s /data/anr/traces.txt 并将JVM状态写入其中。这些数据对调试非常有用。但由于安全原因,应用程序无法直接读取该文件(所有应用程序都会写入该文件,因此可能存在一些敏感问题)。无论如何,我相信截取我的进程将写入的内容是绝对公平的。

    libart.so )并手动修补跳槽 .但听起来不太好。

    3 回复  |  直到 7 年前
        1
  •  1
  •   user1643723    7 年前

    听起来你的处境很麻烦。下面简要提到的大多数解决方案都保证会干扰SELinux,所以不要相信我的话。

    使用调试自己的进程 strace 拦截 open

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

    /data/anr/traces.txt 是按需打开的,您应该能够通过观看 /proc/self/fd/

    打开 发生的系统调用(strace源代码可能有助于strace/seccomp解决方案,readlink for /过程/自/故障诊断/ )并付诸行动(dup2,正如你已经提到的)。

    “只写日志文件”在库内硬编码

    mprotect PROTECT_EXEC 特别是受到了严格限制,但至少mmap肯定是允许的(以支持JIT编译器等)。也许可以编写一些东西来就地编辑字符串常量(只要这样做是可能的并且允许的,我自己也不确定)。

        2
  •  1
  •   Florian Weimer    7 年前

    一个更通用的解决方案很快就会接近联合文件系统,要正确使用它相当困难。即使是在内核联合文件系统中, overlayfs ,无法提供完整的POSIX语义。

        3
  •  0
  •   n. m. could be an AI    7 年前

    您需要LD\U预加载来挂接应用程序。要钩住第三方库,只需在库之前加载钩子(或将其放在可执行文件中)。

    假设库调用 open 来自libc,而不是直接对应的系统调用,并且它以正常方式链接,您只需要一个名为 打开 在代码中的某个地方。拨打电话 打开 来自libc( RTLD_NEXT 打开 功能符号。