Защитите свой HDMI… плоскогубцами и изолентой

от автора

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


Цель

HDMI используется для передачи аудио и видео, но предлагает ряд дополнительных функций (HPD, CEC, HEAC, MHL). Это увеличивает поверхность атаки, и, поскольку безопасность реализации этих функций во встроенных устройствах далека от идеала, злоумышленник может внедрить вредоносный код — и ваше ничего не подозревающее видеооборудование будет угрожать безопасности сети. Монитор сможет взломать любое подключённое к нему устройство.

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

Брандмауэр блокирует все дополнительные интерфейсы и разрешает передачу только аудио- и видеоданных. Он основан на исследовании Пьера-Мишеля Рикорделя и Хосе Лопеса Эстевеса из ANSSI/SDE/ST/LSF, представленном на конференции по ИТ-безопасности SSTIC 2021. Некоторые исследования безопасности и уязвимости CEC и EDID вы увидите на слайде 4.

Применение

Брандмауэр поставляется с общим профилем HD, но может не соответствовать возможностям монитора. Результирующее изображение может искажаться или отсутствовать полностью. Поэтому сначала нужно скопировать информацию расширенных идентификационных данных дисплея (EDID). Эти данные содержат поддерживаемые разрешения. Прочитать их вы можете с помощью интерфейс Display Data Channel (DDC) на основе I²C. Скопируйте эти данные EDID в EEPROM брандмауэра HDMI и сломайте выступ плоскогубцами, чтобы включить защиту от записи, что не позволит внедрить вредоносную полезную нагрузку. Сделать это нужно один раз для каждого монитора. Скопировать EDID можно с помощью программатора брандмауэра HDMI или по инструкции в разделе установка.

Подключите брандмауэр к защищаемому монитору, затем подключите кабель, который идёт к ненадёжному устройству на брандмауэре HDMI — это защитит оборудование.

Чтобы перезаписать EEPROM брандмауэра на случай, если вы хотите защитить другой монитор, можно повторно отключить защиту от записи, поместив каплю припоя на две площадки с пометкой WP.

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

Ограничения

Защита широкополосного цифрового содержимого (HDCP) не поддерживается, поскольку интерфейс DDC ограничен информацией EDID.

Доступность

Несколько брандмауэров HDMI доступны на tindie.

Схема в формате pdf и gerber-платы доступны в релизе.

В следующей версии должен быть интегрирован программатор брандмауэра и, возможно, исправления, о которых сообщили другие пользователи. Я тестировал только свой простой случай на 6 мониторах.

Режим работы

Для защиты монитора брандмауэр HDMI перенаправляет только сигнальные линии передачи аудио/видео (A/V) данных (D0, D1, D2, CK). Все остальные сигнальные линии не подключены (CEC, SDA, SCL, utility/HEAC+, HPD). Это заблокирует все интерфейсы, кроме аудио/видео (например, DDC, HPD, CEC, HEAC, MHL). Линии SDA/SCL для интерфейса DDC для предоставления информации EDID устройству подключены к EEPROM на брандмауэре. Сюда нужно скопировать информацию о мониторе. Это ограничивает интерфейс DDC информацией EDID.

Установка

Для корректного применения брандмауэра HDMI требуется копия данных EDID.

Эти инструкции предназначены для Linux. Для Windows см. инструкции, представленные на слайдах исследования, (не проверены).

Установите инструменты чтения/записи устройств I²C:

  • для дистрибутивов на базе Debian

sudo apt install i2c-tools

Откройте пользователю доступ к I²C (в /dev/i2c-*):

sudo modprobe i2c-dev

Теперь нужно выяснить, какая шина I²C соответствует порту HDMI. Перечислите доступные шины:

sudo i2cdetect -l

Вы увидите нечто вроде этого:

i2c-0smbus     SMBus PIIX4 adapter port 0 at 0b00SMBus adapter i2c-1smbus     SMBus PIIX4 adapter port 2 at 0b00SMBus adapter i2c-2smbus     SMBus PIIX4 adapter port 1 at 0b20SMBus adapter i2c-3i2c       AMDGPU DM i2c hw bus 0          I2C adapter i2c-4i2c       AMDGPU DM i2c hw bus 1          I2C adapter i2c-5i2c       AMDGPU DM i2c hw bus 2          I2C adapter i2c-6i2c       AMDGPU DM i2c hw bus 3          I2C adapter i2c-7i2c       AMDGPU DM aux hw bus 0          I2C adapter i2c-8i2c       AMDGPU DM aux hw bus 2          I2C adapter i2c-9i2c       AMDGPU DM aux hw bus 3          I2C adapter i2c-10i2c       DPMST                           I2C adapter i2c-11i2c       DPMST                           I2C adapter

Шины-кандидаты от 3 до 9, используемые GPU (номер после i2c — в первом столбце).

Отключите всё от порта HDMI и выполните поиск устройств на каждой шине I²C (замените BUS номером шины):

sudo i2cdetect -y BUS

Ничего не подключено, поэтому не должно быть обнаружено никакое устройство, а вывод должен выглядеть так:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00:                         -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

