Блокирование драйвера SBP-2 и контроллеров Thunderbolt с целью предотвратить прямой доступ к памяти через порты 1394 и Thunderbolt в компьютере с функцией шифрования BitLocker
Поддержка системы Windows Vista с пакетом обновления 1 (SP1) прекратится 12 июля 2011 г. Чтобы по-прежнему получать обновления для системы безопасности Windows, установите пакет обновления 2 (SP2) для Windows Vista. Дополнительные сведения см. на указанном ниже веб-сайте корпорации Майкрософт. Заканчивается поддержка некоторых версий Windows.
Проблема
Компьютер, защищенный технологией шифрования BitLocker, может быть уязвим перед угрозами прямого доступа к памяти (DMA), когда он включен или находится в ждущем режиме. Сюда входят и случаи, когда рабочий стол заблокирован.
Функция шифрования BitLocker с проверкой подлинности только через доверенный платформенный модуль позволяет компьютеру перейти в режим включения питания без проверки подлинности перед загрузкой. По этой причине злоумышленник может получить прямой доступ к памяти.
В такой ситуации он может выполнить поиск ключей шифрования BitLocker в системной памяти, подделав код оборудования SBP-2 с помощью специального устройства, подключенного к порту 1394. Кроме того, действующий порт Thunderbolt также предоставляет доступ к системной памяти с целью атаки.
Проблемы, описанные в этой статье, могут возникнуть:
во включенных системах;
в системах, которые находятся в ждущем режиме;
в системах, защищенных технологией шифрования BitLocker с проверкой подлинности только через доверенный платформенный модуль.
Причина
Физический прямой доступ к памяти через порт 1394
Контроллеры 1394, соответствующие отраслевому стандарту (OHCI-совместимые), позволяют получить доступ к системной памяти. Такая возможность представлена как улучшение в области производительности, поскольку позволяет передавать большой объем данных непосредственно с устройства, подключенного к порту 1394, в системную память, обходя центральный процессор и программное обеспечение. По умолчанию физический прямой доступ к памяти через порт 1394 отключен во всех версиях Windows. Существуют следующие варианты его включения:
администратор включает отладку на уровне ядра через порт 1394;
пользователь, обладающий физическим доступом к компьютеру, подключает запоминающее устройство, которое соответствует спецификации SBP-2, к порту 1394.
Угрозы прямого доступа к памяти через порт 1394 в компьютере с функцией шифрования BitLocker
Проверки целостности системы BitLocker защищают от несанкционированных изменений состояния отладки на уровне ядра. Тем не менее злоумышленник может подключить специальное устройство к порту 1394 и подделать код оборудования SBP-2. Когда система Windows обнаруживает этот код, она загружает драйвер SBP-2 (sbp2port.sys) и отправляет ему команду разрешить устройству SBP-2 прямой доступ к памяти. Это позволяет злоумышленнику получить доступ к системной памяти и выполнить поиск ключей шифрования BitLocker.
Физический прямой доступ к памяти через порт Thunderbolt
Thunderbolt — это новая внешняя шина с функциональностью, которая позволяет получить прямой доступ к системной памяти. Такая функциональность предоставляется как улучшение в области производительности, поскольку позволяет передавать большой объем данных непосредственно с устройства Thunderbolt в системную память, обходя центральный процессор и программное обеспечение. Thunderbolt не поддерживается ни в одной версии Windows, но производители могут принять решение о включении этого типа порта.
Угрозы прямого доступа к памяти через порт Thunderbolt в компьютере с функцией шифрования BitLocker
Злоумышленник может подключить специальное устройство в порт Thunderbolt и получить прямой доступ к памяти через шину PCI Express. Это может позволить злоумышленнику получить доступ к системной памяти и выполнить поиск ключей шифрования BitLocker.
Решение
Некоторые конфигурации BitLocker могут снизить риск атак такого типа. Если в компьютере не используется режим сна (приостановки ОЗУ), снизить риск могут следующие способы защиты: использование доверенного платформенного модуля и ПИН-кода; использование доверенного платформенного модуля и USB-ключа; использование доверенного платформенного модуля, ПИН-кода и USB-ключа. Кроме того, если в вашей организации разрешено использовать только доверенный платформенный модуль, или принято поддерживать компьютеры в режиме сна, то с целью снижения риска атак прямого доступа к памяти рекомендуется заблокировать в Windows драйвер SBP-2 и все контроллеры Thunderbolt.
Дополнительные сведения о том, как это делается, см. на следующем веб-сайте Майкрософт:
Снижение рисков, связанных с SBP-2
На упомянутом выше веб-сайте см. подраздел «Предотвращение установки драйверов, соответствующих этим классам установки устройств» в разделе «Параметры групповой политики для установки устройств».
Далее приводится GUID класса установки устройства Plug and Play для драйвера SBP-2.
Снижение рисков, связанных с Thunderbolt
Важно! Следующий способ снижения рисков, связанных с Thunderbolt, относится только к Windows 8 и Windows Server 2012. Его нельзя применять к другим операционным системам, упомянутым в разделе «Информация в данной статье применима к».
На упомянутом выше веб-сайте см. подраздел Предотвращение установки устройств, соответствующих этим идентификаторам» в разделе «Параметры групповой политики для установки устройств».
Далее приводится идентификатор контроллера Thunderbolt, совместимый с устройством Plug and Play.
Дополнительная информация
Дополнительные сведения об угрозах прямого доступа к памяти в компьютере с функцией шифрования BitLocker см. в следующем блоге, посвященном обеспечению безопасности в Майкрософт:
Претензии к надежности технологии BitLocker в Windows Дополнительные сведения о снижении риска атак «холодной» начальной загрузки на компьютеры с функцией шифрования BitLocker см. в следующем блоге группы обеспечения целостности данных Майкрософт:
DMA для новичков или то, что вам нужно знать
Всем привет, сегодня мы с вами поговорим о DMA: именно о той технологии, которая помогает вашему компьютеру воспроизводить для вас музыку, выводить изображение на экран, записывать информацию на жесткий диск, и при этом оказывать на центральный процессор просто мизерную нагрузку.
DMA, что это? О чем вы говорите?
DMA, или Direct Memory Access – технология прямого доступа к памяти, минуя центральный процессор. В эпоху 486-ых и первых Pentium во всю царствовала шина ISA, а также метод обмена данными между устройствами – PIO (Programmed Input/Output).
- На сетевую карту пришло 1500 байт данных.
- Сетевая карта инициирует прерывание с целью сообщить процессору, что данные необходимо забрать с устройства, иначе произойдет так называемый buffer overrun.
- Операционная система ловит прерывание от контроллера прерываний и отдает его на обработку драйверу.
- Драйвер в цикле побайтно читает данные с регистров сетевой карты.
Когда объемы данных, которыми оперирует процессор начали возрастать, стало понятно, что нужно минимизировать участие процессора в цепочке обмена данными, а то прийдется туго. И вот тогда активное применение нашла технология прямого доступа к памяти.
Кстати говоря, DMA используется не только для обмена данными между устройством и ОЗУ, но также между устройствами в системе, возможен DMA трансфер между двумя участками ОЗУ (хотя данный маневр не применим к x86 архитектуре). Также в своем процессоре Cell, IBM использует DMA как основной механизм обмена данными между синергетическими процессорными элементами (SPE) и центральным процессорным элементом (PPE). Также каждый SPE и PPE может обмениватся данными через DMA с оперативной памятью. Данный прием – на самом деле большое преимущество Cell, ибо избавляет от проблем когерентности кешей при мультипроцессорной обработке данных.
И снова теория
Прежде чем мы перейдем к практике, я бы хотел осветить несколько важных аспектов программирования PCI, PCI-E устройств.
Я вскользь упомянул о регистрах устройства, но как же к ним имеет доступ центральный процессор? Как многие из вас знают, есть такая сущность в компьютерных технологиях, как IO порты (Input/Output ports). Они предназначены для обмена информацией между центральным процессором и периферийными устройствами, а доступ к ним возможен с помощью специальных ассемблерных инструкций — in/out. BIOS (или OpenFirmware на PPC based системах) на ранних этапах инициализации PCI устройств, а также некоторых других (Super IO контроллера, контроллера PS/2 устройств, ACPI timer и т.д.), закрепляет за определенным контроллером собственный диапазон IO портов, куда и отображаются регистры устройства.
- Скорость доступа к физической памяти выше, нежели к IO портам.
- IO порты могут отображать не более 65535 байт регистров, в то время как размер ОЗУ современных компьютеров в разы больше.
- Читать регистры устройства из ОЗУ проще, нежели с помощью IO портов 🙂
Итак, существует два метода утилизации DMA: contiguous DMA и scatter/gather DMA.
Contiguous DMA
- Выделяется один буфер достаточно большого размера в оперативной памяти.
- Физический адрес (точнее сказать адрес на шине участка памяти, потому как physical address и bus address – равны в x86 архитектуре, но не равны в PPC) этого буфера записывается в регистр устройства.
- Во время того, как приходят данные на устройство, контроллер устройства инициирует DMA трансфер.
- После того, как буфер полностью заполнен, контроллер устройства инициирует прерывание, чтобы сообщить центральному процессору, что буфер следует передать операционной системе.
- Драйвер операционной системы обрабатывает прерывание, и передает полученные данные из буфера, далее по стеку устройств операционной системы.
Scatter/gather DMA
С ростом скорости Ethernet адаптеров, contiguous DMA показал свою несостоятельность. В основном из-за того, что требовались области памяти достаточно большого размера, которые подчас невозможно было выделить, так как в современных системах фрагментация физической памяти достаточно высока. Во всем виноват механизм виртуальной памяти, без которого нынче никуда 🙂
Решение напрашивается само собой: использовать вместо одного большого участка памяти несколько, но в разных регионах этой самой памяти. Возникает вопрос, но как же сообщить контроллеру устройства, как инициировать DMA трансфер и по какому адресу писать данные? И тут нашли решение, использовать дескрипторы, чтобы описывать каждый вот такой участок в оперативной памяти.
- Адрес участка ОЗУ (именно bus address), который предназначен для DMA трансфера.
- Размер описываемого участка ОЗУ.
- Опциональные флаги и другие специфические аргументы.
- Адрес следующего дескриптора в памяти.
- Драйвер операционной системы выделяет и иницилизирует дескрипторы DMA буферов.
- Драйвер выделяет DMA буферы (участки ОЗУ для DMA трансфера) и записывает необходимую информацию о них в дескрипторы.
- Устройство по мере возникновения потребности, заполняет DMA буферы, и после того, как заполнен один или несколько буферов инициирует прерывание.
- Драйвер ОС просматривает все дескрипторы DMA буферов, определяет какие из них были заполнены контроллером устройства, пересылает данные из буфера далее по стеку устройств и помечает буфер как готовый к DMA трансферу.
На сегодня пожалуй все, иначе информации станет слишком много. В следующей статье я покажу вам, как с этой уличной магией работает IOKit. Жду отзывов и дополнений 😉
Управление прямым доступом к памяти
При работе в режиме прямого доступа к памяти Контроллер ПДП (прямого доступа к памяти, DMA) выполняет следующие функции:
– принимает запрос на ПДП от внешнего устройства;
– формирует запрос микропроцессору на захват шин системной магистрали;
– принимает сигнал, подтверждающий вход микропроцессора в состояние захвата (перехода в состояние захвата, при котором процессор отключается от системной магистрали);
– формирует сигнал, сообщающий внешнему устройству о начале выполнения циклов ПДП;
– выдает на шину адреса системной магистрали адрес ячейки ОП, предназначенной для обмена;
– вырабатывает сигналы, обеспечивающие управление обменом данными;
– по окончании ПДП контроллер либо организует повторение цикла ПДП, либо прекращает режим ПДП, снимая запросы на него.
Циклы ПДП выполняются с последовательно расположенными ячейками памяти, поэтому контроллер ПДП имеет счетчик числа переданных байтов.

