4

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

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

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

谢谢

4

1 回答 1

2

我理解你想要做什么,但我真的很担心这可能是一个安全功能,无缘无故地给你一种温暖的模糊感;这些是最危险的安全功能。(另一个例子可能是坐在你旁边的 LSM,SElinux。虽然我认为我在这个观点上是少数......)

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

此外,如果您不断地在内核中计算 DSA,您可能会遇到一些性能问题。而且,您正在向一长串可能在以后被利用的特权内核代码添加更多内容。

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

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

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

于 2011-04-09T04:20:06.543 回答