Комментарии 16
Суть простая, выделяем кучу памяти размерами не кратными размеру строки банка памяти, но кратными размеру блока, запрещаем её кешировать и считываем попарно. Если чтение произошло быстрее, значит память была с одном банке, и чем быстрее, тем ближе ряды. По списку виртуальных адресов и статистике обращений хитро получаем все соответствия между виртуальной и реальной памятью (через брутфорс). Имея список соответствий, можем делать много разных злых вещей. Перехватывать только что освободившиеся банки. Последние мосты ради ускорения делят поровну строки физической памяти на блоки по одному на процессор, так что можно словить джекпот, если считать память.
Собственно, проблемы тут торчат со всех сторон. Прочитать блок чужой физической памяти. Пережить серьёзные перетасовки памяти. Точно измерить время обращения. Выжить среди высоконагруженных приложений, которые будут выдирать из-под тебя процессор ни к месту.
Практически? Я сам дико сомневаюсь, что подобная уязвимость может работать за пределами тестового стенда. И причина не только во всех уровнях защиты, для корректной работы загруженность сервера должна быть минимальна, иначе подсчёт времени будет слишком зашумлен. Какой разумный человек оставит сервер без нагрузки?
Не получится realloc-нуть. Независимо от виртуального адреса, ОС выделяет "реальные" страницы из своего пула, и нет способа запросить конкретную. А потом гипервизор выделит страницу для ОС — и тоже нет способа запросить конкретную. Кроме того, раз уж мы говорим про javascript — то тут и realloc-то недоступен.
https://github.com/IAIK/drama
Если вы сможете их проверить на работоспасобность и проанализировать на тему необходимых прав, буду очень благодарен. На моих форточках этот ужас предсказуемо не работает.
Ну, там все написано на Си, причем используется чтение из /proc/self/pagemap (наверное, это даже root-прав требует).
И еще есть такой вызов как mmap на 70% доступной физической памяти.
То есть никакого "похищения данных через javascript" там не показано.
Этот баг давно исправили во всех приличных ОС и гипервизорах. К слову, это была очень серьезная проблема безопасности, а не "трюк".
И чем же это поможет?
Глупости не говорите: универсальное решение тут может быть только одно, в маппере чистить сегмент (нулями) как минимум за пределы реального перетащенного блока до размера сегмента банки, и как максимум по выделению и перед перетаскиванием блоков), что есть 1. геморрой, 2. вымывает кэша, 3. нереально "ускоряет" контекст-свич туды-сюды, ну и все сопутствующее безобразие в придачу сверху (сброс TLB, глобальных дескрипторов и т.д. и т.п.).
Ну или экзотика типа той же CBA (capability-based адресация), что тоже нереально весело, т.к. нужно будет переписать все, начиная от компиляторов и заканчивая ядром ОС и гипервизоров…
И последствия сего — бинарная (не)совместимость такого софта к примеру, тоже имеют место.
Одно вот только (что бы значит чуть сбавить градус истерии) — как применить на практике подобную "уязвимость" не ясно даже самим "первооткрывателям"… Ну и сколько звезд на небе для этого должны сойтись, история по видимому умалчивает...
Единственное железобетонное решение проблемы — полностью изолированная машина, замурованная в тот самый железобетон. Не самое удобное, впрочем.
DRAMA: Новая атака позволяет скрытно похищать данные из изолированных виртуальных машин