Сет Дженкинс обнаружил примитив произвольной записи при эксплуатации ядра Pixel, но ему не хватало утечки KASLR. Он исследовал линейное отображение ядра Linux, которое напрямую отображает физическую память в область виртуальных адресов. На Android ARM64 это линейное отображение имеет фиксированный виртуальный адрес из-за требований к горячему подключению памяти и ограниченного количества бит виртуальных адресов. Следовательно, вычисление phys_to_virt становится статическим, причем PHYS_OFFSET постоянно равен 0x80000000.Усугубляя это, телефоны Pixel распаковывают ядро по статическому физическому адресу 0x80010000 при каждой загрузке. Это позволяет статически вычислять виртуальные адреса ядра для любой записи данных ядра. Например, строка modprobe_path может быть надежно доступна по адресу 0xffffff8001ff2398. На практике статический базовый адрес ядра 0xffffff8000010000 может использоваться на Pixel для получения виртуальных адресов символов ядра, обходя необходимость утечки KASLR для примитивов произвольного чтения-записи.Линейное отображение также позволяет отображать области данных ядра в режиме чтения-записи, хотя области текста остаются неисполняемыми. Даже на устройствах со случайными физическими адресами загрузки ядра, неслучайное линейное отображение помогает в эксплуатации, позволяя злоумышленникам нацеливаться на предсказуемые физические адреса памяти. Техники распыления памяти могут размещать данные по известным виртуальным адресам ядра, упрощая подделку структур данных ядра.Как отсутствие случайности линейной карты, так и статический физический адрес ядра на Pixel считаются намеренным поведением со стороны команды ядра Linux и Google. Хотя KASLR остается ценным против удаленных атак, его эффективность против локальных злоумышленников снижается. Сохранение целостности KASLR посредством инженерных усилий имеет решающее значение для общей безопасности. Будущие улучшения могут включать случайное распределение линейной карты, увеличение энтропии выделения физических страниц и случайное распределение физических адресов ядра.
phys_to_virtстановится статическим, причемPHYS_OFFSETпостоянно равен0x80000000.Усугубляя это, телефоны Pixel распаковывают ядро по статическому физическому адресу0x80010000при каждой загрузке. Это позволяет статически вычислять виртуальные адреса ядра для любой записи данных ядра. Например, строкаmodprobe_pathможет быть надежно доступна по адресу0xffffff8001ff2398. На практике статический базовый адрес ядра0xffffff8000010000может использоваться на Pixel для получения виртуальных адресов символов ядра, обходя необходимость утечки KASLR для примитивов произвольного чтения-записи.Линейное отображение также позволяет отображать области данных ядра в режиме чтения-записи, хотя области текста остаются неисполняемыми. Даже на устройствах со случайными физическими адресами загрузки ядра, неслучайное линейное отображение помогает в эксплуатации, позволяя злоумышленникам нацеливаться на предсказуемые физические адреса памяти. Техники распыления памяти могут размещать данные по известным виртуальным адресам ядра, упрощая подделку структур данных ядра.Как отсутствие случайности линейной карты, так и статический физический адрес ядра на Pixel считаются намеренным поведением со стороны команды ядра Linux и Google. Хотя KASLR остается ценным против удаленных атак, его эффективность против локальных злоумышленников снижается. Сохранение целостности KASLR посредством инженерных усилий имеет решающее значение для общей безопасности. Будущие улучшения могут включать случайное распределение линейной карты, увеличение энтропии выделения физических страниц и случайное распределение физических адресов ядра.