Компьютерные системы включают в себя аппаратное и программное обеспечение: физические компоненты, выполняющие фиксированный набор операций; логические элементы, состоящие из данных и инструкций, определяющих сценарии выполнения аппаратных операций; а также входные данные для них. Каждая отдельно взятая функция может быть реализована с использованием различных сочетаний аппаратных и программных компонентов (или полностью аппаратно). От сочетания аппаратного и программного обеспечения зависят свойства выполнения функции: производительность и безопасность системы.

Безопасность оборудования

На протяжении десятилетий считалось, что именно аппаратная защита лучше всего противостоит потенциальным атакам. Это нашло отражение в уже давно применяемых аппаратных модулях безопасности (hardware security module, HSM), таких как распознающие несанкционированные операции и защищенные от атак криптокарты IBM CryptoCards, а также Intel Software Guard Extensions (SGX) и ARM TrustZone.

Вместе с тем в исследовательских кругах начали высказывать сомнения относительно способности аппаратуры противостоять угрозам безопасности. Лишь беглый поиск в Сети выдает не менее 2 тыс. научных публикаций, в названиях которых присутствуют термины «оборудование» и «безопасность». На самом деле таких публикаций гораздо больше, а роль оборудования в обеспечении безопасности постоянно растет, поэтому необходимо тщательно изучать уязвимости, открывающие возможность для проведения атак. Уже само по себе это свидетельствует о том, что сообщество обеспечения безопасности проявляет серьезный интерес к отношениям между компьютерным аппаратным обеспечением и безопасностью. В обзоре [1] приводится 21 вариант аппаратной архитектуры, обеспечивающей целостность потока управления — правильную последовательность выполнения программы. Это свидетельствует о наличии уверенности в том, что аппаратные реализации хорошо коррелируют с лучшими методами обеспечения безопасности вычислительных систем.

Видимые преимущества безопасности оборудования

Многоуровневая архитектура вычислительного устройства и то, что обычно воспринимается в качестве оборудования

Откуда вообще взялась слепая вера в непререкаемую безопасность аппаратного обеспечения? Интуитивно можно предположить, что ощущение безопасности возникает в силу уже самого физического существования таких аппаратных средств и обладания ими. Аппаратные коммутаторы предоставляют видимые гарантии целостности выполнения операций: если, например, состояние задано, то оно однозначно остается очевидным. Аналогичным образом пользователи пребывают в уверенности, что владеют и управляют информацией и возможностями, присущими съемным устройствам, таким как USB-ключи и накопители. На первый взгляд, аппаратные компоненты кажутся более простыми и ограниченными по функционалу, чем программные, — например жесткие диски предназначены исключительно для хранения данных, а клавиатура является только средством ввода информации и команд. Физическая природа компонентов означает, что после отгрузки устройства клиентам устранить возможные дефекты будет весьма затруднительно, что заставляет разработчиков оборудования действовать консервативно и вдумчиво. Все это способствует формированию ощущения дополнительной безопасности и большей уверенности в защите по сравнению с использованием ПО.

Однако если отбросить домыслы о добросовестности разработчиков аппаратного и программного обеспечения, а также возможные ментальные предубеждения в отношении физических и логических компонентов и сосредоточиться на функциональных свойствах, отличающих аппаратные и программные реализации с точки зрения безопасности, то можно выделить два основополагающих аспекта: неизменность и привилегии. Неизменность — это способность функциональных свойств сопротивляться изменению их исходной архитектуры. Поскольку физическая реализация аппаратного обеспечения представляет собой совокупность электронных схем и транзисторов, то можно говорить о том, что оборудование обладает присущей ему неизменностью: аппаратно реализованные функции нельзя изменить путем подмены нескольких битов в памяти. Если злоумышленник хочет изменить порядок функционирования оборудования, то должен изменить его физически, что требует непосредственного физического доступа к жертве. Такое положение дел успокаивает, поскольку внесение физических изменений говорит об очевидном внешнем вмешательстве.

