Программные баги давно уже стали привычными для нас: мы сталкиваемся со сбоями в работе ПО зачастую ежедневно. Реже, но все же случаются и аппаратные проблемы — из-за перегрева, короткого замыкания или залития умирает достаточное количество гаджетов. Но есть особые ошибки, связанные только с процессорами: они тоже могут приводить к сбоям в работе программ и даже к возможным дырам в безопасности: про Spectre и Meltdown слышали, я думаю, большинство читателей. Таких проблем за всю многолетнюю историю компьютеров набралось немало, и о них мы сегодня и поговорим.
Пожалуй, один из древнейших из известных процессорных багов, который заключался в том, что некоторые процессоры Intel 80386 (еще до 386DX и 386SX) могли зависать при выполнении 32-битного кода. И основная проблема была в том, что Intel не могла найти сбойные процессоры при производстве, и их невозможно было «вылечить» обновлением микрокода.
В итоге компании пришлось отзывать уже проданные процессоры и проводить на них тесты вместе с только что произведенными, чтобы разделять их на две категории: «хорошие», которые проходили тесты и могли работать с 32-битным ПО, маркировались двумя сигмами (ΣΣ), а плохие получали название «16 BIT S/W ONLY» и тоже продавались, но уже по сниженной цене. С учетом того, что 32-битного софта тогда (в конце 80-ых) почти не было, такие CPU брали достаточно активно, а сейчас коллекционеры готовы выложить за такие процессоры кругленькую сумму.
Баг F00F
Одна из достаточно серьезных аппаратных ошибок, которая могла привести к зависанию системы. Название происходит из последовательности байтов, которые и формируют «убийственную» для Pentium MMX и Pentium OverDrive команду — F0 0F C7 C8.
Сама инструкция выглядит как lock cmpxchg8b. Вторая часть инструкции — это сравнение пары регистров памяти, при котором происходит попытка поместить 8-байтовый результат в 4-байтный регистр. Вообще говоря, в обычных условиях это просто вызвало бы исключение, которое обрабатывалось бы отдельно и не приводило к сбою. Но все менял префикс lock — обычно он используется для того, чтобы предотвратить одновременное обращение двух процессоров к одному участку памяти.
Использование этого префикса в данном случае приводило к багу — обработчик исключений не вызывался, и процессор зависал. При этом эта инструкция не требовала никаких особых привилегий, что позволяло ей проявляться на практически любом ПК с такими процессорами. К счастью, эта проблема исправлялась программно без потери производительности, а аппаратно она была исправлена уже в Pentium Pro.
Ошибка Pentium FDIV
Также известная как арифметическая ошибка процессоров Pentium, которая закралась в модуль операций с плавающей запятой в первых процессорах Pentium 60/66 МГц. Ошибка выражалась в том, что при делении чисел с плавающей запятой при помощи команды FDIV результат мог получаться некорректным.
Причем Intel знала об этой проблеме, но утаила ее. После того, как это вскрылось, компания заявила, что проблема происходит в одном случае из 9 миллиардов, но потом, под давлением общественности, корпорации все же пришлось обменивать такие процессоры на нормальные, что стоило им 475 млн долларов — половина прибыли всей компании за последний квартал 1994 года.
Как выглядела проблема? Если вы посчитаете на калькуляторе 4195835*3145727/3145727, то скорее всего, если не ошибетесь, получите 4195835. Pentium же при использовании математического сопроцессора получит 4195579 — достаточно существенное различие.
Официальной заплатки от Intel не было, но некоторые компиляторы (например, Delphi и Visual Basic), проводя проверку, могли определить сбойный экземпляр процессора и корректировать получаемый в результате вычислений результат, чтобы он в итоге оказывался правильным.
«Режим бога» для x86 процессоров
В 2015 году специалист по информационной безопасности Крис Домас обнаружил серьезную и достаточно старую уязвимость в процессорах Intel, выпущенных с 1997 по 2010 годы (до второго поколения Intel Core i — Sandy Bridge). Серьезность бага заключалась в том, что он позволял выполнять любой код на x86-процессорах, выпущенных в эти годы.
Сама уязвимость связана с функцией, которую реализовали в архитектуре x86 в 1997 году: она позволяет получить доступ к режиму System Management Mode (SMM), в котором приостанавливается исполнение любого стороннего кода и запускается специальная программа, хранящаяся в защищенной области памяти. SMM нужен был для отладки процессора, поэтому на практике доступ к нему схож с «God Mode» — получаемые таким образом права выше любого системного доступа, что позволяет делать все что угодно: перепрошивать BIOS, снимать данные по нажатиям клавиш на клавиатуре и т.д. При этом, разумеется, переустановка системы не поможет, так как проблема лежит глубже.
Правда, есть одна проблема: для проведения атаки при помощи старого процессора нужен физический доступ к ПК с ним, что, обычно, и так позволяет получить любые данные. Но Intel в данном случае серьезно отреагировала на это и выпустила прошивки для большинства старых чипсетов — правда, уязвимость все равно остается, так как далеко не все ставят заплатки, особенно на компьютеры 10-летней давности.
Баг в процессорах MediaTek
Разумеется, с развитием ARM-процессоров различные ошибки и уязвимости стали находить и в них. Так, про процессоры от MediaTek слышали, скорее всего, многие — а те, кто знакомы с ними близко, едва ли удивятся багу в них, который появился из-за банального недосмотра.
Так, SoC MediaTek имеют в том числе и встроенные модемы вместе со средствами отладки, которые нужны для операторов связи, дабы те могли протестировать новые устройства в своих сетях. Разумеется, в пользовательских устройствах отладчик должен быть отключен — но этого не произошло, поэтому по сути компания оставила в системе бэкдор, благодаря которому можно было получить любые личные данные пользователи, в том числе сообщения, контакты, фото и т.д.
Доподлинно известно, что проблема была на SoC MediaTek MT6582 под Android 4.4 — вот только узнали о ней в 2016 году. Конечно, MediaTek сообщила об этом производителям устройств, но, очевидно, никто не стал выпускать под такие старые девайсы обновление, закрывающее этот бэкдор.
Получение root-доступа на устройствах с процессорами Snapdragon
Проблемы с безопасностью в 2016 году были не только у MediaTek, но в случае с Qualcomm они были и глобальнее, и глубже: так, под удар попали флагманские Snapdragon 800, 805 и 810, работающие на ядре Linux 3.10 под управлением Android с 4.4 по 6.0.1 — в общем, практически все флагманы того времени.
Получение root-прав происходило с помощью двух багов: CVE-2016-0819, из-за которой определенная область в памяти ядра может быть повреждена, а затем освобождена, что вызовет утечку данных. Вторая уязвимость — CVE-2016-0805, которая связана с функцией get_krait_evtinfo в процессорах Qualcomm: она может вызвать переполнение буфера. И если использовать эти два бага одновременно, то можно получить доступ к любым пользовательским данным.
Разумеется, Qualcomm вместе с Google закрыла эти уязвимости в течение пары месяцев, но, увы, далеко не все устройства получили патчи для устранения этих багов.
Spectre и Meltdown
Пожалуй, самые известные на данный момент аппаратные баги в подавляющем большинстве процессоров, выпущенных с 1995 года: сюда входят и решения от Intel, и от AMD, и 64-битные ARM. К счастью, большую часть этих уязвимостей можно закрыть программно, что это уже было сделано, к тому же Intel в новых линейках своих процессоров уже исправила часть эксплойтов аппаратно.
Как же эти баги работают? Начнем, пожалуй, с Meltdown (CVE-2017-5754). Он базируется на том, что в современных процессорах от Intel предсказатель ветвлений игнорирует MMU. Непонятно, не правда ли? Давайте разбираться. MMU — Memory Management Unit — блок контроля за адресным пространством, его обязанность в том, чтобы параллельно запущенные процессы работали в своих участках памяти, не мешая друг другу.
Что такое «предсказатель ветвлений» уже более-менее понятно из названия — это блок в процессоре, который может предсказать, какие инструкции в будущем будет использовать CPU, чтобы загрузить и выполнить их заранее. С учетом того, что точность предсказания превышает 90%, это серьезно ускоряет работу современных процессоров.
И что мы получаем в итоге? Если работает предсказатель ветвлений, то MMU отключается и один процесс может использовать память другого — вот так и работает уязвимость Meltdown.
Уязвимость Spectre работает хитрее, сложнее и сильно медленнее: благодаря ей не получится узнать, что же хранится в памяти атакуемого процесса — она позволяет узнать, чем же этот процесс сейчас занимается. Помогает ей в этом все тот же предсказатель ветвлений: выполняя различные инструкции, зловред может вычислить по скорости получения данных из кэша или ОЗУ, какие инструкции сейчас выполняет атакуемый процесс.
Как видите, процессоры имеют достаточное количество различных багов и уязвимостей, и это далеко не весь список (в следующей статье поговорим про ошибки в работе Hyper-Threading у Skylake, TLB в некоторых Phenom и многие другие). Знаете еще какие-нибудь интересные процессорные баги? Пишите об этом в комментариях.