Где хранятся разрешения на странице на оборудовании и как я могу изменить их напрямую? - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь написать драйвер псевдо-ядра (он использует CVE 2018-8120 для получения разрешения ядра, так что технически это не драйвер), и я хочу быть максимально безопасным при входе в ring0. Я пишу функцию для чтения и записи MSR из пользовательского пространства, и перед переходом на ring0 я пытаюсь гарантировать, что указатель void, данный моей функции, может быть написан, я решил, что идеальный способ сделать это - сделать это Доступно для записи, если это не так.

Проблема в том, что единственный способ, которым я знаю, как это сделать, - это VirtualProtect() и NtAllocateVirtualMemory, но VirtualProtect() иногда дает сбой и вместо этого возвращает ошибку. Я хочу точно знать, где хранятся эти права доступа (в оперативной памяти? В каком-то специальном регистре ЦП?), Как я могу получить их адрес и как я могу изменить их напрямую?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Код пользовательского режима никогда не должен пытаться обойти структуры данных ядра, и любое правильно написанное ядро ​​все равно предотвратит это.Лучший способ для кода пользовательского режима, чтобы гарантировать, что адрес может быть записан - это запись в него.Если страница еще не была доступна для записи, ошибка страницы приведет к тому, что ядро ​​сделает это так.

Тем не менее, код ядра / не может / полагаться на то, что приложение сделало это, по двум причинам:
1) Даже если приложение делает это правильно, страница может быть снова отображена до (или после) ввода кольца 0.
2) Ядро должно / никогда / не полагаться на код приложения, чтобы делать правильные вещи.Он всегда должен защищать себя.

0 голосов
/ 16 марта 2019

Информация о правах доступа и данные страницы хранятся в каталоге страниц, таблице страниц, CR0 и CR3.

Более подробную информацию можно найти здесь: https://wiki.osdev.org/Paging.

...