Неизменность является преимуществом вдвойне, поскольку аппаратное обеспечение не нуждается в реализации «машины Тьюринга» [2]. У оборудования есть присущий ему уклон в сторону упрощения и экономии. Поскольку оно предполагает физическое воплощение, то наличие расширенной или неиспользуемой функциональности выливается в дополнительные затраты, благодаря чему возникает стимул избегать избыточной мощности. Поэтому аппаратная логика чаще всего реализует строго достаточную для выполнения предписанных задач функциональность без включения туда произвольных операций. Естественно, все это способствует ограничению возможного ущерба, наносимого в случае компрометации или неисправности оборудования: состояние аппаратного переключателя в цепи может быть изменено злоумышленником с «выключен» на «включен», но переключатель нельзя перепрограммировать каким-то совершенно иным образом. Программное обеспечение, напротив, как правило, имеет полнофункциональный механизм для выполнения чего-то, существенно отличающегося от запланированного функционала. В результате скомпрометированное или дефектное программное обеспечение предоставляет злоумышленнику доступ к полной по Тьюрингу среде, где можно выполнять случайно заданные функции.

Под привилегиями понимается возможность наблюдать и контролировать операции других компонентов. Это определение имеет достаточно тонкое отличие от характеристики привилегий на уровне ПО (возможностей ядра, противопоставленных полномочиям пользователя), поскольку программное обеспечение с более высокими привилегиями обычно охватывает и операции программ, привилегии которых оказываются ниже. Аппаратные и программные привилегии отличаются тем, что оборудование и ПО не могут выполнять один и тот же набор процедур. При сравнении полномочий в части дополнительных функций мы видим, что привилегированное программное обеспечение имеет возможность управлять (запускать, останавливать и прерывать) непривилегированными программами, а также наблюдать (чтение, запись) за состоянием их выполнения. Аналогичным образом оборудование, у которого присутствует механизм выполнения ПО, обладает такой же способностью управлять любыми запускаемыми им программами и осуществлять наблюдение за их состоянием.

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

Оборудование, прошивка и программное обеспечение

До сих пор мы обсуждали высокоуровневую абстрактную модель вычислительной системы, где компоненты полностью состояли из аппаратного или программного обеспечения. Однако на самом деле существует еще и третий, гибридный тип реализации вычислительных функций — микропрограммная прошивка, или встроенное ПО. Термин «прошивка» существует так же давно, как и само компьютерное оборудование, — он был предложен Ашером Оплером еще в 1960-х годах [3]. Прошивка имеет с программным обеспечением ряд общих свойств, поскольку реализована в виде программных инструкций, которые выполняются на полном по Тьюрингу аппаратном процессоре общего назначения.

Чтобы лучше понять, что представляют собой оборудование, прошивка и программное обеспечение, сравним четыре параметра этих компонентов: неизменность, привилегии, эффективность и стоимость (см. таблицу).

Аппаратные и программные решения: что опаснее?

Неизменность. Как уже говорилось, неизменность характеризует возможность изменения функциональности компонента. Если у оборудования неизменность является его неотъемлемым свойством, то с прошивкой и программным обеспечением дело обстоит иначе. Как правило, неизменность здесь обеспечивается каким-то другим компонентом (аппаратным или программным). Например, адресное пространство прошивки обычно закрыто для приложений (а во многих случаях — даже для операционной системы) либо контрольным аппаратным монитором, либо некоей комбинацией аппаратных и программных контрольных мониторов. Исходя из этого, можно утверждать, что действительно неизменным является только оборудование, в то время как прошивка и ПО могут сознательно изменяться определенными компонентами системы либо подвергаться изменениям вследствие недостатков проектирования и реализации. Здесь мы исключаем возможность атак в процессе поставки продукта еще до его попадания к пользователю, но даже в этом случае оборудование у скомпрометированного устройства остается неизменяемым: трояны, внедренные разработчиком или производителем, как правило, не могут быть удалены средствами прошивки или программного обеспечения.

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

Эффективность. Этот параметр определяет, какую производительность обеспечивает реализация в зависимости от количества тех или иных ресурсов (например, электроэнергии). Аппаратные реализации обычно более энергоэффективны по сравнению с программными и обеспечивают более высокую производительность при равном потреблении электроэнергии, хотя и прошивка, и ПО менее эффективны по сравнению с чисто аппаратными блоками. Прошивка зачастую находится ближе к оборудованию и может иметь доступ к специальным аппаратным функциям и средствам, что делает ее более экономичной по сравнению с программным обеспечением. Например, прошивка процессора (микрокод) не зависит от контекстных переключений и планировщика ОС, в отличие от обычного прикладного ПО.

