
всем здравствуйте спасибо за представление я про себя обычно всегда на таких конференциях выступаю говорю одну вещь что я не хакер и не претендую а я как бы по образованию системный программист занимаюсь в основном сетевой инженерии я работаю в компании который занимает называется ног сервис мы занимаемся аутсорсинга вот вам и консалтингом построения айти инфраструктур систем с большой нагрузкой a security это такая у меня хобби такое большое и когда я услышал про спектр имел down я не мог пройти мимо и конечно что тут же бросился пробовать и тесте что это такое как она работает и вот хочу вам это все дела рассказать что что я из этого всего понял и какие выводы сделал для начала мне бы хотелось попросить вас поднять
руки кто когда-нибудь что-нибудь писал на ассемблере о класс парни у нас с вами будет много общего одно сначала вам будет немного скучно поэтому будет некий crash course ассемблера для тех кто никогда не на нем ничего не писал так куда его надо направлять хочу и свой доклад построить как такое историческое как бы review начать там самого начала и показать каким образом мы докатились до такой жизни что мы не можем доверять больше собственному цапу все как бы во всем виноват человек по фамилии фон нейман он придумал архитектуры современных компьютеров что у него тут в его вот это вот исследованиях было главное что он написал что компьютер должен из себя представлять некие цепью то есть сэмпл pc семью нет в котором у него есть
управляющая логика арифметический модуль и интерфейс памяти при этом где то что он важно я сделал он сказал что программы должны храниться в памяти также как и данный и записываться на самом деле те же с теми же самыми числами поэтому мы сегодня имеем такую не fight архитектуру где у нас все вместе лежит это упрощенное представление плюс-минус современного 64-битного микропроцессора что у нас важно что микропроцессор когда он работает он загружает из памяти данные данные эти он загружает во внутренние регистры свои для для дальнейшей обработки потому что загружать как бы по данные из памяти выполнять над ней над ними операцию писать это все обратно это было бы очень накладно потому что у вас очень много данных гонялась туда-обратно
поэтому важная тема в микропроцессоре это регистры вот у нас есть 16 регистров по 64 бита которые используются для операций логических и вычислений с фиксированной точкой у нас есть наш математический сопроцессор у нас есть наши регистры которые для векторных команд и самые главные два наверное регистра для процессора и the instruction to enter и регистр флагов instruction poster это такой регистр который все время указывает на ту команду которая сейчас процессором выполняется соответственно происходит чтение команды из памяти inspection winter увеличивается в следующий раз мы читаем соответственно следующую команду и у нас есть чудесный регистр флагов который хранит в себе результаты всех предыдущих математических операций и математических логических все что делает процессор в процессе своей работы следующая важная концепция эта концепция уровней
привилегий вот для 86 семейства процессоров intel 86 изначально не задумывались с четырьмя уровнями привилегии от 0 до 3 где третий уровень это код который имеет наименьшее привилегии потом по идее у разработчиков была идея что код сетевых драйверов и сетевых сервисов будет работать на более с более высокими привилегиями и наконец нас будет некий рингу 0 это само ядро операционной системы которая управляет памятью и заниматься переключением задач между ног приключениям процессор от исполнения от одной программы к другой то есть управлением многозадачностью но на самом деле всю эту идею как бы так сказать от нее отказались потому что переключение между уровнями привилегии то достаточно дорогая с точки зрения производительности операция поэтому все современные операционные системы которые вы запускаете у себя на
компьютере они пользовательские приложения работают в ринге 3 а все остальное работает в ринге 0 1 и 2 фактически не используются потом спустя некоторое время у нас появился замечательная идея с виртуализацией и и и аппаратная имплементация соответственно нас появился ринга минус один это привилегии гипервизора который уже управляет виртуальными операционными системами то более привилегированный режим чем оринга 0 и потом последние как бы на два дня в этом безумии это ринг -2 этот так называемый режим system management mode это вообще очень страшно и колдунство фактически внутри вашего процессора живет еще одна операционная система которая может останавливать операционную систему вас как пользователя она может останавливать гипервизор перехватывать делать все что угодно идея была в том чтобы в эту операционную систему вынести
исправление всяких багов в чипсетах и всякие такие неудачные вещи но и и кстати там ее немного попилили вы сломали есть уже как был руткит который жил в ринге -2 было очень весело а также тут чего нету это у нас в процессоре но раз уж к этой темы коснулся упомяну у нас еще есть этот intel management and jane который висит это еще один процессор внутри вашего процессора который может говорить сетью минуя все же все остальное и предназначен для удаленного управления в корпоративных сетях его тоже взломали все учимся тоже немножко печально и дальше что нам важно знать это каким образом происходит изоляция программ внутри операционных систем друг от друга у каждой программы есть адресное пространство в котором она
работает но там начинается топ с нуля и имеет длину там те 32-битных там это совет на 4 гигабайта там для 64 битных у вас выделено 48 бит возможных адресацией то есть когда вам кстати многие не знают что когда он говорят что у вас 64 битный процессор на самом деле у вас под адресацию относится только 48 бит а все остальные начиная от 48 до 63 они просто повторяют содержимое 47 бита ну просто решение сэкономить на архитектуре изоляция у программ происходит таким образом существует специальная таблица для каждой программы которая запущена на вашем современном процессоре существует специальная таблица которая хранит преобразование адресов памяти вашей программы она хранит преобразование адресов вашей программы из виртуальной памяти с которой как считает ваша программа она
работает на физическую память то есть у вас когда ваша программа обращается по какому-то адресу в памяти у вас выбираются вот старшие биты откуда она обращается в процессоре специальный регистр называется control реджис трубки который хранит текущий адрес этой таблицы при преобразовании соответственно эти биты используются как индекс в этой таблице дальше в этой таблице есть указатель на следующую таблицу подставляются следующие биты и вот таким вот образом 4 пройдя 4 вот этих вот преобразования вы в итоге получаете адрес физической памяти который будет обращаться процессор хотя там то есть как это работает у вас для допустим адреса 0 физическая страница может находиться в памяти там про по адресу там сто тысяч аж допустим и если у вас в этой таблице
там для адреса 0 вот по всей этой цепочки пройти где-то u10 будет указатель сказать стоять на 100000 as the processor обратиться по адресу 0 произойдет это преобразование и в итоге в физическую память произойдет обращение по адресу 100 тысяч аж как бы чтобы сделать все веселее надо еще также я тут просто для простоты не упомянул что когда у вас система работает виртуальном режиме что у вас кроме таблицы страниц вот этой вот из четырех этих уровне есть еще три уровня которые сверху добавляет гипервизор потому что он для вашей операционной системы делает то же самое что я операционная система делает для вашей программы то есть он создает виртуальное адресное пространство системы операционная запущенная виртуальной машине она думает что она работает
железом с настоящей памятью хотя на самом деле там есть еще три уровня преобразований которые настраивать гипервизор чтобы заметить эту память куда-то там куда он посчитал нужным соответственно для вашей программы которая работает она уже работает не просто с виртуальной памяти она работает с виртуальной памяти в квадрате важно что что у нас вот находится на конце вот этой вот всей цепочке когда мы вот эту вот всю цепочку проходим мы попадаем на вот такую вот чудесную запись это такая вот структура данных тут на ней у нее куча полей нас на самом деле интересует из них 3 первый фрейм намбер это те биты которые будут подставлены вместо вашего виртуального адреса чтобы получить физический адрес ну то есть вот это вот как раз мы и pink
памяти виртуальной физическую важно что у нас тут есть но мексику шин beat it a bit который определяет память поэтому память в этой страницы памяти она может быть использован выполнена как кот или нет если бит стоит там один то код из этой страницы памяти можно выполнять если бит 0 соответственно будет произведен exception и ваша программа она либо остановит ее либо остановит операционная система либо ваша программа там должна специальным образом сделать некий recover и что еще важно есть бит оунера бетона определяет что эта память относится к памяти пользовательского режима либо это относится к памяти ядра соответственно когда мы вот тут вот смотрели если этот бит установлен то программа запущена с привилегиями ринга 3 может обращаться к этой памяти если
этот бит не установлен то к этой памяти могут обращаться программа только из ринга 0 там и выше таким образом осуществляется защита и изоляция программ между собой операционных систем между собой если у вас работает виртуализации каждый раз проходить вот эту вот всю вот это все преобразование это было бы очень накладно потому что мы помним что каждое обращение к памяти если она не попала в кэше процессора это примерно там 400 тактов то есть для каждого чтения из памяти у вас получилось бы 400 400 400 400 все очень медленно поэтому в процессоре есть такая штука называется translation loko сайт баффи что это такое это очень простой кэш который хранит в себе результаты последних преобразований вот и вот страничной системы и когда
процессор обращается к памяти то он обращается в этот кеш и если данные есть кэш это он берет результат преобразования непосредственно из каши если нет то соответственно нас запускается вот этот механизм вычет его не этого всего дела из памяти что медленно tlb обычно там хранится там 40 864 записи на такой шаг очень небольшой по размеру но вот на самом деле достаточно эффективней и вот мы подошли к первому интересному это примерно по блокам представленность процессор pentium mmx это какие-то там начала двухтысячных по моему годов что тут у нас происходит у нас это был первый процессор в который в котором появилась супер скаляр ность сейчас я об этом вам буду рассказывать анапа что такое супер скалярно означает то что процессор одновременно может
выполнять более чем одну команду и это был первый процессор с интегрированным кэшем прямо на чип процесс они пентиум по-моему до него то есть не mmx по моему работал тот же точно также что тут важно что у нас есть кэш вот их даже 2 cache который хранит он кэш разделен на 2 части есть кэш кода и есть кэш данных то есть вот те от блоки процессора которые выбирают из памяти следующие команды декодируют их и исполняют они у них есть свой кэш а когда мы хотим как программа прочитать из памяти какое-то значение что-то там 7 сделать у нас этот кэш отдельный тег решит между собой разделены и мы видим что у нас вот этот вот tlb буфер о
котором я только что говорил их на самом деле 2а он связан с дата кэшем один связан с кэшем кода соответственно когда процессору выбирает команду из памяти у он он выбирает и из кэша кода тут либо через tlb либо через все весь большой механизм вычитывать из памяти дальше она тут как-то там анализируется и в пинте уме у нас появилось вот это вот супер скаляр ность то есть внутри процессора было два pipeline а один назывался you paid 2 назывался вайпаю а что это такое было внутри процессора где-то должны быть непосредственно сделаны эти транзисторы которые реально у отвечают там за математику за расчеты какието и зато как процессор там логически работает соответственно таких блоков было 21 был полноценный а
второй был подрезанный полноценный мог исполнять все инструкции подрезанный блок там исполнял только некоторые инструкции но если получалось так что если кода оптимизирован хорошо и инструкции шли в перемешку так что позволяли загружать 2 pipeline а то это для x 86 был первый случай когда у нас в процессоре параллельно выполнялось две инструкции затакт они 1 на самом деле инструкции может выполняться даже больше потому что у нас есть там отдельно блок отвечающие за mmx отдельно блоку но он там спаренный получается он спаянный с блоком отвечающим за вычислений с плавающей точкой и поэтому вот я всегда вот привожу этот пример когда в этом говорю что если кто-то играл в первый quake то пером клыки был прекрасный текстурный maker который был вручную оптимизирован под
pentium processor и вот он добыл они добились того что они использовали на сто процентов и wavy pipe и и одновременно еще считали что-то на математическом so proud сори таким образом у них за один за один такт выполнялось более чем две инструкции каким образом происходит это деление между use paypal вы помните у нас были наши чудесные регистры и деление происходило таким образом что процессор выбирал команду допустим этот команда была связана с регистром и я x да там допустим это была команда move ya ya x1 то есть мы в регистра их загружали единицу если следующая команда использовала не и x регистра какой-нибудь другой и она попадала так что эта команда была была возможность использовать эту выполнить эту команду на другом пайпе то
соответственно у нас для pentium mmx эти команды начинали выполняться параллельно
и примерно в то же время появилась первая я для себя я считаю 1 такой на какой-то там глюк в процессоре на его аппаратную именно архитектуру атака называлась shadow уокер в чем там было дело 2005 год это японский black head доклад был смысл в том что в процессоре блоки tlb которые связаны с кэшем данных и спешим кода в пентиум ах да помоему core архитектуры они не были связаны между собой и поэтому появилась такая возможность что при некоторые манипуляции можно было сделать так что блок tlb для кэша кода содержал в себе одну информацию а блок кода который tlb для кэша данных содержал в себе другой указатель это приводило к тому что у вас есть некий адрес в памяти некая страницы
если вы хотите ее прочитать как данные то работает tlb данных вот этот вот и он указан дает вам трансляцию на страницу памяти физическую некую там одну а если из этих же адресов вы хотите исполнить эти данные как кот то из за того что вот здесь вот у нас был было зафиксировано другая трансляция то по тому же адресу если процессор начинает выбирать команды то он видит совсем другую страницу памяти это позволило создать руткит который был невидим для антивирусов потому-что антивируса загружает там в ядро свой модуль и начинает проверять ядро операционной системы на предмет того что было ли в него вмешательства какое-то или нет он вычитывать страницы памяти которые содержат код операционной системы и сравнивает их там с эталонными
из-за того что была возможность сделать такой tlb сплит антивирус видел неизмененные страницы памяти то есть все как бы хорошо но когда процессор пытался эту память исполнить как кот tlb трансляция давала другой адрес и уже код выполнялся совсем не тот что видел антивирус потом intel это дело исправил в процессорах по моему корм они сделали связь между этими tlb и сюда поставили еще один кэш который общие для двух вот этих вот маленьких кашей и так манипулировать tlb просто перестала нет больше физической возможности но когда-то это работало это было замечательно в 2014 году там группа исследователей которые занимаются исследованием всякого legacy кода они использовали подобную технику чтобы определить что по конкретному адресу в памяти это таких код или это такие
данные ну потому что не там пытаются разработать какой-то антивирус the next gen им нужно было понимать где в памяти с точностью до байта где лежат коды данные потому что в legacy коде часто бывает такое что вас коды данные идут вперемешку а и если вам это вдруг интересно то вот есть адрес на ютюбе можно посмотреть у них там очень интересный доклад на эту тему дальше давайте разберемся прежде чем мы перейдем к интересному как работает кэш в процессоре кэш процессоре работает следующим образом когда вы обращаетесь неважно я такой skoda в кэш данных они все либо ю т л б либо еще какой то другой кэш они все работают по одному и тому же принципу вот у вас есть некий
исходный адрес который является ключом поиска дальше есть некая функция которая часть вот этого вот адреса мы пит на некий индекс это называется набором набор кэша тут каждая вот эта вот линия это некий там набор вот у нас есть набор с индексом 0 сын dex м1 с индексом 2 соответственно когда вы хотите что-то прочитать из памяти вот часть адреса по которому вы обращаетесь она идет для выбора индекса вторая часть этого адреса которая осталась одна уже непосредственно сравнивается значением в которое тут записано в кашле ней а самые младшие биты они используются как смещение внутри кашле не то есть у вас обычно кашле не 64 байт это значит что младший опыт для не для intel авс кого процессоры для кого-то другого это
пример у вас младшей 6 бит это смещение внутри кашле не которая находится вот здесь вот следующие там обычно 8 бит это вот выборка одного из вот этих вот блоков а последний остальная часть адреса является неким тегом но ее называют тегом она просто является признаком того что правильно по правильному адресу вы обращаетесь или нет соответственно какая тут логика что есть адреса в памяти которые всегда будут попадать на один и тот же вот этот вот яндекс но в силу того что вот эти вот младший 8 бит они там время от времени будут повторяться соответственно чтобы найти в кэше данных или в кэше кода какое-то конкретное значение вам достаточно взять вот эти вот биты использовать их как яндекс а потом сделать там четыре
допустим сравнении с вот этой оставшейся частью адреса чтобы выбрать один из четырех одно из четырех этих хранилищ а вот эти вот непосредственно данные уже определяются то младшими самыми битами того адреса куда вы обращаетесь вот эта вот штука называется foo вы сажаете в кэш современных xeon ах и по моему со скай лейкой он уже всегда 8 уровневый то есть у вас не 4 вот таких вот стороны а их 8 но на самом деле на логику работы это не влияет но нам важно понимать как работает каши чтобы мы когда будем потом смотреть каким образом это все за x связать вместе expro эксплуатировать чтобы привести это все к чтению там к доступу к тем данным которым мы не
должны были бы получить доступ опять-таки в эту область копают уже достаточно давно в 2013 году был прекрасный доклад называется холов там deal и сайт в рамках его исследователи использовали кэш процессора как канал передачи данных что они сделали они на амазоне запустили две виртуальные машины две виртуальные машины работали физически на одном сервере и одна программа специальным образом наполняла кэш так что пропало специальным образом наполняла кэш что специальным образом наполняла кэш а вторая программа запущена на другой виртуальной машине она читая данные которые находятся в ее виртуальном адресном пространстве но за счет того что у нас есть вот эта вот логика когда а одни и те же адреса могут попадать на одинаковые вот эти утренние они смогли обмениваться данными между
собой 1 соответственно программа просто говорила что вот эти вот все адреса не валидные этот кэш сбрасывался а с той стороны программа она просто учитывала памяти замерало время и если она видела там что по определенному поттер ну там шел валидный валидный валидный кэш потом там не валидная потом опять валидный валидный валидный то она понимала что это там некое сообщение которое ей пришло из другой с другой стороны и таким образом они смогли обмениваться информацией и им удалось на этой штуке создать туннель они туда про бросили по этому туннелю ssh а потом через ssh ssh транслировали клипа не пересняли ужасные видео хэллоу этой как и у адель от нее пересняли перепели и это очень упорно если есть время то
над ней не обязательно посмотрите это класс также в 2016 году это чтобы показать что это все касается не только intel 86 был доклад называется он armageddon как проблемность процессором нарушают вашу прайвеси там исследователи показали что замеряя время работы кэша на телефоне они могли сказать примерно набирали ли вывод цифры буквы или какие-то там спец символы на клавиатуре это конечно там не то чтобы совсем уж так впечатляюще когда показывает прям как ваш порой набирается но все равно это как бы такой вот информация лик который в принципе не должен был бы происходить потому что программа запущена в бэкграунде не должна знать что вы набираете на клавиатуре и соответственно в прошлом году у нас опубликовали доклад и которые за
это спектр i'm all down которые уже показывали всю-всю все проблемы интеловских процессоров уже вот вывезли в полный рост вот это вот диаграмма мы тогда смотрели на пентиум ему бы все было достаточно просто а вот это вот уже с процессор skylake как видите тут значительно все усложнилось во-первых у вас больше нету какого-то там отдельного you конвейера и конвейер или еще чего-либо у вас есть такой вот блок который называется execution юнит который умеет исполнять некие как команды при этом у вас больше нет регистров которые я вот вы помните наверно этот слайд регистров и с названием я xu вас больше в процессоре нету у вас есть регистр файл который содержит в себе 180 универсальных регистров и процессор сам
себе определяет в какой момент времени я из у меня вот здесь вот вот здесь вот или еще где-либо в другом месте соответственно кроме 180 регистров общего назначения виртуальных у вас еще есть 168 виртуальных регистров которые отвечают за математику а сам вот этот вот модуль который это все разруливает он в себе содержит девяносто семь команд на разном этапе выполнения то есть у вас вы прочитали одну команду ее исполнили но на самом деле в этот момент в процессоре еще девяносто семь команд который он считает возможным или вероятным будут исполнены в будущем они находятся на разной стадии выполнения соответственно вот этот вот scheduler он берет эти команды рассолу они команды сами уже по себе не исполняются они транслируются в некий внутренний язык
который уже не похож на тот а центр который мы знаем а дальше эти команды отправляются в один из восьми этих это называется execution портов к каток каждый из которых может делать либо плюс-минус всю весь набор инструкции исполнить либо некоторую его часть соответственно это все опять таки как вы видите связано с кашами они у нас никуда не делись tlb все на месте все как бы работает что тут важно еще что у нас появился достаточно мощный предсказатель который для scheduler а этого дает информацию о том какой будет следующая команда которая возможно понадобится для исполнения и scheduler эти команды загружают вот эти свои девяносто семь внутренних как бы флотов и пытается их исполнить при этом вот у нас там есть
простейшая программа да мы загружаем в регистр ира x единицу прибавляем к i единицу и пишем в память по адресу единица содержимое регистра и то же самое делаем с тем же самым регистром но уже там два что при этом произойдет в процессоре процессор этот scheduler он выберет себе вот среди 180 этих регистров где строго этого файла один скажет теперь ты будешь ира иксом вот тебе единиц а потом поступят следующая команда он скажет а кто мне тут был сыра иксом а ты был ира иксов вот давай свое значение отправь на execution юнит 0 апотом пойму поймай оттуда результата и сохрани себе при этом scheduler будет видеть что у нас впереди опять таки будут операции с регистром эра x и он не дожидаясь конца
вот этих вот операций он просто скажет отель регистр номер один теперь ты тоже будешь араик сам но в будут ищем на тебе команды выполняй и посылая их там на игру пишем unit 1 потому что они туда попадают таким а пять минут это плохо потому что мы только начали таким образом у вас все это дело выполняется параллельно и параллельно у вас дать 97 команд может исполняться в чем состоит уязвимость спектр типа 1 оно состоит в том что у вас есть некий код вы как злоумышленник можете послать ей на вход никого и некое значение через какую-то переменную и дальше у вас есть проверка если переменная там меньше чем там и рейса из то мы там выполняем некое действие фишка в том что если наш
этот branch предиктор то есть нам вот при исполнении вот этой вот инструкции скажет что наверное следующая инструкция будет такая вот они там гоу ту куда-нибудь там вниз по коду то вот эти вот все модули они примут эту команду и начнут ее исполнять потом когда вот этот результат вот этот будет вычислен процессор может сказать блин я с branch предиктором ошибся и за концы лить вот эти вот все операции которые он считал будут исполнены в будущем то есть это вот для нашего вот этого примера это если бы он взял и отменил результаты вот эти вот тоже самое происходит как бы здесь но при этом происходит проблему потому что вот этот кот уже успел обратиться к памяти памяти это значит
изменилось состояние кэша а это значит что замеряя потом время чтения данных из каша мы можем сказать каково было значение вот в этом rx потому что мы видим какая из линий каша была изменена где поменялось значение соответственно что где произошло замедление при почти следующем чтение есть у нас спектр часть 2 это опять-таки проблему branch при гектара это так называемый indirect jump и есть у нас команда когда мы передаем управления по адресу который содержится в регистре либо по адресу который содержится в регистре в памяти ну то есть это либо просто там на какой-то адрес который вычитывается из памяти по непосредственному значению и опять-таки мы можем сделать так чтобы наш вот этот вот branch предиктор мы можем его
натренировать он работает по принципу тренинга то есть он запоминает на какие раньше адреса происходил переход иначе и он говорит процессору начинай исполнять вот такие инструкции потом он опять их таки может отменить если он понял что он ошибся но опять-таки изменения в кэше дает нам сочинил через который мы можем понять а какие что что вот эти вот инструкции которые находятся где-то там в памяти почему возможно в чужом процессе в чужой виртуальной машине что они делали и какой памяти они обращались но это достаточно такая лабораторная ситуация но тем не менее она возможно потом у нас есть наш мой любимый молдаван что такое мол дал meltdown это возможность нарушения вот страничной защиты которую мы вот там вот рассматривали где то вот здесь вот смысл
в том что у нас есть страница которая помечена как системная то есть мы из users space а не можем к ней обратиться но из-за того что у нас есть такая супер скалярная архитектура которая начинает выполнять код вперед прежде чем она поймёт что это нужно делать или нет то у нас появляется возможность прочитать эту память также есть этот мэл должен так называемый 3 а эта штука характерная для процессоров arm она позволяет прочитать системные регистры то есть у нас кроме регистров общего назначения есть системные регистры и вот у нас допустим в армии есть такой регистр ттп r01 он содержит в себе адрес вот этой вот таблицы страниц которая работает по нормальному из юзеф space а программа не
должна никаким образом узнать где где эта память и что в ней хранится но из за того что на некоторых кадрах в армии у нас существует такая супер скалярная архитектура и не не сделали там эту проверку то соответственно этот код выполняется и мы можем не сложным образом содержимое этих регистров вычитывать а как мало времени к сожалению не могу подробно объясню как это происходит но происходит классно ну либо вот возвращаемся к молдова ну на процессоре 86 соответственно да у нас вот мы хотим обратиться к некоторые защищённой памяти делаем и это мы вот таким вот куском кода что мы сбрасываем содержимое кэша чтобы у нас весь кэш был не валютный и соответственно время чтения из него было долгим потом мы обращаемся через да тут
ассемблер ную процедуру к нужному месту в памяти системной получаем при этом печь food мини-печь фолд чек-фолд но мы из него река варимся и как бы результат этой операции отменен мы не видим что мы оттуда прочитали но по изменению тайминга кэша за счет того что мы куда-то обратились из мы и там в тоже что-то поменялось мы можем сделать вывод о том что находится в памяти по тому адресу как бы чтобы этот код работал тут важны две штуки во-первых те данные которые мы хотим обратиться они должны находиться в кэше процесс и во вторых у нас должна быть у в кэше tlb быть запись которые трансляции которая чтобы не и которая валидно чтобы нам не пришлось вот эту
длинную процедуру в учитывание таблицы страниц из памяти делать соответственно вот выглядит это вот так вот вот у нас есть некие адрес он видел старшие адреса это битые tf кита есть единицы то там а то память которая относится к ядра операционной системы мы говорим что мы хотим от туда что-то вычитать и вот в ядре linux кто знает там есть такая строка которая выдает версию операционной системы соответственно где-то внутри ядра linux есть printf который у которого первые параметры будет вот это вот как а формата и я вот знаю где она в памяти у меня лежит соответственно я могу и и вычитать и увидеть что у меня тут реально какие-то там данные из ядра я прочитал ну там она немножко шумно и
поэтому некоторые байты немножко покореженные но в принципе чтения такое возможно соответственно у нас есть куча пруфов концепт разные люди тем уже конкретно заниматься потому что я этим занимался там буквально там неделю потом занялся коммерческих обходится который мне платят деньги но если вам интересно посмотреть это все попробовать то вот это вот куча ссылок которая тут есть а также вот ссылка на мою презентацию если вам она вдруг понадобится на этом у меня все к сожалению извините во время времени просто очень мало а тема очень глубокая поэтому в двух словах я как смог так и передал коллеги
было очень круто давайте кратенько вопросы у кого есть помол дауна спектр кто что понял то что понял кто-то что-то понял ура это хорошо вопросы давайте хотел спросить по поводу того векселя не против если потому что пытались несколько раз насколько я знаю и отчасти процессора сказали что невозможно пофиксить а так ну да часть его процессоров действительно просто отказались фиксить мы просто сказали что процессоры старые мы уже там ничего не можем сделать пусть так и будет на части процессоров пофиксили апгрейдом микрокода это вот в армии потом в линуксе windows mac os exe имплементировать и патч который приводит к тому что у вас в буфере tlb когда выполняется пользовательский код никогда не будет трансляцией на адреса который относится к ядро операционной системы
поэтому вот это вот механизм обхода он больше не работает потому что у вас получается идет ком выполнение команды на чтения она пошла себе работать при этом запустил но так как вы обращаетесь к данным которых нету трансляции адреса которых нет в tlb совета запустился механизм вычет его не из таблицы страниц и в этом вот месте у интела есть обработчик который видит что вы обращаетесь к не валидный странице что у вас нету пермь ишанов туда обращаться и он вот рубит тогда эту команду до того как она исполнилась а если у вас таблицу в таблице tlb есть трансляция то соответственно это дело все работает поэтому одно из вещей которые сделали это сделали так что в пользовательском ходе никогда больше не будет трансляции
адресов которые привязаны к адресному пространству операционную систему еще вопросы
спасибо за доклад было очень интересно и у меня вопрос буквально по последнему слайду где вы показывали дамп с я drown'd я бы хотел узнать насколько сильная зашумленных данных получается то есть когда вышла новость там говорили что чуть ли не пароли можно стаскивать но если из-за шума леность это все данные ставятся под сомнение тут просто это код который вот это вот результат это результат работы моего эксплу это вот как бы ему там source code и вот как он работает опять таки проблема в том что у вас данные все время должны быть в кэше которым вы хотите обратиться и у вас все время должен быть активной активная запись в tlb современные как бы эксплойты которые появились вот
буквально там течение последнего месяца они состоят из трех трендов первый трек делает тоже что делаю я второй тренд все время вызывает операционную систему си сколам ел который на самом деле просто горит передаю управление другой программе потому что мне нечего делать а третий занимается тем что он либо читает данные диска либо что-нибудь там по сети гоняет в общем ваша задача что заставить его процессор вести себя так чтобы у вас в кэше всегда была какая-то кусок данных ядра и всегда у вас был tlb и тогда вот с мусором этим как бы проблема там у них решается и пароли реально можно считывать еще вопросы