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

Linux 已执行文件的运行时完整性检查,linux,security,kernel,integrity,Linux,Security,Kernel,Integrity,我刚刚完成了一个linux安全模块的编写,该模块在可执行文件开始执行时(使用数字签名)验证其完整性。现在我想再深入一点,希望在运行时检查文件的完整性(即定期检查它们——因为我主要处理的是启动并永远运行的进程……),这样攻击者就无法在未被识别的情况下(至少在一段时间后)更改主内存中的文件 这里的问题是,我完全不知道如何检查文件的当前内存映像。我上面提到的身份验证方法使用了一个mmap钩子,每当文件在执行之前被mmad时就会调用它,但据我所知,LSM框架并没有提供定期检查的工具 所以我的问题是:有什

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

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

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


谢谢你

我明白你想做什么,但我真的很担心这可能是一个安全功能,让你无缘无故感到温暖模糊;这些是最危险的安全特性。(另一个例子可能是坐在你旁边的LSM,SElinux。尽管我认为我在这个观点上是少数……)

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

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

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

值得注意的一点是,每次扫描只需要对共享库进行一次完整性检查,因为它们会在使用它们的所有进程中重新映射。不过,实现这一点需要复杂度,所以在您的设计中,也许可以将其放在“很好拥有”部分


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

您建议如何处理在堆、堆栈空间、malloc'ed内存等类似内存中创建和存储变量的应用程序?既然内存的这一部分是动态的,我假设一旦程序运行,就没有很好的方法来验证这个部分。我可能必须坚持使用固定的部分,并确保攻击者没有修改任何内容。您的安全模块是否驻留在HLOS或内核中?对于内核,使用kmalloc而不是vmalloc来确保您的地址是连续的。@Chris-这真是个好主意。我更感兴趣的是您是如何实现“在执行之前检查文件的完整性(校验和或散列)”的。我正在尝试实现类似的东西,但还没有找到任何方法。谢谢你的想法,我在过去几天做了一些研究,它确实似乎不是一个合理的安全特性。您已经指出了一个原因(缓冲区溢出攻击可以在不更改现有代码的情况下使用现有代码),此外,这样的系统需要比内核更高的权限才能有效运行,因此所有现有解决方案都依赖于硬件(例如TPM模块)或者在完整性检查作为VMM运行的虚拟机上,TPM是设置RoT(信任根)的一种方法,还有其他方法。您也必须小心,因为TCG中的TPM版本现在是2.0,但到目前为止,大部分市场仍在使用1.2,尽管2.0将是更好的选择。