Стоимость. Стоимость оборудования у каждой системы, как правило, фиксирована, а дополнительные затраты на развертывание программного обеспечения фактически равны нулю. В результате системы, содержащие более специализированное оборудование, обходятся в производстве дороже, что увеличивает их цену для конечного пользователя. Возникает интуитивное соотношение, известное практически каждому компьютерному инженеру: более быстрые системы, использующие аппаратные ускорители, стоят дороже.

Роль прошивки

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

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

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

Встраивание программ в оборудование

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

Оборудование — это новое программное обеспечение. Многие функции современного оборудования на практике реализованы на уровне прошивки и внедряются итерационно: то есть сначала — SGX (Software Guard Extensions), затем — SGX2 и т. д. Теперь не требуется реальная замена компонентов, поскольку дефекты в аппаратном обеспечении могут быть исправлены путем изменения встроенного программного обеспечения. В результате у оборудования появляются как дополнительные преимущества (гибкость и возможность обновления), так и недостатки (сложность и изменчивость), присущие ПО.

Нередко оборудование и прошивка рассматриваются как единое целое, считающееся просто оборудованием (см. рисунок). К примеру, бытует мнение, что диски с аппаратным шифрованием более безопасны, чем с программным, но есть нюансы: в аппаратных реализациях шифрования часто присутствуют и программные компоненты, содержащиеся в прошивке. Более того, устройства, традиционно воспринимаемые как непрограммируемые (неполные по Тьюрингу), при оснащении их прошивкой (внедрение процессора общего назначения) становятся полными по Тьюрингу, и если их скомпрометировать, то они могут выполнять функции, которые не предусматривались при проектировании. Один из таких примеров — клавиатура, которая на устройстве Apple с помощью простых программных средств превращена в регистратор нажатия клавиш.

Как оснащенное прошивкой оборудование сбивается с пути истинного

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

Устройства ввода-вывода

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

Жесткие диски. Жесткие диски и твердотельные накопители, которые обычно рассматриваются как простые блочные устройства, на самом деле содержат много встроенного ПО. В ходе недавнего анализа безопасности современных самошифрующихся твердотельных накопителей, на устройство Crucial MX100/MX200 была проведена успешная атака с перепрошивкой встроенного программного обеспечения, выполненная с использованием нескольких недокументированных команд конкретного поставщика. Обнаруженная уязвимость позволяет атакующему удаленно и скрытно перехватывать любые данные с диска, не оставляя на компьютере никаких следов. Злоумышленнику не нужен физический доступ, но может потребоваться сначала повысить привилегии удаленного доступа на локальной ОС. В отличие от обычных вредоносных программ, в данном случае вредоносный код содержался в прошивке, поэтому даже полная переустановка операционной системы не приведет к ликвидации заражения. В 2013 году было продемонстрировано, что на механическом жестком диске могут быть программно установлены скрытые лазейки.

Сетевые адаптеры. Еще в 2006–2007 годах было показано, как можно установить частичный контроль над сетевым адаптером Broadcom путем модификации его прошивки, а чуть позже спектр действия этой атаки был расширен с целью получения полного контроля над компьютером с использованием уязвимости в сетевом адаптере Broadcom NetXtreme. Уязвимость была обнаружена в прошивке, которая обрабатывала протокол Alert Standard Format — малоизвестную процедуру, предназначенную для удаленного администрирования.

Видеоплаты. Видеоплаты в компоненте видео-BIOS (VBIOS) также содержат встроенное программное обеспечение, которое загружается и выполняется центральным процессором примерно так же, как это происходит с обычным BIOS. Предпринимались попытки (в качестве примера можно привести nvresolution) настроить VBIOS таким образом, чтобы улучшить разрешение за счет драйвера видеобуфера. Однако видеоплаты могут быть использованы злоумышленниками и для выполнения вредоносного кода, что помогает избежать традиционного обнаружения вредоносных программ. Графический процессор и видеопамять создают полноценную среду для выполнения вредоносных программ, а общая память и центральный процессор используются в качестве дополнительных ресурсов для проведения атак. В 2013 году исследователи внедрили в компьютер программу перехвата нажатия клавиш на клавиатуре, которая выполнялась не центральным, а графическим процессором.

