January 4th, 2018

VR

Meltdown

Почитал про этот ваш Meltdown. В двух словах - мы все умрём :D

В общем баг простой как валянок. Когда делаем загрузку из памяти, в нутри декодер разбивает её на, условного говора, два мю-опса: fetch и check. Первый собсна загружает из памяти в кеш что нужно, второй делает security check. По хорошему сначала всё нужно проверить, а потом уж грузить. Если проверка не прошла, то и все последующие инструкции не должны быть выполнены. Но в суровой реальности всё намного сложнее и на сцену выходит Out-of-Order Execution.

Берём следующий код:
1 ; rcx = kernel address
2 ; rbx = probe array
3 retry:
4 mov al, byte [rcx]
5 shl rax, 0xc
6 jz retry
7 mov rbx, qword [rbx + rax]


По хорошему он упадёт ещё на 4-й строчке, ибо нам читать из защищённого адресного пространства нельзя. Но есть несколько возможностей таки засунуть его в процессор, заставить спекулятивно выполнить, при этом нужный кусок из нашего тестового массива будет загружен в кеш что и позволит косвенным методом определить значение байта по нужному адресу памяти (банальная timing attack). Для новых процессоров это использовать TSX, для старых - засрать мозги предсказанию переходов.

Что доступно при такой атаке - на винде только виртуальное адресное пространство текущего процесса (user space + замапленный в него kernel space, что тоже не мало). На линупсе - вся физическая память (там сидят говноеды, но вы это и сами знаете).

Кто уязвим - интел точно. ARM и AMD потенциально, товарищи с ними не игрались, код для интела на них не работает, но всё указывает что потенциально возможно ибо работает у всех одинаково.

Как лечить - меньше мапить в адресное пространство кишков и не мапить физическую память (как это делают линупсоиды).

Что делать - поставить патчи когда выйдут. Ну и не стоит паниковать. Баг страшный, баг архитектурный, на линупсах, особенно в PV контейнерах, вообще полнейший анус. Но блин, это ж не в первый раз. Плюс описание бага в открытом доступе доступно уже пол года, и если оно нигде не всплыло, значит ценность его в целом так себе.