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

       

Получаем root'а на многопроцессорных машинах


А вот другая интересная уязвимость, затрагивающая большое количество ядер с версиями 2.4/2.6 и поражающая многопроцессорные машины. Обнаруженная в самом начале 2005 года, она все еще остается актуальной, поскольку далеко не все администраторы установили соответствующие заплатки, а многопроцессорные машины (включая микропроцессоры с поддержкой Hyper-Threading) в наши дни скорее правило, чем редкость.

Во всем виноват обработчик ошибок доступа к страницам (page fault handler), который вызывается всякий раз, когда приложение обращается к невыделенной или защищенной странице памяти. Не все ошибки одинаково фатальны. В частности, LINUX (как и большинство других систем) выделяет стековую память не сразу, а по частям. На вершине выделенной памяти находится станица, доступ к которой умышленно запрещен. Она называется "сторожевой" (GUARD_PAGE). Стек постепенно растет и в какой-то момент "врезается" в сторожевую страницу, возбуждая исключение. Его перехватывает page fault handler и операционная система выделяет стеку некоторое количество памяти, перемещая сторожевую страницу наверх. На однопроцессорных машинах эта схема работает как часы, а вот на многопроцессорных…

       down_read(&mm->mmap_sem); /* * */

       vma = find_vma(mm, address); .

       if (!vma)

              goto bad_area;

       if (vma->vm_start <= address)

              goto good_area;

       if (!(vma->vm_flags & VM_GROWSDOWN))

              goto bad_area;

       if (error_code & 4) {

       /*

       * accessing the stack below %esp is always a bug.

       * The "+ 32" is there due to some instructions (like

       * pusha) doing post-decrement on the stack and that

       * doesn't show up until later..

       */

       if (address + 32 < regs->esp) /* * */

              goto bad_area;

       }

       if (expand_stack(vma, address))

              goto bad_area;



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