Другие устройства. Различные устройства осуществляют взаимодействие с другими компонентами через шины, такие как PCI и USB. В устройствах, подключаемых к этим шинам, реализованы общие, хотя и довольно сложные функциональные возможности их автоматического обнаружения и настройки, а также разрешения конфликтов между отдельными компонентами. Этот функционал обычно реализуется на уровне прошивки и становится источником разного рода уязвимостей. В 2006 году, например, была исследована особая роль PCI-расширения постоянной памяти (read-only memory, ROM). К этой категории относится в том числе и VBIOS. Соответствующая часть прошивки устройства может загружаться операционной системой в процессе инициализации. Было показано, что из-за отсутствия проверки сигнатуры прошивки расширение ROM платы PCI может быть перепрошито вредоносной программой. После этого плату можно использовать для проведения различных предзагрузочных атак, в том числе для манипуляций с ядром ОС при подключении к другому компьютеру.

Существование большого числа разнообразных USB-устройств объясняется тем, что интерфейс USB предлагает развитый и гибкий функционал. Вместе с тем здесь можно говорить об обоюдоостром лезвии: интерфейс USB позволяет эмулировать компоненты практически любого типа, в отличие от интерфейса SATA, к которому можно подключать только устройства хранения (если, конечно, ОС не скомпрометирована). Группа исследователей продемонстрировала концепцию BadUSB, предполагающую перепрограммирование USB-устройств с последующей атакой на компьютер, к которому они подключены. Исследователи, в частности, смогли перепрограммировать одно устройство для эмуляции другого — например, для эмуляции клавиатуры, которая стала направлять деструктивную последовательность ввода на машину жертвы. Уязвимости такого рода возникают из-за отсутствия проверки сигнатуры в прошивке USB-устройств. Таким образом, вредоносная программа, размещенная на одной машине, может использовать USB-устройства для заражения других. Она в состоянии, например, изменить прошивку веб-камеры или накопителя с интерфейсом USB с последующим заражением очередной машины, к которой будут подключены соответствующие устройства. Отсутствие контроля целостности прошивки распространено очень широко: из 52 семейств микросхем и 33 реальных устройств только в одном семействе была реализована примитивная форма защиты.

Проблема усугубляется тем, что пользователи, как правило, уделяют меньше внимания обновлению системы безопасности своих периферийных устройств по сравнению с традиционными программными системами — основной ОС и сервисами. Если для большинства ОС и приложений предлагаются автоматические обновления, защищающие системы от известных уязвимостей, то обновления прошивки периферийных устройств (например, жестких дисков или адаптеров Bluetooth/Wi-Fi) выполняются гораздо реже и должны управляться самими пользователями. Главный совет при проведении таких обновлений заключается в том, что инициировать их следует лишь тогда, когда в этом есть очевидная необходимость. Поэтому и устанавливаются они довольно редко.

Процессор и чипсет

Прошивка чипсета. Если исключить периферийные устройства, то старые ПК можно рассматривать как процессор, окруженный непрограммируемыми компонентами, размещаемыми на материнской плате. Единственной программной уязвимостью в такой системе является код, выполняемый на процессоре. Однако сегодня такой упрощенный взгляд на компьютерную систему уже не выдерживает критики. Например, Intel ME (Management Engine) — это, по сути, автономный «компьютер» с собственной ОС, реализованный на чипсете клиентского ПК. Intel ME поддерживает набор инструментов Intel AMT (Active Management Technology). Когда в 2017 году были обнаружены уязвимости AMT и ME (CVE-2017-5689), это вызвало большую обеспокоенность среди специалистов по безопасности, поскольку одновременно выяснилось, что как ME, так и соответствующие уязвимости могли присутствовать в системах еще в 2008 году.

Составной частью Intel AMT является приложение (трастлет), которое выполняется в среде ME и позволяет удаленно управлять компьютером. Этот крайне важный функционал был реализован в прошивке, которая может быть перезаписана и модифицирована нужным злоумышленнику образом. В результате атакующий получает удаленный контроль над системой независимо от того, какие программные средства защиты присутствуют в ОС. Более того, размещаясь на аппаратном уровне скомпрометированной системы, Intel ME пользуется неограниченными привилегиями по отношению ко всем прочим частям системы. Фактически нельзя быть полностью уверенным в том, что вредоносный код действительно удален. Исследователи вопросов безопасности активно изучают Intel ME с 2009 года и, например, предложили термин «руткит третьего кольца», за которым скрывается код, внедренный в ME с более высокими, чем у любого другого ПО и прошивок компьютера, привилегиями. Инъекционная атака использует уязвимость в технологии восстановления памяти, характерной для процессоров Intel. Возникает возможность неправильного переназначения памяти, которое должно быть запрещено. Функция восстановления памяти, облегчившая проведение атаки, служит для того, чтобы системное программное обеспечение могло переназначить динамическую оперативную память при конфликтах с диапазоном физических адресов, отображаемым на устройствах ввода-вывода. Первоначальная технология восстановления памяти не учитывала необходимости надлежащего контроля доступа и проверки памяти, используемой Intel ME.

Хотя в дальнейшем в Intel и устранили эту уязвимость, зашифровав память ME и пытаясь предотвратить новые компрометации изоляции ME, другие уязвимости в ядре прошивки ME (например, CVE-2017-5705, 6, 7) привели к последующим компрометациям прошивки и облегчили выполнение произвольного кода. В 2017 году в чипсете Lewisburg компания Intel представила новую технологию Innovation Engine (IE). В отличие от ME, здесь допускается только выполнение встроенного ПО от Intel. IE предназначена и для OEM-производителей, что потенциально увеличивает число уязвимостей прошивки чипсета.

Для краткости изложения здесь не обсуждаются другие типы прошивок чипсета — например, контроллер управления материнской платой, который, как и Intel ME, на протяжении десятилетий присутствовал в серверных материнских платах. Эти многочисленные примеры показывают, что чипсеты, которые не относятся к числу простых непрограммируемых элементов материнской платы, реализуют сложный функционал и содержат целый ряд таинственных прошивок, о которых большинство пользователей имеют очень слабое представление.

Прошивка хоста. Прошивку, которая обрабатывается центральным процессором (в отличие от других чипов), будем называть прошивкой хоста. По сравнению с прошивкой чипсета, прошивка хоста, известная как BIOS/UEFI (Unified Extensible Firmware Interface), — это нечто большее, чем просто отображение экрана начальной загрузки и инициализация компьютерного оборудования. Даже после загрузки системы существенная часть прошивки хоста продолжает работать в режиме SMM (system management mode), в котором выполняется высокопривилегированное ПО, реализующее важнейшие низкоуровневые системные функции, такие как управление питанием и контроль за оборудованием. Поскольку SMM-код работает с привилегиями, которые превосходят даже привилегии ОС, он и является извечной целью для атак. На старых материнских платах (выпускавшихся до 2006 года) SMM-код мог быть поврежден вредоносным кодом ядра, поскольку программа BIOS не могла скрывать оперативную память управления системой SMRAM (system management RAM), где выполняется SMM-код, от обычного/системного программного обеспечения. В регистре управления SMRAM (SMRAMC) бит D_OPEN определяет видимость SMRAM, а бит D_LOCK блокирует весь регистр SMRAMC и D_OPEN до следующей перезагрузки. На некоторых материнских платах бит D_LOCK не устанавливался.

Хотя все это было исправлено в материнских платах, выпускавшихся в дальнейшем, слабости в прошивке SMM на этом не закончились. С 2008 года эксплойты SMM выявляются регулярно. Более поздние компрометации были обусловлены неспособностью защитить SMM от различных, казалось бы, не связанных между собой механизмов. Например, дефект восстановления памяти, используемый для компрометации Intel ME, был задействован и для атак на SMM. Это позволило вредоносной программе в ОС получить доступ к SMRAM, используя технологию восстановления, и переназначить область SMRAM в доступную область памяти.

