Разрешения доступа для/dev/mem
У меня есть набор вопросов относительно /dev/mem
:
-
Многие статьи в сети, по-видимому, ссылаются на /dev/mem
как шлюз на "Physical RAM"
. Но если я прав, /dev/mem
является шлюзом для "Physical Address Space"
процессора, который может включать в себя контрольные регистры многих периферийных устройств HW, а не только ОЗУ? Пожалуйста, исправьте меня, если я ошибаюсь!
-
Чтобы предотвратить злоупотребление злоумышленниками /dev/mem
и изменение памяти ядра, необходимо включить флаг CONFIG_STRICT_DEVMEM
, который запретит пользователям приложений получать доступ к физическому адресному пространству за пределами 1 МБ. Я проверил файл конфигурации на своем ПК (Ubuntu) и обнаружил, что CONFIG_STRICT_DEVMEM = y
. И я написал программу, которая пытается читать физическую память за пределами 1 МБ, и я был в состоянии читать! Отсутствие ошибки сегментации или ошибки Operation NOT Permitted
. Как это возможно?
Моя программа выглядит примерно так:
fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);
Ответы
Ответ 1
-
Да, вы правы, /dev/mem позволяет сопоставлять любой физический адрес, в том числе не привязанный к ОЗУ память IO. Это может быть полезно для быстрого и грязного взлома для доступа к некоторым аппаратным устройствам без написания драйвера ядра.
-
CONFIG_STRICT_DEVMEM делает ядро проверяет адреса в /dev/mem с devmem_is_allowed()
в 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 чуть ниже 4 ГБ, поэтому вы можете сопоставить его даже с STRICT_DEVMEM.
Ответ 2
Что дает следующий результат:
cat /dev/mem | wc
Я получаю:
cat: /dev/mem: Operation not permitted
1908 11791 1048576
Так что для меня это останавливается на 1 МБ.
Обратите внимание, что cat использует open, а не mmap, поэтому его не идентичный тест.
Вы уверены, что читаете за пределами 1 МБ?