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


Цель

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-0	smbus     	SMBus PIIX4 adapter port 0 at 0b00	SMBus adapter
i2c-1	smbus     	SMBus PIIX4 adapter port 2 at 0b00	SMBus adapter
i2c-2	smbus     	SMBus PIIX4 adapter port 1 at 0b20	SMBus adapter
i2c-3	i2c       	AMDGPU DM i2c hw bus 0          	I2C adapter
i2c-4	i2c       	AMDGPU DM i2c hw bus 1          	I2C adapter
i2c-5	i2c       	AMDGPU DM i2c hw bus 2          	I2C adapter
i2c-6	i2c       	AMDGPU DM i2c hw bus 3          	I2C adapter
i2c-7	i2c       	AMDGPU DM aux hw bus 0          	I2C adapter
i2c-8	i2c       	AMDGPU DM aux hw bus 2          	I2C adapter
i2c-9	i2c       	AMDGPU DM aux hw bus 3          	I2C adapter
i2c-10	i2c       	DPMST                           	I2C adapter
i2c-11	i2c       	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

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

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

Комментарии (15)


  1. edo1h
    26.06.2022 00:43
    +14

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

    где можно почитать о успешных атаках через hdmi?


    1. PinkyAcorn
      26.06.2022 08:46

      1. BugM
        26.06.2022 23:34

        Вы же читали то что по ссылке? Это довольно далеко от статьи. На взлом сети/устройства с помощью hdmi и специально подготовленного ноута вообще не похоже.

        При этом это настолько типовой сценарий использования проекторов или мониторов, что ссылаться на не интересность или неприменимость в реальной жизни не выйдет.


  1. VBKesha
    26.06.2022 01:43
    +2

    Брандмауэр

    Да мы отрезали пин CEC и повесили свою I2C с EDID. И вот у нас брандмауэр.
    и сломайте выступ плоскогубцами

    Какой ещё выступ?
    Это заблокирует все интерфейсы, кроме аудио/видео (например, DDC, HPD, CEC, HEAC, MHL)

    Я очень хочу посмотреть на атаку через HDP это достаточно нетривиальный интерфейс, и поэтому интересно как через него можно атаковать. Тем более он присутствует не только на HDMI но на например на DisplayPort хотелось бы больше подробностей.


    1. GennPen
      26.06.2022 02:29

      и повесили свою I2C с EDID

      Записанные параметры на которой могут и не подойти к другому подключаемому устройству.

      Какой ещё выступ?

      Тоже сначала не понял. Это они так на плате "оригинально" сделали перемычку "write protect", когда как большинство подобные вещи делают закорачиванием припоем двух стоящих рядом контактных площадок.
      Надеюсь, они учли волновое сопротивление дифпар на таком переходнике, потому как там скорости довольно высокие и это может довольно существенный эффект вносить.


      1. VBKesha
        26.06.2022 02:38

        Это они так на плате «оригинально» сделали перемычку «write protect»,

        Ой ой ой, хорошо, что я по всем ссылкам не пошёл. Какой ужас.


      1. Squoworode
        26.06.2022 23:23

        большинство подобные вещи делают закорачиванием припоем двух стоящих рядом контактных площадок

        Там, кстати, с обратной контактные площадки есть, чтобы восстановить беззащитность от записи. Зато не нужен паяльник, чтобы установить защиту в первый раз...


        1. GennPen
          27.06.2022 00:04

          Паяльник нужен как минимум чтобы это все собрать.


  1. KivApple
    26.06.2022 01:54
    +9

    Ожидал описания уязвимостей HDMI, а нашёл только абстрактное "там есть какие-то интерефейсы, мне кажется, через них что-то можно поломать". Нужна хоть минимальная, но конкретика. Пусть без proof of concept эксплойта, но хотя бы примеры уязвимых устройств или CVE.

    Не понятно почему брандмауэр не может самостоятельно брать EDID из устройства при включении. Задача же ограничить I2C интерфейс HDMI только получением EDID, это можно легко автоматизировать.

    Или вы боитесь, что брандмауэр поломают? Код отдачи EDID очень примитивный, его можно формально верифицировать при желании. Там же нет сложных алгоритмов.


  1. BugM
    26.06.2022 04:02
    +1

    А есть ссылочка на CVE? Без неё это все какие-то абстрактные рассуждения.


  1. v1000
    26.06.2022 05:00
    +5

    Если бы строители строили здания так же, как программисты пишут
    программы, первый залетевший дятел разрушил бы цивилизацию.

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


    1. saipr
      26.06.2022 11:42
      -2

      Интересно, а как бы дятел залетел в здание? Программисты (хорошие) пишут программы без окон и дверей!!!


      1. Aleksandr-JS-Developer
        27.06.2022 09:30

        без окон и дверей!!!

        Это невозможно. Тем более на этапе написания


        1. saipr
          28.06.2022 12:47

          На этапе написания — пишут, а на этапе строительство — стоят.


  1. Yursan
    27.06.2022 10:16
    -1

    ЦБИ уже давно продает устройство однонаправленной передачи "Видеодиод", сейчас как я понимаю продается его более новая редакция (более новый сертификат) "Медиадиод" (http://www.cbi-info.ru/groups/page-1316.htm). Цель была заявлена немножко другая, но теперь это выглядит еще актуальнее.