Примерно через год была обнаружена еще одна компрометация SMM с помощью атаки заражения кэша. Обычно системное программное обеспечение может настраивать регистры диапазона типов памяти MTRR (memory-type range registers) для управления тем, какая область памяти кэшируется, а какая нет. Однако для SMRAM никаких различий делать не стали. Таким образом, у атакующего есть возможность модифицировать «разлитый» (скопированный в кэш) SMM-код без непосредственного доступа к SMRAM. В следующий раз модифицированный код выполняется в SMM и производит нужные манипуляции над актуальной копией в SMRAM. Для разрешения этого вопроса был создан новый регистр диапазона управления системой регистров. Он был доступен только из SMM и мог настраивать свойства кэширования SMRAM.

К сожалению, война в SMM на этом не закончилась. В 2009 году исследователи обнаружили, что неправильно написанный SMM-код может вызывать функции, находящиеся вне SMRAM, что приводит к потенциальной возможности выполнения произвольного кода в SMM. Чтобы предотвратить это, в регистр MSR_SMM_FEATURE_CONTROL был добавлен новый элемент управления — бит SMM_Code_Chk_En, благодаря чему возможность запуска в SMM кода, отличного от SMRAM, можно было настроить в первоначальном коде SMM. Мирный период продлился до 2015 года, когда была обнаружена еще одна уязвимость SMM, на этот раз связанная с тем, что SMM нужно было принимать внешние аргументы. Если переданный указатель используется без проверки, то SMM-код может быть обманным путем записан в свою собственную SMRAM (обозначенную указателем), что облегчает проведение атак.

Все это в совокупности заставило Intel предложить в том же году высокоуровневое решение — монитор переноса SMM (SMM transfer monitor, STM). Вместо удаления всех уязвимостей в SMM, STM стремится уменьшить возможности повышения привилегий через SMM, снижая привилегии SMM-кода путем его контроля с помощью монитора. Считается, что после проведения необходимых проверок монитором STM SMM-код очищен и ведет себя как ожидается. Однако полезность STM оставляла желать лучшего в силу того, что в этот процесс было вовлечено множество различных сторон: те, кто писал код универсального мониторинга, проверяющий специфичный для разных моделей SMM-код (в условиях существования множества различных поставщиков и моделей); те, кто определял, как координировать действия разработчиков ОС, разработчиков BIOS и поставщиков оборудования, поскольку проверки STM можно осуществлять только после того, как все компоненты согласованы. Многочисленные обнаруженные уязвимости (осложнения, связанные с прошивками; технологии материнских плат, например безопасная загрузка через BIOS/UEFI; технология Intel Boot Guard, реализованная через Intel ME) не позволяют считать встроенное ПО надежным.

Процессор. При ближайшем рассмотрении выясняется, что процессор никогда не был чисто аппаратным решением. При выполнении сложных операций и реализации новых функций все чаще используется микрокод, который можно рассматривать как еще один уровень аппаратных инструкций. Исследователи изучили процесс обновления микрокода с помощью метода обратного проектирования. Выяснилось, что даже если разрешены только проверенные поставщиком обновления, то злоумышленник, управляющий этим процессом, все равно может выбрать обновление таким образом, чтобы облегчить себе проведение атаки. К счастью, ни один из последних процессоров при проведении атак такого рода скомпрометировать пока еще не удалось.

Анализ уязвимостей прошивки

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

Статика: механизмы обновления

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

Недокументированные/неизученные интерфейсы, такие как VSC у твердотельных накопителей. Они могут остаться от заводских испытаний или быть предназначены для упрощения обслуживания.

Постоянное хранилище, защищенное ненадлежащим образом. В качестве примера здесь можно привести интерфейс SPI (serial peripheral interface) чипа флеш-памяти на материнской плате, где хранятся различные типы прошивок (ME, BIOS/UEFI, SMM, некоторые области SGX и т. д.). К примеру, многие материнские платы доверяют только SMM с доступом на запись SPI, однако, как уже было показано, безопасность SMM далека от совершенства.

Дефектная проверка. В основном это вызвано ошибками в логике проверки. К этой категории относятся атаки на микрокод в старых процессорах.

Динамика: повреждение памяти

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

Динамика: разделяемое адресное пространство

