Специально оставленный бэкдор или криворукость инженеров Интел?
Intel выпустила обновление микрокода, устраняющего уязвимость (CVE-2019-14607), позволяющую через манипуляции с механизмом динамического управления напряжением и частотой в CPU инициировать повреждение содержимого ячеек с данными, в том числе в областях, используемых при вычислениях в изолированных анклавах Intel SGX. Атака получила название Plundervolt, и потенциально позволяет локальному пользователю добиться повышения своих привилегий в системе, вызвать отказ в обслуживании и получить доступ к закрытым данным.
Атака представляет опасность только в контексте манипуляций с вычислениями в анклавах SGX, так как для проведения требует наличия прав root в системе. В простейшем случае, атакующий может добиться внесения искажений в информацию, обрабатываемую в анклаве, но при более сложных сценариях не исключается возможность воссоздания хранимых в анклаве закрытых ключей, используемых для шифрования с использованием алгоритмов RSA-CRT и AES-NI. Техника также может применяться для генерации ошибок в изначально корректных алгоритмах для провоцирования возникновения уязвимостей при работе с памятью, например, для организации обращения к области за границей выделенного буфера. Прототип кода для совершения атаки опубликован на GitHub
Суть метода в создании условий для возникновения непредвиденных искажений данных при вычислениях в SGX, от которых не защищает применение шифрования и аутентификации памяти в анклаве. Для внесения искажений оказалось можно использовать штатные программные интерфейсы для управления частотой и напряжением, обычно применяемые для снижения энергопотребления во время простоя системы и активации максимальной производительности при выполнении интенсивных работ. Характеристики частоты и напряжения охватывают весь чип, в том числе влияют на выполнение вычислений в изолированном анклаве.
Изменяя напряжение, можно добиться возникновения условий, при которых заряда оказывается недостаточно для регенерации ячейки памяти внутри CPU, и её значение меняется. Ключевым отличием от атаки RowHammer является то, что RowHammer позволяет изменить содержимое отдельных битов в памяти DRAM, путём цикличного чтения данных из соседних ячеек, в то время как Plundervolt позволяет добиться изменения битов внутри CPU, когда данные уже загружены из памяти для выполнения вычислений. Подобная особенность позволяет обойти применяемые в SGX механизмы контроля целостности и шифрования данных в памяти, так как значения в памяти остаются корректными, но могут исказиться при операциях с ними, до того как результат будет записан в память.
Если данное изменённое значение используется в процессе умножения в процессе шифрования, то на выходе отказывается некорректный шифротекст. Имея возможность обращаться к обработчику в SGX для шифрования своих данных, атакующий может вызывая сбои накопить статистику об изменении шифротекста на выходе и за несколько минут восстановить значение хранящегося в анклаве ключа. Исходный текст на входе и корректный шифротекст на выходе известны, ключ не изменяется, а вывод некорректного шифротекста свидетельствует об искажении какого-то бита на противоположное значение.
Проанализировав накопленные при разных сбоях пары значений корректного и искажённого шифротекстов, при помощи методов дифференциального анализа сбоев (DFA, Differential Fault Analysis) можно предугадать вероятные ключи, применяемые для симметричного шифрования AES, а затем проанализировав пересечения ключей в разных наборах определить искомый ключ.
Проблеме подвержены различные модели процессоров Intel, включая CPU Intel Core с 6 по 10 поколение, а также пятое и шестое поколения Xeon E3, первое и второе поколения Intel Xeon Scalable, Xeon D, Xeon W и Xeon E.
Напомним, что технология SGX (Software Guard Extensions) появилась в процессорах Intel Core шестого поколения (Skylake) и предлагает серию инструкций, позволяющих выделять приложениям пользовательского уровня закрытые области памяти - анклавы, содержимое которых не может быть прочитано и изменено даже ядром и кодом, выполняемым в режимах ring0, SMM и VMM. Передать управление коду в анклаве невозможно традиционными функциями перехода и манипуляциями с регистрами и стеком - для передачи управления в анклав применяется специально созданная новая инструкция, выполняющая проверку полномочий. При этом помещённый в анклав код может применять классические методы вызова для обращения к функциям внутри анклава и специальную инструкцию для вызова внешних функций. Для защиты от аппаратных атак, таких как подключение к модулю DRAM, применяется шифрование памяти анклава.