Обновить
8K+
320
Николай Шлей@CodeRush

Firmware Security Engineer

29,1
Рейтинг
692
Подписчики
Отправить сообщение
иногда последствия самых вроде безобидных команд могут быть не сразу очевидными
Зачастую, эти последствия бывают неочевидными даже для самих разработчиков процессора, целая плеяда микроархитектурных атак вроде Spectre, Meltdown, Foreshadow, RIDL, Fallout и остальных — отличное тому подтверждение. Знать и понимать — надо, конечно, но надо тоже осознавать пределы своего понимания, а то ведь я до сих пор вижу в индустрии людей, которые в своем ассемблерном коде старательно избегают pipeline hazard'ы, которых их нынешний процессор давно уже не боится, а на Pentium Pro их код запускаться точно уже не будет…

Про ситуацию с «кэша нет» думать уже не хочу, прошу пардону, потому что и лень, и «так верстают только мудаки (тм)». Можно пойти почитать мануал на тему «кто там в память сбрасывает свой architectural state, и при каких условиях», вспомнить про сегментную адресацию и thread local storage, и прочие разные штуки, но я уже в пижаме и мне уже слишком влом.
То, что чтений может быть больше одного — это нетрудно сделать, TLB-промаха достаточно для того, чтобы процессор вынужден был выполнить трансляцию адресов, для которой понадобится одно или несколько обращений к таблице трансляции (в зависимости от того, как именно настроен paging).
С несколькими записями тоже проблем нет — кладем инструкцию последним байтом страницы, заполняем кэши так, чтобы ничего ни с этой, ни со следующей страницы в них не было, выполняем на эту нашу инструкцию nop неожиданный дальний переход — pipeline flush, cache flush, протокол когерентности заставил сделать write-back как минимум двух вымытых из кэшей линий (которые теперь заменили одна с конца этой страницы, ее запросил декодер, а другая — с начала следующей, эту запросил префетчер).
Хорошая задача, но нуждается в дополнительных уточнениях условий, потому что реально худший случай может быть CXL-устройством, подключенным в адресное пространство процессора, которое при попытке декодировать с него nop пойдет этот самый доступ в память осуществлять, а процессору скажет подождать немного, пока оно не закончит, и ждать он там может до ишачьей пасхи, или пока вочдог всех не прибьет.

Если подразумевать, что ничего такого у нас нет, и задача без особого подвоха, то получится примерно «пошли декодировать, нарвались на начало длинного нопа с префиксами, который попал посередине на границу физических страниц, при этом в TLB ничего нет нужного, и потому надо идти в память декодировать, и еще оказалось, эта вторая страница не исполняемая, ошибка декодирования, кровь, кишки, распидорасило, охулиард записей в память на логи и крэш-дамп».

image
Мерять надо, понятно, но мой собственный палец (это которым «в небо») говорит, что арифметические операции, выполняемые целиком на ALU, выполняются нынче за один такт (на современных х86 после Skylake это так даже для 256- и 512-битовых регистрах), а половина примерно мувов из регистра в регистр — за ноль (потому что там внизу регистровый файл, и переименование фактически бесплатное). L1D на этих же процессорах умеет при идеальных условиях читать две линии по 512 бит за такт, или писать одну, но там если самому с выравниванием не заморочиться хоть немного, можно попасть на границу кэш-линии (и просесть вдвое на ровном месте), или физической страницы (и просесть в ~200 раз), ну и плюс мы тут всяко не одни исполняемся, и из кэша наше игровое поле может вымыть в любой момент…

Короче, мерять надо все равно, и написать кучу разных вариантов, но обычно те, кто это все умеет и практикует — они уже на работе сыты этим всем по горло. Студентам зато можно дать в качестве задачи со звездочкой.
%macro memtoreg 4
xor r10, r10
mov r10b, byte [stor + %4]
xor r11, r11
mov r11b, byte [stor + %3]
xor r12, r12
mov r12b, byte [stor + %2]
xor r13, r13
mov r13b, byte [stor + %1]
%endmacro

Все было плюс-минус хорошо до вот этого момента, байтоебили экономили память, изучали платформу и регистры, радовались, а потом пошли копировать в регистры и обратно по одному байту, потому что на этой платформе за неправильное выравнивание bus error не прилетит.

