内核:禁用/ dev / kmem和/ dev / mem


8

我了解这一点,/dev/kmem/dev/mem提供对系统内存(即原始RAM)的访问。我也知道,/dev/kmem可以在内核中完全禁用它,并且可以限制对的访问/dev/mem

在我看来,对内存的原始访问对开发人员和黑客来说很有用,但是为什么我需要通过访问内存/dev/mem。AFAIK不能在内核中禁用它(不同于/dev/kmem)。在我看来,访问可能被滥用/利用的原始内存似乎只是在自找麻烦。

有实际用途吗?是否有任何用户程序要求它正常工作?


1
lwn.net/Articles/147901建议X服务器可以使用/dev/mem。不确定是否仍然有意义。
2014年

这篇LJ文章暗示了同样的事情:linuxjournal.com/magazine/anthony-lineberry-devmem-rootkits
slm

您是否也禁用了可加载模块?因为那比还要危险/dev/mem。加载模块,以内核模式运行代码。最重要的是,只有在某些情况下root不能做的情况下才值得对具有root访问权限的攻击者进行强化,这在典型安装中往往不是这种情况。
吉尔斯(Gilles)'所以

@Gilles-我正在使用加密签名的模块。只能加载使用我的私钥签名的模块。
user1968963 2014年

除了STRICT_DEVMEM中描述的内容外man mem,用于支持“安全启动”的内核锁定补丁还禁止对/ dev / mem的访问(可以在没有安全启动的情况下启用锁定)。 phoronix.com/…–
sourcejedi

Answers:


6

Scale 7x 2009有一个幻灯片,标题为:破坏Linux内核:通过/ dev / mem进行恶意代码注入,其中包含这两个项目符号。

谁需要这个?

  • X服务器(视频内存和控制寄存器)
  • 多塞姆

到目前为止,从我从搜索中发现的所有内容来看,这两个项目符号似乎是合法用途的领先者。

参考文献


如果我不在X server服务器上运行,因此不需要该怎么办/dev/mem?有没有一种方法可以/dev/mem完全禁用内核?我只能找到“对/ dev / mem的过滤器访问”(CONFIG_STRICT_DEVMEM)。
user1968963

1
在Linux下,现代X服务器可以在没有/ dev / mem的情况下运行,因为图形卡具有其自己的设备节点。例如,i915就是这种情况。
约根森

3

值得一提的是,即使你禁用/dev/mem/dev/kmem内存仍然可以倾倒; 看看man proc揭示/proc/kcore; 它是系统的物理内存。一个非常好的取证工具包rekall已经有一个工具可以完成这个工作 ; 它转储内存(和/boot文件)以便可以对其进行分析。

实际上,Ubuntu默认禁用/dev/kmem

/dev/kmem除了攻击者使用它来加载内核rootkit之外,没有其他现代用途。CONFIG_DEVKMEM设置为“ n”。尽管/dev/kmem设备节点通过Ubuntu 9.04在Ubuntu 8.04 LTS中仍然存在,但实际上并没有附加到内核中的任何节点上。

Ubuntu不会/dev/mem因为应用程序需要而禁用

某些应用程序(Xorg)需要直接从用户空间访问物理内存。/dev/mem存在特殊文件以提供此访问。过去,如果攻击者具有root用户访问权限,则可以从该文件查看和更改内核内存。该CONFIG_STRICT_DEVMEM内核选项被介绍给阻断非设备存储器存取(原名CONFIG_NONPROMISC_DEVMEM)。

如何禁用/proc/kcore

CONFIG_PROC_KCORE构建内核时不要启用。

您如何禁用/dev/mem

好吧,查看一下可以man mem为我们提供有关其创建方式的详细信息:

mknod -m 660 /dev/mem c 1 1
chown root:kmem /dev/mem

你应该能够公正rm -rf /dev/mem; 您可以在内核构建阶段通过不启用来禁用CONFIG_STRICT_DEVMEM

如何禁用/dev/kmem

确保CONFIG_DEVKMEM在内核构建时未启用该功能。

如何防止冷启动攻击?

如果我能够禁用/proc/kcore/dev/mem/dev/kmem然后用于加密交换分区或根本没有使用掉呢?好吧,您的内存可能只是被冻结并以这种方式访问​​。您如何防止这种攻击?您对RAM进行加密;您如何加密RAM?你不能 有关详细信息,请参见TRESOR


/dev/kmem在内核中已禁用,但/proc/kcore在系统上看不到任何内容。但是我确实有/dev/mem,并且我想禁用它。
Martin Vegter

这个答案有错别字。/proc/mem应该是/dev/mem,类似的/proc/kmem
rlf

@ bbb31不错。我以为有可能我缺少了一些东西。如果真是如此,那么我想给你机会澄清一下。
rlf

“如何防止这种攻击?您对RAM进行加密;如何对RAM进行加密?您不能。” 注意:将来,您应该能够做到这一点(至少在某些类型的硬件上)-即将推出!lwn.net/Articles/776688
比尔圆筒

1

如您所知,/dev/mem可以访问正在运行的系统的物理内存。/dev/kmem提供对内核虚拟内存的访问。可以通过内核配置选项永久禁用这两个字符设备(代码是最权威的信息源,因此仅供参考)。取消设置下面的前两个选项将禁用相应的设备。

根据您的发行版,可以使用zless /proc/config.gz或来查看当前的内核配置less /boot/config-$(uname -r)

认为最初的目的/dev/mem是支持与内存映射外设的交互。使这些虚拟设备可用(例如,攻击者能够即时修补另一个进程的内存,甚至是内核的内存)的明显负面安全隐患已经知道了至少十年。限制访问/dev/mem在主线内核已经支持自2008年初以来/dev/kmem也一直可选从那时起周围了。

十年前,似乎X依赖于/dev/mem,我认为这还不成立。为了测试有关X需要的说法/dev/mem,我昨天从笔记本电脑中删除了虚拟设备,自那以来它一直运行良好。在2017年,除了研究和开发之外,这些设备似乎没有实际用途

从安全角度出发,删除这些设备是一个好主意。仍然值得注意的是,具有较高特权的远程攻击者可以在其地址空间之外读取内存。可以使用访问其他用户空间应用程序的内存/proc/<pid>/mem。可以使用来访问内核内存/proc/kcore


0

/dev/mem从一开始我就没有包括在我的系统中。我使用的是Gentoo Linux,这并不奇怪,因为使用此Linux发行版,您实际上可以自己构建每个软件包,包括Linux内核。

/dev/mem即使使用X.org X11,我也从未注意到由于缺少任何问题。就在今天,我注意到该软件包的出现会x11-drivers/xf86-video-vesa打印一条消息,指出它需要这样做/dev/mem,例如:

* This driver requires /dev/mem support in your kernel
*   Device Drivers --->
*     Character devices  --->
*       [*] /dev/mem virtual device support

由于我没有故意为XServer安装VESA驱动程序,或者即使只是作为备用,我实际上从来没有使用过,因此直到现在都没有注意到它。

但这证明了以下事实:a)不再需要X11 /dev/mem,并且b)一些X11视频驱动程序仍然可以执行。

没有特定的硬件,较新的视频驱动程序很可能会工作。就像现代X.org-X11(位于Gentoo上x11-base/xorg-server)一样,它甚至不必再成为suid root,这就是进展的样子……

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.