Захватываем ring 0 в Linux

ключевой фрагмент функции /mm/fault.c, содержащий ошибку синхронизации


Поскольку, page fault handler выполняется с семафором, доступным только-на-чтение, несколько конкурирующих потока могут одновременно войти в обработчик за строкой /* * */. Рассмотрим, что произойдет, если два потока, разделяющих одну и туже виртуальную память, одновременно вызовут page fault handler. Приблизительный сценарий атаки выглядит так: поток 1 обращается к сторожевой странице и вызывает исключение fault_1. Поток 2, обращается к странице GUARD_PAGE + PAGE_SIZE и вызывает исключение fault_2.

Состояние виртуальной памяти при этом будет выглядеть так:

[   NOPAGE    ] [fault_1      ] [     VMA     ]  --->
  higher  addresses[fault_2      ] [   NOPAGE    ] [     VMA     ]



Содержание раздела