执行文件的运行时完整性检查

时间:2011-04-07 12:56:51

标签: linux security kernel integrity

我刚刚编写了一个linux安全模块,它在执行开始时验证可执行文件的完整性(使用数字签名)。现在我想深入挖掘并希望在运行时检查文件的完整性(即定期检查它们 - 因为我主要处理启动并永远运行的进程...)以便攻击者不会能够在未被识别的情况下更改主存储器中的文件(至少在一段时间后)。

这里的问题是我完全不知道如何检查文件的当前内存映像。上面提到的我的身份验证方法使用了mmap-hook,只要文件在执行之前被mmaped就会被调用,但据我所知,LSM框架不提供定期检查的工具。

所以我的问题:是否有任何提示我应该如何开始这个?如何读取内存映像并检查其完整性?

谢谢

1 个答案:

答案 0 :(得分:2)

我明白你要做什么,但我真的很担心这可能是一个安全功能,给你一个温暖的模糊感,没有充分的理由;这些是最危险的安全功能。 (另一个例子可能是坐在你旁边的LSM,SElinux。虽然我认为我在这个意见中占少数......)

流程的程序数据并不是影响其行为的唯一因素。堆栈溢出,恶意代码写入堆栈并跳入,使原始程序文本的完整性检查没有实际意义。更不用说攻击者可以使用原始未更改的程序文本to his advantage

此外,如果您不断在内核中计算DSA,可能会遇到一些性能问题。并且,您将更多内容添加到可能稍后可能被利用的长特权内核代码列表中。

在任何情况下,要解决这个问题:您可以编写一个内核模块来实例化一个内核线程,该内核线程在计时器上跳过每个进程并检查其完整性。这可以通过使用每个进程的页表,在只读页面中进行映射以及对它们进行完整性检查来完成。但是,这可能不起作用,因为每个内存页面可能都需要有自己的签名,除非你以某种方式将它们连接在一起。

值得注意的是,共享库只需要在每次扫描时进行一次完整性检查,因为它们会在使用它们的所有进程中重新映射。虽然实现这一点需要很复杂,所以也许在你设计的这个“很棒的”部分中有这个。

如果你不同意我的理由,这可能不是一个好主意,我会对你的想法很感兴趣。我不久前在工作中遇到了这个想法,并且很高兴为我们的讨论带来新的想法。