NX-бит: не только защита, но и причина загадочных сбоев
The NX bit is not just about security
В гостевом посте Соня рассказывает, как при разработке гипервизора для ARM64 на MediaTek MT6735 столкнулась с необъяснимыми зависаниями при перехвате регистра CTR_EL0. Методом бинарного биссектрирования она выяснила, что проблема возникает только при динамическом вызове функции через blr, а не при статическом bl. Разгадка оказалась в спекулятивном исполнении: предсказатель переходов мог угадать адрес 0x0, что приводило к сбою. Это демонстрирует, что NX-бит, запрещающий исполнение кода в неисполняемых областях, защищает не только от атак, но и от подобных микроархитектурных ошибок.
Как динамические вызовы отличаются от статических? Динамические используют предсказание переходов, статические знают, куда ведут, заранее и не могут ошибиться в предсказании.