Не надо так, если у вас все игровое поле влезает в пару широких машинных регистров — читайте\пишите его туда\оттуда целиком за один выравненный доступ в память, а потом разберите побайтно сдвигами, если вам прямо так неудобно с ними оперировать.

Понятно, что все это буйство оптимизации разобьется все равно об последующее копирование 16 параметров в стек для printf, но без него статья получается странная, потому что непонятно, зачем оно все, если на С можно написать ровно то же самое, только проще в разы.

Надо будет написать статью про современное применение ассемблера там, где он реально нужен — в прошивке до инициализации оперативной памяти или cache-as-ram, в ядре ОС для перехода во всякие хитрые режимы исполнения и выхода из них, и т.п.
Можно, я гарантирую это. Статью саму комментировать не буду, потому что в успех вот этих войн обиженных тетенек против мегакорпораций в твиттере верю не очень сильно.
Архитектура процессора там не при чем, на ARM есть сейчас стандарт Base Boot Security Requirements, в котором отключаемый SecureBoot прописан явно. Вы говорите про устройства типа смартфонов Nokia с Windows Mobile и прочие планшеты Microsoft Surface, и да, на них в свое время не было возможность отключить SecureBoot без костылей, но они и совместимость со спецификацией UEFI никогда не декларировали, а прошивки для ПК делают именно это вполне явно.
Это все ерунда, конечно, но это наша единственная работающая и относительно универсальная ерунда на ПК. Проблему с разрастанием DBX можно достаточно несложно решить разделением ее на статическую и динамическую части, с добавлением статической (того самого revocation list) в саму прошивку, и модификацией драйвера SecureBoot, чтобы он проверял обе.

У UEFI SecureBoot действительно не очень хороший дизайн, но с практической точки зрения вот такая безопасная загрузка намного лучше, чем никакой, да и у конкурентов не особенно много более качественных альтернативных вариантов. Да, никто не думал в 2011 году, что придется отозвать две сотни подписей одним махом, но эта проблема уже известная, и решаемая, и ее даже решили частично введением в UEFI 2.4 Audit Mode и Deployment Mode с последующим отключением доверия к UEFI CA (которым все эти две сотни загрузчиков все и подписаны). BootHole — это отлично, на самом деле, потому что показывает, что улучшения в системе отзыва и упрощения цепочки доверия надо бы внедрять за 1-2 года, а не за 5-7, как сейчас.
Выключить все равно будет можно, это прописано в спецификации, которую настолько сильно никто уже обновлять не станет, переживать не надо. Да и дураков там тоже нет, каждую итерацию в МС подписывать.
Сухой воздух зимой в Сибири — это не миф, это суровая реальность, особенно для тех, кто там не живет все время (они привыкли плюс-минус), а приезжает к родне и друзьям на новогодние праздники. В итоге первые пару ночей трудно спать — слизистая носа сухая, буквально «хрюкаешь» при дыхании, и вероятность заболеть простудой сильно выше, чем у местных. Спасаюсь в итоге увлажнителем воздуха, потом через пару недель привыкаешь, слизистая начинает вырабатывать больше слизи, жить становится легче.
Добавьте кнопку Path через Customize Toolbar (есть в меню по правой кнопке мыши или щелчку двумя пальцами по тачпаду), вот эту:
Сначала воевать буду, пока что, там посмотрим. Денег я уже насобирал достаточно, а интересная работа по моему профилю есть и в других компаниях.
Если коротко, то некоторые из нас тут сами в ахуе, другого слова не подобрать. Я буквально парой комментариев назад писал про то, что вокруг меня нет жидомасонского заговора человекообразных гремлинов, специально внедряющих бэкдоры и ломающих пользователями их устройства, и про то, что стандарт мимо которого ты прошел — это стандарт, с которым ты согласился. С этим вот я соглашаться не намерен, и сделаю все, что в моих силах, чтобы никакие системы отслеживания контента в пользу каких-то непонятных неправительственных организаций с горы на моем устройстве не появились. Испанский стыд как он есть, буквально 20 лет маркетинга и пиара про приватность и безопасность — в канализацию.
Давайте называть RSU как-нибудь иначе на русском, чем «опционы», потому что опционы настоящие с RSU имеют мало общего, и их в качестве бонуса обычно предлагают только на очень высоких позициях людям, у которых и так уже горы денег.
Employee Stock Option — это предложение от компании по выкупу определенного пакета акций по фиксированной цене, которая часто значительно ниже рыночной либо планируемой рыночной. Смысл опционы имеют только для тех, кто готов разменять свои собственные деньги сейчас на возможную прибыль (или убытки, что тоже бывает нередко) в будущем, т.е. бонус этот обоюдоострый, и далеко не всем подойдет, особенно тем, у кого от зарплаты мало что остается после всех трат в дорогом городе.
Restricted Stock Unit — это грант (бонус) на определенную денежную сумму, но выдаваемый в виде пакета акций, которые поступают на счет работника равными небольшими долями следующие несколько месяцев или лет. Свои деньги для их получения тратить не нужно, но чтобы получить весь объем гранта, нужно работать в компании на протяжении всего срока этого гранта. Смысл имеют для всех, особенно в условиях растущего рынка акций.
Вы же понимаете, что НДА запрещает мне не только распространение данных, но и метаданных, и даже если у меня каким-то образом есть доступ к этому коду, я ничего о нем сказать не могу.

