Подтвердить что ты не робот

Разрешения доступа для/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);
4b9b3361

Ответ 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 МБ?