当谈到ebpf优势时,它总是提到比lkm安全。我阅读了一些文档,ebpf通过在加载之前验证代码来确保安全。这些是验证要做的检查表:
- 循环
- 超范围跳跃
- 无法访问的指令
- 无效指令
- 未初始化的寄存器访问
- 未初始化的堆栈访问
- 堆栈访问不对齐
- 超出范围的堆栈访问
- 无效的调用约定
这些检查中的大多数我都能理解,但这都是lkm导致内核恐慌的原因吗?这些能保证安全吗?我有120000台服务器在生产中,这个问题是阻止我从传统的hids迁移到ebpf hids的唯一原因。但如果它能引起大规模的内核恐慌,只有一次,我们的业务就会结束。
是的,据我所知,BPF验证器旨在防止任何类型的内核崩溃。然而,并不意味着你不能在生产中无意地破坏东西。例如,您可以通过将BPF程序附加到所有内核函数来冻结系统,或者通过丢弃所有接收到的数据包来丢失所有连接。在这些情况下,验证者无法知道你并非有意执行这些操作;它不会阻止你。
也就是说,任何类型的验证都比传统内核模块中的不验证要好。使用内核模块,不仅可以像我上面描述的那样自食其果,而且还可能因为代码中的某个细微错误而导致整个系统崩溃。
无论您使用的是什么,在部署到生产环境之前,显然都应该对其进行广泛的测试。