我有一系列关于/dev/mem
:
网上很多文章,好像都提到了/dev/mem
作为通往"Physical RAM"
。但如果我是对的/dev/mem
是通往"Physical Address Space"
处理器的控制寄存器可能包括许多硬件外设的控制寄存器而不仅仅是 RAM?如果我错了,请纠正我!
为了防止攻击者滥用/dev/mem
并改变内核内存,一个标志CONFIG_STRICT_DEVMEM
需要启用,这将阻止用户应用程序访问超过 1MB 的物理地址空间。我检查了我的电脑(Ubuntu)上的配置文件,发现CONFIG_STRICT_DEVMEM = y
。我编写了一个程序,尝试读取超过 1 MB 的物理内存,并且我能够读取!没有分段错误或任何Operation NOT Permitted
错误。这怎么可能?
我的程序大致是这样的:
fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);
是的,你没看错,/dev/mem 允许你映射任何物理地址,包括非 RAM 内存映射的 IO。这对于在不编写内核驱动程序的情况下访问某些硬件设备的快速而肮脏的黑客攻击非常有用。
-
CONFIG_STRICT_DEVMEM 使内核检查 /dev/mem 中的地址devmem_is_allowed()
in arch/x86/mm/init.c
,那里的评论解释道:
* On x86, access has to be given to the first megabyte of ram because that area
* contains bios code and data regions used by X and dosemu and similar apps.
* Access has to be given to non-kernel-ram areas as well, these contain the PCI
* mmio resources as well as potential bios/acpi data regions.
你的地址0xFFFF0000
很可能是非 RAM,因为 BIOS 通常将 IO 内存设置为略低于 4GB,因此即使使用 STRICT_DEVMEM,您也能够映射它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)