我想编写一段代码,它能够知道另一个应用程序何时尝试打开或写入文件,并且还能够阻止这种访问。是否可以 ?如何 ?
例如,对于包含视频的 zip 文件,使用 VLC 打开该文件将导致我的工具阻止 VLC 打开该文件,将存档解压缩到临时文件夹中,然后使用 vlc 重新打开视频。
我对这个想法有多糟糕并不感兴趣,更多的是个人好奇心和技术挑战。这与 zip 和 VLC 无关,而是我自己的文件容器。
我是 Linux 内核的新手。
答案1
Linux 安全模块旨在控制对文件等资源的访问:
LSM 旨在提供成功实现强制访问控制模块所需的一切的特定需求...LSM 在内核中即将产生用户级系统调用的每个点插入“钩子”(对模块的向上调用)访问重要的内部内核对象,例如索引节点和任务控制块。
要实现这一点,我认为您必须创建一个设备驱动程序,将诸如“open()
已被调用。VLC 正在打开一个包含视频的 zip 文件”之类的事件传递给用户空间进程,该进程将解压缩相应的文件并返回解压缩文件的名称,然后 LSM 模块会将其传递给实际的内核open
调用。然后,在相应的close()
调用中,您将该事件从 LSM 模块传递到用户空间进程,以便它可以删除解压缩的视频文件。
这不是一件小事。除此之外,您需要非常小心,不要引入巨大的安全漏洞:“嘿,这个东西可以用来重写/etc/shadow
!”
答案2
我不确定默认的 Solaris 功能是否允许监视open()
调用,但可以监视写入访问。
检查例如的手册页port_create()
并查看/usr/include/port.h
。
tail -f
检查 Illumos 上的 usr/src/cmd/tail 是否有事件驱动的实现可能也很有趣。