我有兴趣编写一个内核程序,它可以对系统调用进行所有可能的控制,例如交集、过滤以及更改其参数。
我寻找两个目标:
- 读取系统调用及其参数,并根据策略决定阻止或允许它们。
- 有权更改其参数并将其传递给用户。
事实上(我不知道这个寓言是否属实?),我想为一个进程做一些简单的虚拟化,它可以更改其对内核及其系统调用的视图(就像它"/tmp/new_folder/foo.txt"
通过打开系统调用请求一个文件一样)然后我们返回"/tmp/another_folder/foo2.txt"
)。
我坚持认为这需要使用 ebpf 来完成。但如果有其他方式,我会欢迎。
另外,我应该说,我知道的用法密件抄送在这种情况下。它似乎是为跟踪而设计的,而不是过滤和影响的。以及我尝试过的安全计算它比 bcc 更好,但 seccomp 不能用于访问参数,这对我来说是一个重要因素。所以我想我的答案可能是这样的LSM。但我不知道如何做,也没有找到任何好的文档。
谢谢你的帮助。
答案1
你可以这样做ptrace(2)
使用PTRACE_GETREGSET
和PTRACE_SETREGSET
.
请注意,传递给系统调用的字符串(例如文件系统路径)实际上是作为指向用户空间缓冲区的指针通过引用传递的。如果您拦截系统调用,您不仅必须更改参数中的指针,而且还必须将新字符串放入内存中的某个位置(如果它尚不存在)。