Подключите брандмауэр на стороне устройства к порту HDMI и повторите поиск устройств. Если вы видите следующий результат, то вы нашли шину I²C порта HDMI. В противном случае продолжайте до следующей шины.

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00:                         -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

Подключите монитор, с которого вы хотите скопировать EDID, напрямую к порту HDMI.

Для дампа EDID воспользуйтесь модулем EEPROM:

sudo modprobe eeprom

Отобразите обзор EDID и убедитесь, что название модели соответствует вашему монитору (здесь DELL 2408WFP на шине номер 4):

ddcmon 4  Checksum:               OK EDID Version:           1.3 Manufacturer ID:        DEL Model Number:           0xA02C Model Name:             DELL 2408WFP Serial Number:          G286H9642GLS Manufacture Time:       2009-W23 Display Input:          Digital Monitor Size (cm):      52x32 Gamma Factor:           2.20 DPMS Modes:             Active Off, Suspend, Standby Color Mode:             RGB Multicolor Vertical Sync (Hz):     56-76 Horizontal Sync (kHz):  30-83 Max Pixel Clock (MHz):  170 Timing:                 640x480 @ 60 Hz Timing:                 640x480 @ 75 Hz Timing:                 720x400 @ 70 Hz Timing:                 800x600 @ 60 Hz Timing:                 800x600 @ 72 Hz Timing:                 800x600 @ 75 Hz Timing:                 1024x768 @ 87 Hz (interlaced) Timing:                 1024x768 @ 75 Hz Timing:                 1152x864 @ 75 Hz Timing:                 1280x1024 @ 60 Hz Timing:                 1600x1200 @ 60 Hz Timing:                 1920x1200 @ 60 Hz

Полный дамп EDID (замените BUS соответствующим номером шины):

cat /sys/bus/i2c/devices/BUS-0050/eeprom > edid.bin

Подключите порт устройства брандмауэра HDMI к выходу HDMI. Убедитесь, что защита от записи отключена (пластина сломана, на контактные площадки WP добавлен припой).

Запись данных на неправильную шину I²C может привести к необратимому повреждению компьютера или других устройств.

Освободите доступ I²C к EEPROM:

sudo modprobe -r eeprom

Запишите извлечённые данные EDID в брандмауэр HDMI (замените BUS на соответствующий номер шины):

for addr in `seq 0 255`; do echo $addr; sudo i2cset -y BUS 0x50 $addr 0x`xxd -p -l 1 -s $addr edid.bin`; done

Сравните исходные данные с данными в EEPROM:

# display original dumped data xxd -g 1 edid.bin # display data written on EEPROM sudo i2cdump -y BUS 0x50

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

Не стесняйтесь обклеивать брандмауэр термоусадочной трубкой или изолентой. Это предотвратит короткое замыкание при контакте с соседними металлическими предметами.

Устранение проблем

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

Если устройство не обнаруживает монитор или брандмауэр HDMI, или запись данных EDID в брандмауэр HDMI не удалась, попробуйте подключить брандмауэр другим, качественным кабелем HDMI.

Советы

xrandr

xrandr может выполнить дамп информации EDIO:

xrandr --properties

sysfs

sysfs также предоставляет необработанную информацию EDID (измените путь соответствующим образом):

edid-decode /sys/devices/pci0000:00/0000:00:08.1/0000:05:00.0/drm/card0/card0-HDMI-A-1/edid

I²C без root

Для доступа к шинам I²C без root:

# add UDEV rule cat << EOF | sudo tee /etc/udev/rules.d/20-i2c.rules KERNEL=="i2c-[0-9]*", GROUP="i2c" EOF # give user access to devices (you have to re-login in for the change to take effect) sudo groupadd i2c sudo gpasswd -a $USER i2c # reload rules sudo udevadm control --reload-rules sudo udevadm trigger

Стирание

Если вы хотите очистить память брандмауэра для использования с другим монитором:

for page in seq 50 57; do echo 0xpage; for addr in `seq 0 255`; do echo addr; sudo i2cset -y BUS 0xpage addr 0xff; done; done

edid-decode

Чтобы разобрать и отобразить полную информацию EDID, вы можете использовать edid-decode.

  • для дистрибутивов на базе Debian

sudo apt-get install edid-decode
  • для дистрибутивов на основе Arch

pikaur -S edid-decode-git

Чтобы просмотреть дамп EDID:

edid-decode edid.bin

edid-rw

EDID-RW немного упрощает чтение и запись EDID.

Установите эти средства:

  • для дистрибутивов на базе Debian

sudo apt-get install python3-smbus
  • для дистрибутивов на основе Arch

pikaur -S python-smbus-git

Получение EDID-RW:

git clone https://github.com/bulletmark/edid-rw cd edid-rw/

Чтобы получить данные EDID с подключённого монитора, выполните:

sudo ./edid-rw 4 > edid.bin

Чтобы записать дамп EDID в память брандмауэра HDMI:

sudo ./edid-rw -w 4 < edid.bin

Чтобы убедиться, что данные записаны правильно, прочтите их:

sudo ./edid-rw 4 | edid-decode

А мы поможем вам прокачать навыки или с самого начала освоить профессию, актуальную в любое время:

Выбрать другую востребованную профессию.


ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/673382/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *