拦截文件系统系统调用

时间:2011-12-21 10:31:07

标签: linux filesystems kernel-module system-calls intercept

我正在编写一个应用程序,我需要拦截一些文件系统系统调用,例如。断开链接。我想保存一些文件说abc。如果用户删除了该文件,那么我需要将其复制到其他地方。因此,在删除abc之前,我需要取消链接以调用我的代码,以便我可以保存它。我已经完成了与拦截系统调用相关的线程,但像LD_PRELOAD这样的方法在我的情况下不起作用,因为我希望这是安全的并在内核中实现,所以这个方法不会有用。事件发生后inotify通知我无法保存它。你能建议任何这样的方法。我想在内核模块中实现它,而不是修改内核代码本身。 格雷厄姆·李建议的另一种方法,我曾想过这种方法,但它有一些问题,我需要所有文件的硬链接镜像它不占用空间但仍然可能有问题,因为我必须反复镜像驱动器以保持我的镜像到日期,它也不会工作跨分区和分区不支持链接所以我想要一个解决方案,通过它我可以挂钩到文件/目录,然后观察更改而不是重复扫描。 我还想添加对修改文件的写入支持,我不能使用硬链接。 我想通过替换系统调用拦截系统调用,但我还没有找到任何在linux中执行此操作的方法> 3.0。请提出一些方法。

4 个答案:

答案 0 :(得分:7)

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

https://github.com/cormander/tpe-lkm

查看hijacks.c和symbols.c代码;它们的使用方式是在security.c中的hijack_syscalls函数中。我没有在linux上试过这个> 3.0但是,同样的基本概念仍应有效。

这有点棘手,你可能不得不编写大量内核代码来在取消链接之前进行文件复制,但这里有可能。

答案 1 :(得分:2)

您可以使用inotify观看取消关联事件,但这可能为您的目的而发生得太晚(我不知道,因为我不了解您的目的,您应该尝试找出来)。基于LSM(我的意思是SMACK,TOMOYO和朋友)的内核替代方案实际上是强制访问控制,因此可能不适合您的目的。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

如果您只想处理删除,您可以将硬链接的“影子”目录(通过link创建)保存到正在观看的文件中(通过inotify,如Graham Lee所建议的那样)。

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