![]() |
https://forum.antichat.xyz/attachmen...1702833882.png
Тема сегодняшнего разговора - DMA-атаки через Thunderbolt и USB4. А точнее, как при помощи куска железа, пары чипов и прямых рук вытащить дамп оперативной памяти из любой заблокированной системы, которая понадеялась на «безопасность по умолчанию». Мы пройдем путь от физики процесса до практического применения. Разберем, почему ваша IOMMU/VT-d - это не панацея, а скорее костыль, который производители забывают включить. Зачем ждать загрузки ОС, если можно дернуть память напрямую, пока система спит? Обсудим инструментарий: от классического PCILeech до кастомных прошивок для FPGA. И да, будет много кода, схем и, конечно, прямой речи. Введение в когнитивный диссонанс: Почему мы здесь собрались Потому что большинство из нас - и я первый - привыкли мыслить категориями операционной системы. Мы привыкли, что главный рубильник безопасности - это пароль на входе. Мы видим экран входа в Windows, macOS или Linux и думаем: "Ну все, я защищен. Без пароля никто не войдет". Мы выдыхаем, отходим попить кофе, оставляя ноутбук включенным, но заблокированным. Или, что еще лучше, просто закрываем крышку, отправляя его в сон, уверенные, что это равносильно выключению. Друзья, это самообман чистой воды. Ваш компьютер в заблокированном состоянии - это как дом, в котором хозяин закрыл входную дверь на щеколду, но при этом распахнул настежь все окна. Операционная система думает: "Я никому не дам ввести команды, пока не введут пароль". А память думает: "Я тут, вся такая свежая, полная ключей и секретов, жду, когда кто-нибудь придет и прочитает меня через черный ход". И этот черный ход - DMA (Direct Memory Access). Раскрывая карты: Что такое DMA на пальцах (и немного глубже) Чтобы понять всю глубину нашего падения, нужно понять магию DMA. И никакой магии тут нет, чистая физика и инженерия. Представь процессор (CPU) как очень занятого менеджера крупной фирмы. Ему нужно и отчеты писать, и задачи ставить, и совещания проводить. А тут еще всякие периферийные устройства - сетевая карта, звуковуха, SSD, USB-контроллер - постоянно дергают его: "Шеф, перетащи этот байтик отсюда туда", "Шеф, запиши этот мегабайт в память". Если бы процессор занимался каждым таким запросом, производительность упала бы ниже плинтуса. Поэтому инженеры придумали DMA. Это такой механизм, который позволяет умным устройствам самим таскать данные в память и из памяти, не отвлекая процессор. Процессор говорит: "Так, сетевая карта, вот тебе диапазон физических адресов, куда можно писать. Пиши сама, когда придут пакеты. Я занят". Сетевая карта кивает, и когда приходят данные, она сама, через DMA-контроллер на шине, записывает их прямиком в оперативку. Процессор даже не в курсе, пока ему не скажут: "Шеф, данные уже в памяти, иди работай". Это гениально. Это позволило компьютерам стать быстрыми. Но у этой гениальности есть обратная сторона медали. Если устройство может само писать в память, значит, оно может само и читать из памяти. И плевать, что там у вас загружена операционка и какой пароль вы ввели на экране. Для DMA-устройства не существует паролей, пользователей и файловых систем. Для него существуют только физические адреса и байты. И вот теперь представь, что этим "умным устройством" с DMA становится не сетевая карта внутри корпуса, а маленькая коробочка, которую ты воткнул в порт Thunderbolt на твоем спящем ноутбуке. Thunderbolt: Троянский конь, которого мы приручили Thunderbolt - это технология, которую разработала Intel (при участии Apple, дай бог им здоровья за популяризацию). Идея была прекрасна: взять самую быструю шину внутри компьютера (PCI Express), добавить к ней видеовыход (DisplayPort) и засунуть все это в один компактный кабель. В итоге через один разъем можно подключать внешние видеокарты, супербыстрые SSD, док-станции с кучей портов, и все это будет работать на скоростях, сравнимых с внутренними компонентами. Это победа инженерной мысли. Это удобно. Это будущее. Но это и есть тот самый троянский конь. Потому что, выводя PCI Express наружу, Intel и партнеры вывели наружу и DMA. По сути, Thunderbolt-порт - это дыра в корпусе, через которую к шине PCIe может подключиться кто угодно. Да, там есть протоколы аутентификации, есть проверки, но, как показала практика, они либо отключены, либо ломаются, либо просто не включены по умолчанию в BIOS'ах миллионов ноутбуков. А теперь USB4. USB4, по сути, взял за основу протокол Thunderbolt 3. Теперь любой порт USB-C с поддержкой USB4 - это потенциальный порт для DMA-атаки. Это уже не экзотика типа "у мака есть Thunderbolt". Это массовый сегмент. Это каждый второй ноутбук, выпущенный после 2020 года. Безопасность как опция, а не базовая функция И вот тут мы подходим к самому главному, к тому, что бесит больше всего. К вопросу выбора. Почему IOMMU (VT-d/AMD-Vi) - технология виртуализации ввода-вывода, которая как раз и создана, чтобы изолировать устройства и блокировать несанкционированный DMA - почему она по умолчанию отключена на большинстве потребительских устройств? Ответ простой и циничный: потому что это дает мизерную прибавку производительности. Потому что это усложняет отладку драйверов. Потому что вендоры считают, что пользователям это не нужно. Они продают нам красивые коробочки с подсветкой, мощные процессоры и тонкие корпуса, но экономят на нашей безопасности в угоду цифрам в бенчмарках и стабильности работы кривых драйверов. Это называется "security by default" с точностью до наоборот. Мы имеем "insecurity by default". Система из коробки - открыта. И пользователь, даже если он профи, должен лезть в дебри BIOS, включать VT-d, проверять настройки Kernel DMA Protection в Windows, следить за обновлениями прошивок - и все равно не иметь гарантий, что очередное подключенное устройство не проскочит через защиту. Часть 1. Магия (и физика) DMA: Как периферия становится царем горы Что такое DMA? Direct Memory Access. Это технология, созданная для того, чтобы не мучить процессор по пустякам. Если бы каждое устройство ввода-вывода (сетевая карта, звуковая карта, видеокарта, USB-контроллер) для каждой операции обращалось к CPU с просьбой «перемести байтик отсюда туда», процессор бы только тем и занимался, что таскал данные. Производительность упала бы в ноль. DMA-контроллер (или современное устройство с поддержкой Bus Mastering) решает эту проблему. Устройство говорит процессору: «Командир, дай мне доступ к шине и адрес памяти, я сам все передвину». Процессор, будучи занятым более важными делами, выделяет устройству диапазон физических адресов в памяти и отдает команду «работай». Устройство само пишет и читает из RAM, не спрашивая процессор. Красота. А теперь представьте, что этим устройством становится ваш Thunderbolt-порт, к которому подключен внешний диск. Или, что еще интереснее, специально сконструированный девайс - атакующий адаптер. Это как дать вору ключи от квартиры, пока хозяин смотрит телевизор и не обращает внимания. Технически, устройство на шине PCI Express (а Thunderbolt и USB4 внутри - это фактически выведенный наружу PCIe) может запросить у контроллера шины адресное пространство и начать в него писать/читать. Практический пример из жизни добрых людей: У вас есть ноутбук с портом Thunderbolt. Он заблокирован, но включен. Вы подключаете специальный девайс (о них ниже). Девайс видится системе как, скажем, контроллер Ethernet или NVMe-диск. Но вместо того, чтобы хранить файлы, он инициирует DMA-транзакции и начинает читать физическую память по адресам, где скорее всего лежит ядро. Вот упрощенный псевдокод того, что происходит на стороне атакующего устройства (на самом деле там Verilog или VHDL, но для понимания сойдет): C: [CODE] // Представьте, что мы пишем прошивку для FPGA на C (это грубое упрощение) void dma_attack ( ) { // 1. Инициализируем PCIe Endpoint pcie_init ( DEVICE_ID_VENDOR , DEVICE_ID_DEVICE ) ; // 2. Запрашиваем у хоста выделение областей BAR (Base Address Registers) // Это пространство памяти, которое система выделит для нашего устройства. // Но через него мы можем инициировать транзакции в ЛЮБУЮ область памяти, // если IOMMU не блокирует. // 3. Начинаем сканирование физической памяти uint64_t phys_addr = 0x0 ; uint8_t buffer [ 4096 ] ; while ( phys_addr Thunderbolt Configuration [*]System Configuration -> Thunderbolt Adapter [*]Security -> I/O Port Access[/LIST]Ищи опции типа:
Это must have. Даже если ты не используешь виртуалки, включи эту опцию. Она заставит чипсет переводить DMA-запросы устройств через таблицы трансляции адресов. Где искать:
6.5. ACPI настройки питания для портов Ищем опции, отвечающие за питание портов в режиме сна. Это важно для защиты от атак на Modern Standby (S0ix). Опции могут называться:
Уровень 2. Настройки операционной системы и ядра БИОС дал команду, теперь ОС должна ее исполнить и не накосячить. 6.6. Windows: Kernel DMA Protection и Memory Access Protection У Microsoft есть несколько механизмов. Они эволюционировали. Проверка статуса: Жми Win + R, введи msinfo32 и нажми Enter. Ищи строки:
Если ты управляешь парком машин через Group Policy, обрати внимание на: Computer Configuration - Administrative Templates - System - Kernel DMA Protection. Там можно принудительно включить защиту для всех Thunderbolt-портов. 6.7. Linux: Параметры ядра, мануалы и initramfs В Linux все настраивается через параметры загрузки ядра (kernel command line). Это мощно, но требует понимания. Шаг 1. Включаем IOMMU в загрузчике (GRUB). Открой файл /etc/default/grub. Найди строку GRUB_CMDLINE_LINUX_DEFAULT. Добавь туда параметры:
Код: Код:
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt pcie_acs_override=downstream"
Перезагрузись и выполни: Bash: Код:
sudoКод: Код:
DMAR: IOMMU enabledBash: Код:
#!/bin/bashШаг 3. Блокировка загрузки с внешних устройств (Secure Boot и подписи). Даже если DMA заблокирован, злоумышленник может попытаться загрузить свой эксплойт до загрузки ОС. Secure Boot (с правильно настроенными ключами) помогает, но не панацея. В Linux убедись, что ты используешь подписанные модули ядра, если Secure Boot включен. Шаг 4. Модуль thunderbolt и его настройки. В Linux есть модуль ядра thunderbolt. Посмотри его параметры: Bash: Код:
/sbin/modinfo thunderboltПример udev-правила для автоматической блокировки всех новых Thunderbolt-устройств: Создай файл /etc/udev/rules.d/99-thunderbolt.rules: Код: Код:
# Блокируем все новые Thunderbolt устройства по умолчанию6.8. macOS: Философия T2 и M1/M2 Apple historically пыталась контролировать этот процесс жестко. На Intel-маках с чипом T2, порты Thunderbolt проходят через T2, который выполняет роль контроллера ввода-вывода и может блокировать DMA до аутентификации пользователя. На Apple Silicon (M1/M2/M3) система еще более закрытая, и IOMMU там интегрирована на кристалле очень плотно. Практика для маковода:
Уровень 3. Программный мониторинг и активная защита Мы настроили железо и ОС, но нужно смотреть, что происходит в реальном времени. 6.9. Аудит подключений Windows: События подключения Thunderbolt устройств логируются в Event Viewer. Путь: Applications and Services Logs - Microsoft - Windows - Thunderbolt - Operational. Там можно увидеть, когда устройство было подключено, авторизовано ли оно, и кем. Для админа полезно настроить сбор этих логов в SIEM. Linux: Смотрим dmesg и journalctl. Bash: Код:
journalctl -k -f6.10. Инструменты для защиты в Linux: bolt В Linux есть демон bolt, который управляет политикой подключения Thunderbolt. Он позволяет администратору задавать, каким устройствам доверять. Установка: Bash: Код:
sudo
Уровень 4. Специализированные средства для параноиков Когда стандартных средств мало, в ход идут тяжелые пушки. 6.11. Использование IOMMU для принудительной изоляции Мы уже включили IOMMU, но можно пойти дальше. В Linux есть возможность привязать конкретное PCIe-устройство (например, Thunderbolt-контроллер) к специальному драйверу-заглушке (vfio-pci), который не дает устройству работать, пока виртуальная машина не запросит доступ. В контексте хоста это означает, что порт будет просто недоступен для DMA, пока ты сам не разрешишь. Это делается через параметры ядра, но сложно и подходит только для очень специфичных сценариев. 6.12. Аппаратные средства проверки подлинности Существуют коммерческие решения, которые требуют подключения специального USB-ключа для разблокировки портов Thunderbolt. Без ключа порт не подает питание на шину данных. Дорого, сложно, но для режимных объектов - вариант. 6.13. Скрипты автоматической блокировки Можно написать простой скрипт (на Python, bash), который при блокировке экрана (через систему событий D-Bus или API Windows) отключает питание портов или переводит их в состояние "только зарядка". При разблокировке - возвращает обратно. Пример наброска для Linux с использованием sysfs и udev: #!/bin/bash # Отключаем авторизацию Thunderbolt при блокировке экрана # Привязываемся к событию screen-lock Bash: Код:
ifУровень 5. Тестирование и проверка Самое важное - проверить, работает ли твоя защита. 6.14. Тестовые атаки на себя Если у тебя есть второй компьютер и плата USB3380 (или Screamer), попробуй атаковать свою защищенную систему. Это лучший тест.
6.15. Использование встроенных средств диагностики
Миф 1: «У меня Mac, я в безопасности». Камон, ребята. T2 и M1/M2 чипы имеют контроллеры Thunderbolt. Да, у Apple своя реализация IOMMU, и она довольно строгая. Но и там находили дыры. Например, атака "Thunderstrike" на Mac. Кроме того, есть проблема загрузки: пока UEFI (или iBoot) грузится, доступ к DMA может быть открыт. Не расслабляемся. Миф 2: «Я использую Linux, у меня VT-d включен в ядре». Это хорошо, но недостаточно. Включили ли вы его в BIOS? Правильно ли настроили параметры загрузки ядра? Используете ли вы iommu=pt? Даже с включенным VT-d, если ваше устройство Thunderbolt зарегистрировалось как "PCIe Root Port", оно может иметь доступ к памяти. Проверяйте dmesg | grep -i dmar и смотрите, нет ли там ошибок. Самая смешная (в черном смысле) вещь в том, что мир 10 лет знал об этой проблеме. Еще в 2011-м году на Black Hat были доклады. Intel ввела защиту, но производители ленились ее включать. Microsoft ввела Kernel DMA Protection в Windows 10, но она работает только с определенными драйверами и на новых версиях. В итоге миллионы устройств до сих пор ходят с открытыми воротами. А все потому, что шина PCI Express слишком доверчивая. Она считает, что если устройство подключено физически, то оно "свое". А мы знаем, что в мире безопасности доверие - это главная уязвимость. Часть 8. Код, код, код: Пишем простой сканер сигнатур для дампа Допустим, вы уже сняли дамп памяти (raw-файл) с помощью PCILeech. Что дальше? Без анализа это просто мусор. Напишем простой скрипт на Python (с использованием конструкций C для скорости, но для демо хватит), который ищет в дампе ключи BitLocker. Ключ BitLocker (VMK) представляет собой структуру, которая часто начинается с сигнатуры 0x4D534654 (это "MSFT" в ASCII) или других маркеров, связанных с шифрованием. Полный разбор структур опустим, иначе статья станет книгой, но концепт дам. Python: Код:
importЗаключение: Ничто не забыто, никто не забыт Это был разговор на равных. И сейчас, когда пыль оседает, а клавиатура немного остыла, давай соберем всё это в единую картину. Итак, что мы на самом деле выяснили? 1. Архитектурное наследие: Доверие как проклятие Вся компьютерная архитектура x86 (и ARM туда же движется) строилась десятилетиями на принципе внутреннего доверия. Шина PCIe проектировалась инженерами, которые исходили из предположения: "Если устройство физически подключено к материнской плате, значит, оно легитимное". Это разумно для железа внутри корпуса. Но как только мы вывели эту шину наружу через разъем Thunderbolt, мы создали брешь в тканях реальности. Thunderbolt и USB4 - это не просто "проводок для флешки". Это хирургический зонд, который воткнут прямо в артерию системы. И пока производители чипсетов и вендоры ноутбуков делают вид, что IOMMU - это "опциональная фича для корпоративных версий", мы с вами живем в мире, где физическая безопасность устройства равна нулю, если оно включено. Современный компьютер - это крепость с распахнутыми воротами. На воротах висит табличка "Вход по пропускам" (блокировка экрана), но любой, кто подойдет с нужным инструментом (PCILeech/FPGA), может просто войти через калитку DMA, потому что стражники (CPU) привыкли, что свои своих не трогают. 2. Свалка иллюзий: Что мы развенчали? Мы жестко, но справедливо прошлись по мифам:
3. Инструментальная революция: От элитарности к доступности Еще лет десять назад DMA-атаки были уделом спецслужб и очень богатых исследователей с паяльными станциями и доступом к дорогим логическим анализаторам. Сейчас? Сейчас любой студент с парой сотен долларов и прямыми руками может собрать себе Screamer или купить готовый девайс на базе USB3380. PCILeech и MemProcFS от Ulf Frisk сделали для мира DMA-атак то же, что Metasploit сделал для эксплуатации уязвимостей - они демократизировали процесс. Теперь не нужно писать тонны кода для работы с PCIe. Ты просто подключаешь железку, запускаешь скрипт и получаешь файловую систему памяти цели. Это гениально и страшно одновременно. Если инструмент стал доступен "быдлокодерам" (простите за жаргон), значит, проблема перешла из разряда теоретических в разряд реальных угроз для каждого. Теперь это не "крутой эксплойт на Black Hat", а реальность для службы безопасности любого предприятия. 4. Глубинный смысл для админа и юзера Если ты админ корпоративной сети, ты должен составить список всего железа, у которого есть порты Thunderbolt/USB4. Ты должен проверить настройки BIOS каждой модели. Включена ли VT-d? Есть ли опция "DMA Protection"? Используете ли вы Windows с Kernel DMA Protection? Если нет - это твоя зона ответственности. Ты не можешь сказать: "Это проблема пользователя, пусть не спит с ноутбуком". Ты должен сделать так, чтобы даже спящий ноутбук был крепостью. Если ты простой пользователь, который боится за свои личные фото или криптокошелек (помним, кстати, что холодные кошельки на зараженных машинах - тоже тема), твой алгоритм прост:
Что нас ждет завтра?
Итак, что мы имеем в сухом остатке? Мы имеем технологию, которая подарила нам скорость и удобство, но открыла ящик Пандоры. Мы имеем миллионы устройств, которые ждут своего исследователя (или злоумышленника). Мы имеем сообщество, которое способно как защищать, так и атаковать. Моя задача была - не напугать тебя, а научить видеть. Видеть за красивым интерфейсом ОС - голую память. Видеть за портом USB-C - открытую шину. Видеть за спящим режимом - активную угрозу. Теперь ты знаешь цену физическому доступу. Ты знаешь, что блокировка экрана - это не стена, а занавеска. Ты знаешь, что IOMMU - это твой друг, но друг, который любит, чтобы его включали вручную. |
| Время: 03:38 |