10

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

4

4 回答 4

7

就挂钩到内核和拦截系统调用而言,这是我在我编写的安全模块中所做的事情:

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

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

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

于 2011-12-22T17:11:07.263 回答
3

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

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

于 2011-12-21T17:14:21.573 回答
2

您可以使用inotify观看 unlink 事件,尽管这对于您的目的可能为时已晚(我不知道,因为我不知道您的目的,您应该尝试找出答案)。基于 LSM 的内核替代方案(我的意思是 SMACK、TOMOYO 和朋友)实际上是用于强制访问控制,因此可能不适合您的目的。

于 2011-12-21T11:25:21.657 回答
1

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

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

于 2011-12-21T13:12:44.027 回答