Linux内核模块 - 安全风险?

Dan*_*rds 6 linux kernel module

Linux内核模块有多少安全风险?我记得读过如果有人有权访问,他们所要做的就是加载一个rootkit模块.它是否正确?有什么方法可以防止这种情况发生吗?

内核的哪些部分实际上是通过模块接口公开的,程序员可以访问哪些功能,可以用于恶作剧目的?

Dou*_*der 5

内核模块以完全内核权限运行 - 它可以执行内核可以执行的任何操作,这几乎是任何事情.一个表现良好的模块会将它的动作限制为由内核作为符号导出的那些函数,但实际上没有任何东西阻止模块调用任何具有其地址的任意函数,或者执行与任何现有函数等效的代码.

保护是只有root才能加载内核模块.

Root无论如何都可以使机器发挥作用,因此增量风险可以忽略不计.澄清一下 - 加载模块可能允许root更好地隐藏,或者用较少的系统信息操作攻击,但原则上,root可以覆盖内核映像,并将系统重新引导到该映像,它可以实现一切内核模块可以做到.由于/ dev/kmem通常是不可写的,因此用户空间根进程可能会限制它对内核模块的作用,但重写和重启可以"修复"这个问题.

此外,可能还有其他方法可以改变内核内存,例如,如果要隐藏进程,可以使用可加载模块,或者可以只替换ps为trojaned版本.

与隐藏文件类似,您可以使用内核模块,也可以只替换ls.


jde*_*aan 5

道格拉斯所说的完全正确,Linux是单片的,模块可以做任何事情.这是一个主要由Linus Thorvalds驱动的设计选择,并且符合开源理念(为什么限制,它需要性能,你可以从源头看到模块做什么 - 实际上只说真正的书呆子:-) - ).

现在也许你必须从第三方加载一些所谓的二进制模块.即使它们似乎被编译,通常也会有一个共同的目标文件作为黑盒子,并且实际上只编译它周围的接口(就像我使用的nvidia图形驱动程序一样).没有明确的答案,如果您加载这些模块,您必须信任供应商,如果没有,不要这样做...

只有root才能加载理论上正确的模块.但实际上,没有一个系统是完美的(甚至是Linux).有时会出现内核漏洞,使本地用户或远程用户(非常罕见的情况)可以将代码引入内核,以便他们可以拥有root权限,从而可以控制您的系统.拥有最新的内核是件好事......

在对此进行精确化之后,让我们进入到目前为止尚未回答的问题的第二部分:"程序员可以访问哪些功能,可以用于恶作剧目的?".为SE-Linux做的许多事情也可用于恶意目的,例如:

  • 隐藏在信息/proc/sys目录,例如隐藏恶意用户进程,使他们不能像工具显示top,ps等等.这包括隐藏恶意模块本身,因此未列出lsmod.
  • 记录和记录击键...
  • 向外界发送数据.没有内核模块需要连接到站点并发送信息(原始linux代码中的网络堆栈除外),如果模块的代码确实有异味.如果某些字符串被加密和解密以进行某些操作,那就更难闻了......
  • ...

列表很大,如果您想了解更多详细信息,可以查看Rootkit Hunter(http://www.rootkit.nl/projects/rootkit_hunter.html).这是我不时运行的工具.它可以检测一些广泛使用的rootkit的存在.它管理一个rootkit列表,谷歌搜索名称将使你清楚这些野兽正在遵循什么样的目标...像道格拉斯所说,可以使用的功能实际上是内核中可用的所有功能,没有限制.因此,告诉模块是否是一个坏人并不是一件明显的事情.