Вот вам мое свидетельство канарейки: ошибок случайных я видел сотни, (исправил сегодня одну такую, про которую в релизе кричали бы намного громче, и за которую помоями обливали бы именно меня лично, а в итоге оказавшуюся комбинацией двух логических ошибок и двух проблем с тестовой матрицей), а ошибок намеренных я не видел ни одной. Я сам действительно хочу сделать продукт лучше, и коллеги мои тоже, и начальство, а злобных человекообразных гремлинов, требующих внесения деструктивных изменений без объяснения причин — ни одного не видел. Это не значит, что их нет, корпорация огромная, в ней может быть целый отдел таких гремлинов, но пока что никаких следов их заговора против человечества я не видел. Обычные людские пороки — в изобилии, вакханалии чекистов с масонами — не наблюдаю.

Понятно, что это мои слова против ваших слов, и я сам может быть такой гремлин и масон, но репутация такая штука, что ее сначала зарабатываешь десятки лет, а потом можно всю легко просрать за пять минут. The standard you walk by is the standard you accept, как тут местные ребята говорят, и из злобной корпорации зла я бы давно сам ушел, а тут вот пока держусь.
Модификация драйвера была сделана намеренно (все модификации кода делаются намеренно), чтобы исправить какую-то проблему на штатных и поддерживаемых конфигурациях, на работающем железе в поддерживаемой версии ОС. Тот факт, что это привело к неработоспособности уже и так сломанного железа — вот это случайность, о которой я тут говорю. Я не знаю причин появления этого кода в кексте, но я абсолютно уверен в том, что причина эта не в том, чтобы заставить пользователей уже и так сломанных макбуков десятилетней давности обновить свое железо. "Предполагайте добрые намерения".
Это явно случайность, и причину я уже назвал, но если вы хотите верить в теорию заговора против вас лично и других владельцев неисправного железа — мне вас убедить не удасться никакими аргументами.

Задумайтесь вот о чем: ваша неисправная система перешла из одного нештатного и нетестируемого состояния в другое нештатное и нетестируемое. Мусор на входе — мусор на выходе. Какие могут быть претензии к производителю по этому поводу? Претензии к отваливающимся чипам мне понятны, и вопросов к ним у меня нет, но работоспособность после отвала чипа — это такая же случайность, как и неработоспособность. С точки зрения разработчика кекста — оба варианта одинаково сломаны, и потому переход из одного в другой — результат исключительно случайного процесса, а не коварного плана злых корпорастов.

Даже не говоря о том, что специально это все крайне непросто сотворить, и для этого надо и иметь эту сломанную железку, чтобы проверить, что она действительно перестала работать после изменений, и тратить кучу времени дорогих специалистов чтобы доломать уже сломанное. Процесс внесения изменений в код ОС занимает недели и задействует десятки людей и тысячи автоматических тестов, все это стоит заметных денег, которые на доламываемое уже сломанного при наличии кучи других, весьма реальных и неприятных проблем, тратить никто и никогда не будет.

Но нет, все равно диверсия, сделано НАМЕРЕННО, заговор мегакорпорации против трех с половиной обладателей неисправных макбуков…

Информация

В рейтинге
307-й
Дата рождения
Зарегистрирован
Активность

Специализация

Инженер встраиваемых систем, Системный инженер
Ведущий