Физической изоляции у прошивки может не быть. Имеется только логическая изоляция от обычного программного обеспечения, работающего в той же системе, что ведет к появлению дефектов и уязвимостей. В этом заключается отличие от неполного по Тьюрингу оборудования, которое не разделяет ресурсы с программным обеспечением или является физически изолированным.

Недостаточное разделение. Память прошивки часто видна обычному ПО (или может быть сконфигурирована таким образом, чтобы она была видна) для удобства, повышения производительности или в силу каких-то иных причин. Например, общая кэш-память, ввод-вывод с отображением памяти и восстановление памяти могут привести к получению несанкционированного доступа. Прошлые эксплойты как SMM, так и ME были связаны как раз с недостаточным разделением. Процессору ME требовалось «украсть» область основной памяти из-за ограниченного объема собственной статической памяти.

Прямой доступ к памяти (direct memory access, DMA). Это относится к прошивкам всех устройств с высокой пропускной способностью. Чтобы избежать превращения центрального процессора в узкое место с точки зрения производительности, контроллер памяти процессора позволяет устройствам и системному программному обеспечению настраивать диапазоны памяти, которые будут доступны как процессору устройства, так и центральному процессору. После этого процессор устройства может перемещать данные автономно. Предоставляемый контроллерами прямой доступ к памяти порождает брешь в уже разделенных пространствах — открывает память для USB-устройств, хранилищ SATA и сетевых устройств.

Закрытая природа прошивки

Встраивание программ в оборудование уже само по себе вызывает опасения, но ситуацию еще сильнее усугубляет то, что архитектура и реализация большинства прошивок остаются проприетарными и по большей части недокументированными. Сообщество специалистов по безопасности полагается главным образом на обратное проектирование, с тем чтобы хотя бы частично раскрыть детали. Такая непрозрачность скрывает от общественности потенциальные проблемы, в то время как реальные атаки не обязательно проводятся с использованием широко доступной информации. Давно доказано, что укреплению безопасности неизвестность отнюдь не способствует. Скорее, наоборот, может привести к тому, что серьезные уязвимости останутся незамеченными, поскольку исследователям вопросов безопасности придется потратить дополнительные усилия для получения базовой информации, прежде чем они смогут обнаружить и раскрыть слабые места.

Усвоенные уроки и направление дальнейшего движения

Все упомянутые атаки на прошивки показывают, что для компрометации системы физический доступ к ней не нужен: желаемое свойство оборудования, в соответствии с которым для модификации непременно требуется физический доступ, больше не работает. Это полностью противоречит общепринятому представлению о неизменности аппаратных средств. Кроме того, безопасность программного обеспечения зависит от базового оборудования. Поскольку модель угроз компьютерной системы предполагает, что оборудование должно быть надежным, скомпрометированное аппаратное обеспечение подрывает все гарантии безопасности. Таким образом, встраивание программ в оборудование приводит к сбоям как оборудования, так и ПО. Рассмотрим некоторые подходы к укреплению безопасности оборудования со встроенным программным обеспечением.

Можно ли ослабить атаки, отказавшись от встраивания программ?

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

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

Наконец, следует отметить, что в аппаратном обеспечении без обновляемой прошивки могут присутствовать ошибки. Один из вариантов уязвимости Spectre не может быть ликвидирован путем обновления прошивки (микрокода), поскольку он встроен непосредственно в аппаратную логику. Таким образом, возможность исправления оборудования при обнаружении уязвимости является преимуществом встроенного программного обеспечения с точки зрения безопасности. В отличие от полностью неизменного оборудования, двери перед злоумышленниками здесь в любой момент могут захлопнуться. Похоже, что преимущества встроенного ПО перевешивают угрозы системе безопасности, а следовательно, для оборудования со встроенными программами нужно искать методы обеспечения такого же уровня безопасности, как и для чисто аппаратных реализаций.

Следует ли относиться к прошивке, как к обычному ПО?

