mercury13_kiev (mercury13_kiev) wrote,
mercury13_kiev
mercury13_kiev

Category:

Немного о дырявых абстракциях и Meltdown

Джоэл Спольски как-то придумал «закон дырявых абстракций».

Но давайте сначала поговорим о том, что такое абстракция в инженерном смысле. Это придумывание сложному простого фасада. Например, интернет-протокол IP ненадёжен. И тут мы говорим: действующий поверх него протокол TCP — это протокол надёжной передачи. Каким образом мы делаем надёжное поверх ненадёжного? А мы повторяем недошедшие пакеты и придерживаем пришедшие слишком рано, пока не отдадим принимающей стороне всё по порядку.

Таким образом, программист, работающий с TCP, просто запихивает куда-то внутрь ленту байтов, а с другой стороны провода эта лента появляется.

TCP гарантирует, что данные прибудут на место? Нет, конечно: если ваш сетевой провод оборван, ничего не придёт. Вот это и есть дырявая абстракция: найдутся граничные случаи, когда начнут вылезать особенности реализации.

Спольски заявляет: любая нетривиальная абстракция дырява.

А теперь поговорим про современные процессоры. Чтобы процессор был быстрее, он автоматически, без участия программиста, делает кучу вещей.

  • Кэш-память: когда процессору потребовался какой-то байт, он считывает кучу соседних байтов и хранит их в быстрой памяти.
  • Внеочередное выполнение операций: когда операция 2 ждёт результата операции 1, а операции 3 нужен занятый блок, мы можем взять и выполнить операцию 4. При этом внеочередное выполнение может случиться раньше, чем процессор проверит права доступа к памяти.
  • Конвейерное выполнение: у многоствольного пулемёта один патрон заряжается, второй выстреливается, третий выбрасывается. В процессоре одновременно одна операция декодируется, вторая исполняется, результаты третьей записываются в регистры.
  • Предсказание ветвлений: если случился переход, конвейер придётся сбросить и заполнить с нуля. В микроконтроллерах так и поступают: например, в AVR двухместный конвейер, и если важен каждый такт — мы знаем: каждый случившийся переход отнимает лишний такт. В x86 конвейер на 20 и более мест, и процессор начинает прикидывать: будет тут переход или нет?

Следите за руками. Чтобы прочитать один бит из закрытого байта P (protected), заведём два открытых байта: U0 и U1 (unprotected). В ветке, которая никогда не выполнится реально, но будет выполнена наперёд, мы считываем данные из P, вычленяем один бит и проводим с ним какую-нибудь операцию, которая даст результатом адрес U0 или U1, а затем читаем данные по этому адресу.

Процессор так реально и не выполнит этот код, однако в кэше будет U0 или U1, и сравнив время чтения этих байтов, можно определить, что там в закрытом бите: ноль или единица.

Intel, разумеется, закрыл дыру (с небольшим снижением производительности). Но всё равно остаются вопросы: не будет ли новых дыр в столь сложных абстракциях? И действительно, вскоре появился Spectre, эксплуатируемый несколько более сложно, но к нему уязвимы почти все процессоры. И TLBleed, который так и не стал настоящей уязвимостью. АНБ, вероятно, имеет в рукаве ещё пару таких хаков. (Хотя нет, им, думаю, проще использовать в своих целях Intel Management Engine, небольшой высокозащищённый процессор в составе всех чипсетов Intel.)

Tags: мысли, разработка ПО
Subscribe

Recent Posts from This Journal

  • О вынужденной коррупции

    Не так давно соцсети смеялись над новой российской законодательной инициативой — вынужденной коррупцией. Смысл: если коррупция избавляет от…

  • Строка-ограничитель, ответ

    Текст задачи Если у нас алфавит 0…9 и 125 строк, из принципа Дирихле следуют два факта. 1. Хватит трёх цифр. 2. И не просто трёх цифр, а от…

  • Задача для программистов: Строка-ограничитель

    Есть словарь (в программистском смысле — конечный набор строк в некоем алфавите). Придумать алгоритм, который находит строку из этого алфавита,…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments