拦截linux

时间:2017-10-24 02:11:40

标签: c linux linux-kernel

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

在上述两种情况下,您可能想拦截特定uid所做的execve调用;如果是这样,你应该过滤来自那个uid的电话。

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