Поскольку встраивание программ в оборудование неизбежно, важно признать, что огромный объем кода, выполняющего аппаратные функции, заслуживает такого же (или даже более пристального) внимания, как и обычное программное обеспечение. Тем не менее эти высоконадежные низкоуровневые программные компоненты зачастую непрозрачны в своей функциональности. Их проприетарная природа препятствует открытому аудиту и проверке безопасности. Низкоуровневые привилегии побуждают реализовывать сложную и не имеющую отношения к первоначальному проекту функциональность. Опыт показывает, что концепция аппаратных подходов к обеспечению безопасности так или иначе опирается на встроенные в оборудование программы. Поэтому поставщикам оборудования и исследовательскому сообществу необходимо менять менталитет: к прошивке следует относиться так же, как и к обычному программному обеспечению.

Проектирование безопасности прошивки. Принципы проектирования систем безопасности, широко применяемые в программном обеспечении, можно применить и к прошивке.

Открытость. Общественный контроль помогает свести к минимуму возникновение вопросов, вызванных непрозрачностью. Некоторые открытые фреймворки (например, coreboot и OpenWrt) выступают в роли ориентиров для проектирования безопасных прошивок.

Наименьшие привилегии. При появлении уязвимостей, причиняющих вред, уменьшение ущерба, который они могут нанести, так же важно, как и их предотвращение. Привилегии прошивки могут управляться на еще более низком уровне для детализированного контроля доступа. Чтобы решить вопрос недостаточного разделения, можно выбрать подход с наименьшими привилегиями для дальнейшего рассмотрения улучшенной модели прошивки, которая еще более абстрагируется от программного обеспечения и не разделяет функции с контролем доступа.

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

Исследовательская деятельность. К счастью, многие из обсуждаемых здесь вопросов уже привлекли внимание исследовательского сообщества и привели к прогрессу в изучении безопасности прошивки. Предлагается, например, решение IOCheck, позволяющее проверять целостность встроенного ПО различных периферийных устройств путем непосредственного считывания периферийной памяти. Одна из основных проблем здесь заключается в том, что IOCheck при выполнении проверок полагается на SMM. Если эта технология не отличается более высокой безопасностью по сравнению с другими прошивками, то на инструменты, зависящие от SMM, нельзя полагаться. Кроме того, неоднородность периферийных устройств может затруднить извлечение прошивки, не говоря уже о поддержании правильности всех контрольных сумм и сигнатур. По крайней мере, IOCheck проливает некоторый свет на обеспечение общей целостности прошивки и не является специфичным решением для какого-то конкретного типа устройств.

Для решения проблем BadUSB можно использовать решение USB-CheckIn, в котором неправильное поведение обнаруживается в процессе физического взаимодействия человека с устройствами пользовательского интерфейса (клавиатурой и мышью). Это открывает новое направление контроля целостности прошивки. Прежде чем доверять устройству, необходимо проверить его поведение с учетом заранее определенного набора спецификаций.

***

Функционал все большей части современного оборудования реализуется на программном уровне. В свете этого фраза «программное обеспечение пожирает мир» становится применима не только к стартапам. Однако эта тенденция оказывает отрицательное влияние на безопасность будущих компьютерных систем. И следует задать себе вопрос: действительно ли безопасность, реализованная на аппаратном уровне, в дальнейшем будет лучше программной безопасности?

Литература

1. R. de Clercq and I. Verbauwhede. A survey of hardwarebased control flow integrity (CFI). 2017. URL: https://arxiv.org/ftp/arxiv/papers/1706/1706.07257.pdf (дата обращения: 13.11.2020).

2. J. H. Saltzer and M. D. Schroeder. The protection of information in computer systems // Proc. IEEE. — 1975. — Vol. 63, N. 9. — P. 1278–1308. doi: 10.1109/PROC.1975.9939.

3. A. Opler. Fourth-generation software // Datamation. — 1967 (Jan). — Vol. 13, N. 1. — P. 22–24.

Лянин Чжао (lianying.zhao@carleton.ca)  —  доцент, Школа компьютерных наук, Университет Карлтона в Оттаве; Дэвид Ли (lie@eecg.toronto.edu)  —  профессор, кафедра электротехники и компьютерного проектирования, Университет Торонто.

Lianying Zhao, David Lie, Is Hardware More Secure Than Software? IEEE Security and Privacy, September/October 2020, IEEE Computer Society. All rights reserved. Reprinted with permission.