Linux 拦截文件系统调用

Linux 拦截文件系统调用,linux,filesystems,kernel-module,system-calls,intercept,Linux,Filesystems,Kernel Module,System Calls,Intercept,我正在编写一个应用程序,我需要拦截一些文件系统调用,例如取消链接。我想保存一些文件,比如abc。如果用户删除该文件,那么我需要将其复制到其他位置。所以我需要在删除abc之前取消链接调用我的代码,以便保存它。我已经经历了与拦截系统调用相关的线程,但是像LD_PRELOAD这样的方法在我的例子中不起作用,因为我希望这是安全的,并在内核中实现,所以这个方法不会有用。inotify在事件发生后通知,因此我无法保存它。你能推荐这样的方法吗。我希望在内核模块中实现这一点,而不是修改内核代码本身。 Graha

我正在编写一个应用程序,我需要拦截一些文件系统调用,例如取消链接。我想保存一些文件,比如abc。如果用户删除该文件,那么我需要将其复制到其他位置。所以我需要在删除abc之前取消链接调用我的代码,以便保存它。我已经经历了与拦截系统调用相关的线程,但是像LD_PRELOAD这样的方法在我的例子中不起作用,因为我希望这是安全的,并在内核中实现,所以这个方法不会有用。inotify在事件发生后通知,因此我无法保存它。你能推荐这样的方法吗。我希望在内核模块中实现这一点,而不是修改内核代码本身。 Graham Lee建议的另一种方法,我曾想过这种方法,但它有一些问题,我需要所有文件的硬链接镜像。它不占用空间,但仍然可能有问题,因为我必须反复镜像驱动器以使镜像保持最新,此外,它不会跨分区工作,也不会在不支持链接的分区上工作,因此我需要一个解决方案,通过该解决方案,我可以将挂钩附加到文件/目录,然后观察更改,而不是重复扫描。 我还想添加对我不能使用硬链接的修改文件写入的支持。
我想通过替换系统调用来拦截系统调用,但在linux>3.0中找不到这样做的方法。请建议一些方法。

您可以与一起观看取消链接的事件,尽管这对于您的目的来说可能太晚了(我不知道,因为我不知道您的目的,您应该尝试找出答案)。基于LSM的内核内替代方案(我指的是SMACK、TOMOYO和friends)实际上是强制访问控制,因此可能不适合您的目的。

如果您只想处理删除,您可以保留一个硬链接的“影子”目录(通过
链接创建)到正在监视的文件(按照格雷厄姆·李的建议,通过
inotify


如果原始文件现在已取消链接,则仍可以根据需要处理卷影文件,而无需使用内核模块。

一个建议是用户空间中的文件系统(FUSE)。也就是说,编写FUSE模块(授权在用户空间中)它拦截与文件系统相关的系统调用,执行您想要的任何任务,并可能在之后调用“默认”系统调用


然后,您可以使用FUSE文件系统挂载某些目录,在大多数情况下,似乎不需要覆盖默认的系统调用行为。

至于挂接到内核并拦截系统调用,这是我在编写的安全模块中所做的:

查看hijacks.c和symbols.c中的代码;它们是如何在security.c中的
hijack\u系统调用中使用的。我还没有在linux>3.0上尝试过这一点,但同样的基本概念应该仍然有效


这有点棘手,在取消链接之前,您可能需要编写大量内核代码来执行文件复制,但在这里是可能的。

我已经编辑了这个问题,请您现在提出一些建议。您是否可以更改装载点?如果可以,可能需要编写一个FUSE文件系统。您可能想看看我可能会做你想做的。不,我不能每次都改变挂载点,就像我想处理“/”这是不可能的。我将看到collectfs。如果你可以挂载,你可以让应用程序在
chroot
监狱中运行,让你的FUSE fs镜像
/
,这可能比实现内核模块更容易。我想这对我来说可行,我也可以拦截开放/链接系统调用。我需要吗单独替换所有文件系统调用,因为我认为VFS将调用我的FUSE文件系统,它需要介于VFS和ext4之间。我说得对吗?如果我挂载/ie,根分区我将看不到可移动驱动器和更新的更改。我会吗?谢谢你的回答,我可以挂载/使用FUSE文件系统吗?我需要重播吗ce所有文件系统单独调用,因为我认为VFS将调用我的FUSE文件系统,它需要介于VFS和ext4之间。对吗?您好,谢谢您的回复。我尝试在linux 3.0.0.13系统上编译它,但它没有编译它,给出了一些错误
错误:未知字段“ctl_name”
,但它是在linux 2.6.3上编译的2我将尝试在该系统上使用它,看看是否可以使用它。ctl_名称是sysctl配置代码的一部分,因此代码的劫持部分不必工作。我最终会将代码移植到3.x。您太好了,您能给我一些关于您使用的方法的提示吗,或者我深入研究代码吗看到这一点。如果我有一个想法,我会移植它。我刚刚发布了它的工作原理概述-您好,非常感谢我所做的概述。写得很好的概述非常感谢。您对内核做了全面的修改。您从kprobe代码中获得了灵感吗?我们可以完全跳过系统调用吗?