Рисунок – Взаимодействие устройств в режиме ПДП
Каждый Канал КПДП состоит из четырех 16-разрядных регистров: регистр текущего адреса (CAR), регистр циклов ПДП (CWR), регистр хранения базового адреса (BAR), регистр хранения базового числа Циклов ПДП (WCR) и 6-разрядный регистр режима (MR).
Регистр текущего адреса хранит текущий адрес ячейки памяти при выполнении цикла ПДП. После выполнения каждого цикла ПДП содержимое этого регистра увеличивается или уменьшается на единицу. Оно может быть прочитано или загружено с помощью двух команд IN или соответственно QUT, работающих каждая только с одним байтом. В режиме автоинициализации содержимое регистра текущего адреса при обновлении принимает базовый адрес из регистра хранения базового адреса.

Рисунок – Структурная схема контроллера ПДП
Регистр циклов ПДП хранит число слов, предназначенных для передачи. При выполнении циклов регистр работает в режиме вычитающего счетчика. При переходе из нулевого состояния в FFFFH вырабатывается управляющий сигнал для блока управления контроллером. Регистр может быть прочитан двумя командами IN. В него можно осуществить запись двумя командами OUT из микропроцессора или в режиме инициализации — из регистра хранения базового числа циклов ПДП.
Регистры BAR и WCR предназначены для хранения констант – базового адреса и базового числа циклов. Они загружаются в режиме программирования КПДП одновременно с регистрами CAR и CWR. В процессе выполнения циклов ПДП их содержимое не изменяется. Прочитать состояние этих регистров невозможно.
Регистр режима определяет режим работы канала. Он содержит информацию о номере канала, типе цикла ПДП, необходимости автоинициализации, режиме изменения регистра текущего адреса (CAR) – увеличение или уменьшение и режиме работы канала – передача по запросу, одиночная передача, блочная передача, каскадирование (работа в составе каскада КПДП).
Регистр команд блока управления режимом определяет основные параметры работы канала. Загружается при программировании КПДП микропроцессором.
Регистр условий хранит разрешение на ПДП каждому каналу (устанавливаемые программно) и запоминает факт перехода через 0 в регистре хранения базового числа циклов каждого канала.
Контроллер ПДП может работать в двух основных режимах: в режиме программирования и режиме выполнения циклов ПДП.
В Режиме программирования микропроцессор работает с КПДП, как с внешним устройством. После загрузки в КПДП управляющих слов контроллер переходит в пассивное состояние. В этом состоянии КПДП будет находиться до тех пор, пока не поступит запрос на ПДП от ВУ или от микропроцессора. Обнаружив запрос на ПДП, контроллер выставляет микропроцессору запрос на захват системной магистрали и ожидает от него подтверждения захвата (т. е. отключения МП от СМ, перехода его выходов в состояние высокого сопротивления, состояния захвата). При получении сигнала подтверждения захвата контроллер начинает Выполнять циклы ПДП.
Системная магистраль (СМ) в режиме прямого доступа к памяти используется мультиплексно КПДП и микропроцессором, причем основное управление системной магистралью выполняет КПДП, а МП получает к ней доступ на очень короткие промежутки времени для обмена информацией с основной памятью.
Несмотря на большую самостоятельность ПДП, ведущее положение в МП-системе остается все-таки за микропроцессором, который, запустив обмен информацией в режиме ПДП, продолжает выполнять свою работу.