【问题标题】:Intercept executed commands in linux拦截linux中执行的命令
【发布时间】:2017-10-24 02:11:39
【问题描述】:

我需要知道是否可以在可加载内核模块中拦截用户执行的命令。我知道系统调用可以被拦截,例如 open()。但我需要做的是拦截用户输入的命令/进程并添加一些验证。例如,如果用户输入 cp 命令,在执行命令之前我需要对其执行一些验证。如果我们不能在 LKM 中做到这一点,还有哪些替代方法?

【问题讨论】:

    标签: c linux linux-kernel


    【解决方案1】:

    您需要查看execvp() 和朋友有多少实际系统调用(可能是 1,也可能是 2 — 可能更多,但可能不是),然后拦截这些系统调用。您可能还需要担心posix_spawn() 和朋友。它们是运行新流程的唯一方式。没有其他方法可以拦截它们。

    【讨论】:

    • thnx @Jonnathan Leffler,但我仍然不明白这一点。为了检查有多少系统调用,还是需要拦截当前进程吧?何
    【解决方案2】:

    您可以尝试使用 LKM 或 systemtap 插件(编译为 LKM)。您应该挂钩的内核函数是execveexecveat。如果您这样做是为了编程乐趣并想自己编写挂钩代码,您可能需要查看kprobes 并知道您可以从/proc/kallsyms 获取内核函数地址。

    当然,如果可能的话,使用您自己的挂钩代码重新编译内核是另一种选择。

    在上述两种情况下,您可能都希望拦截由特定 uid 进行的 execve 调用;如果是这样,您应该过滤来自该 uid 的调用。

    用户空间方法可能是尝试编写 seccomp 过滤器。 Here 是一个关于如何编写的教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2011-06-06
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多