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

Chr*_*ris 5 linux security kernel integrity

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

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

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

谢谢

Jer*_*ell 2

我明白你想做什么,但我真的很担心这可能是一项安全功能,无缘无故地给你一种温暖模糊的感觉;这些是最危险的安全功能。(另一个例子可能是紧邻你的 LSM,SElinux。尽管我认为我在这个观点上属于少数派......)

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

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

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

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

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