Донорские профили и теневое конфигурационное пространство
Из чего на уровне регистров состоит профиль донора: vendor ID и device ID, subsystem ID, размеры BAR и список capabilities. И почему правдоподобный донор лучше типового.
Коротко
Донорский профиль — это идентичность реального PCIe-устройства. Ваша карта записывает её в теневое конфигурационное пространство и показывает хосту. В профиле хранятся vendor ID, device ID, subsystem ID, раскладка BAR и список capabilities. Правдоподобный донор выглядит как обычное железо. Типовой донор или донор, общий для множества карт, — это узнаваемый паттерн, который увидит любой, кто перечисляет устройства.
На странице10
- Конфигурационное пространство — первое, что у карты спрашивают
- Теневое конфигурационное пространство и почему в него можно писать
- Поля и что каждое из них сообщает наблюдателю
- Почему правдоподобное лучше экзотики
- Что делает донора правдоподобным
- Почему двое на одном доноре хуже, чем у каждого свой обычный
- Чего донорский профиль не делает
- Что стоит спросить до покупки профиля
- Вопросы о донорах
- Источники
Конфигурационное пространство — первое, что у карты спрашивают
У каждого PCIe-устройства есть небольшой блок регистров, который называется конфигурационным пространством (configuration space). Хост читает его при перечислении устройств, чтобы получить ответы на три вопроса: кто ты, к какому классу устройств относишься и сколько адресного пространства тебе нужно. По этим ответам Windows выбирает драйвер. Те же регистры может прочитать и любая другая программа на этой машине. Ответы выдаёт прошивка вашей карты. Так что конфигурационное пространство — это публичная идентичность карты, выбирали вы его содержимое сознательно или нет.
Теневое конфигурационное пространство и почему в него можно писать
В стандартном проекте FPGA аппаратный блок PCIe отвечает на чтение конфигурации значениями, зафиксированными при синтезе. DMA-прошивка ставит перед ним записываемый оверлей на 4 КБ в блочной памяти (BRAM) — теневое конфигурационное пространство (shadow configuration space) — и отвечает уже из него. В публичной линейке pcileech-fpga он лежит в coefficient-файле, который компилируется в битстрим. Получается, что идентичность карты — это данные, а не кремний. Именно поэтому прошивку можно пересобрать под другого донора без нового железа.
Поля и что каждое из них сообщает наблюдателю
Смещения отсчитываются от начала конфигурационного пространства устройства. Важна последняя колонка: в ней сказано не зачем нужно поле, а что узнаёт тот, кто его читает.
| Смещение | Поле | Что хранит | Что сообщает наблюдателю |
|---|---|---|---|
| 0x00 | Vendor ID | 16-битный код, который PCI-SIG присваивает производителю | Какая компания якобы это выпустила. Неприсвоенное значение или известный производитель FPGA на плате, которая выдаёт себя за сетевую карту, — сразу противоречие |
| 0x02 | Device ID | 16-битный код, который производитель присваивает конкретному продукту | Каким именно продуктом устройство себя называет. В паре с vendor ID это указывает на конкретную модель, которая либо существует, либо нет |
| 0x08 | Revision ID | Ревизия кристалла этой модели | Выпускалась ли вообще такая ревизия с этим device ID. Ревизия, которой не было ни у одного продукта, — несоответствие сама по себе |
| 0x09-0x0B | Class code | Базовый класс, подкласс и программный интерфейс | К какой категории относится устройство. Сверить class code с device ID — одна из самых дешёвых проверок, провести её может кто угодно |
| 0x10-0x27 | BAR0–BAR5 | Base address registers: сколько областей нужно устройству, какого размера, память или I/O, prefetchable или нет | Объём памяти, который запросило бы настоящее устройство. Если у донора BAR0 на 4 КБ, а прошивка запрашивает что-то другое, карта уже не совпадает с устройством, за которое себя выдаёт |
| 0x2C | Subsystem Vendor ID | Кто собрал плату, на которой стоит чип | Референсное это устройство или конкретная OEM-версия. На железе самого производителя чипа часто совпадает с vendor ID |
| 0x2E | Subsystem ID | Какой вариант платы у этого сборщика | Поле, которое в плохих прошивках копируют реже всего. Настоящий чип с пустой или бессмысленной subsystem-парой — сильный сигнал сам по себе |
| 0x34 | Capabilities pointer | Смещение первой записи в связном списке capabilities | Что у устройства вообще есть capabilities. Указатель в пустоту — ошибка структуры, какой у нормального железа не бывает |
| 0x40+ | Capability list | Связный список: управление питанием, MSI или MSI-X, сама capability PCI Express, записи производителя | Какие функции поддерживает модель. У настоящего устройства в списке определённый набор в определённом порядке, и укороченный или переставленный список с ним не совпадает |
| 0x100+ | Extended capabilities | Расширенное пространство PCIe: advanced error reporting, подсостояния питания L1, серийный номер устройства | Вторая, более крупная поверхность, которую большинство никогда не заполняет. Пустота там, где у настоящего устройства есть записи, — уже отличие |
| Ext cap 0x0003 | Device Serial Number | 64-битный серийный номер только для чтения, однозначно идентифицирующий одно физическое устройство | Одно значение, по которому снимается отпечаток платы. Если две карты отдают один и тот же номер, это доказуемо один и тот же профиль |
Ни одна из этих строк сама по себе не метод детекта. Это поля, которые наблюдатель может прочитать без всяких усилий. Профиль хорош ровно настолько, насколько хорошо его наименее согласованное поле.
Почему правдоподобное лучше экзотики
Выбирая прошивку, люди часто просят самого редкого донора в расчёте на то, что его никто не видел. Логика тут обратная. Устройство, которого никто не видел, вызывает интерес, а интерес — ровно то, что вам не нужно. Цель — устройство, которое не выделялось бы именно в вашей машине. Карта захвата уместна в машине, с которой стримят. Сетевая карта — в машине со второй сетью. Накопитель — в машине со свободным слотом. Донор правдоподобен, когда у того, кто читает список устройств, нет причин присматриваться.
Что делает донора правдоподобным
Пять пунктов, примерно в порядке того, как часто в них ошибаются. Все пять выполняются сами собой, когда донор — реальное устройство, скопированное целиком.
- Внутренне согласован
- Vendor, device, revision, class code и subsystem-пара описывают один и тот же выпущенный продукт
- Полный
- Размеры BAR и список capabilities совпадают с настоящим устройством, а не взяты по умолчанию из шаблона
- Обычный в своём контексте
- Такая карта, какой место в машине этого типа и в слоте этого типа
- Не растиражирован
- Этот же профиль не стоит на большом количестве других карт
- Ещё в ходу
- Устройство до сих пор встречается в реальных машинах, а не снято с производства много лет назад
Внимание
Почему двое на одном доноре хуже, чем у каждого свой обычный
Донорский профиль становится отпечатком, только если он выделяется. Профиль, общий для многих карт, выделяется очень легко. Не потому что какое-то поле выглядит неправильно, а потому что повторяется точное сочетание полей. Как только это сочетание с чем-то связали, эту связь наследует каждая карта, на которой оно стоит. В том числе карты, которые ничего не делали. Обычный, аккуратно скопированный профиль в единственном экземпляре — худшая мишень, чем редкий профиль, общий для целой партии. Первый — одно из тысяч реальных устройств. Второй — множество с известным составом.
Внимание
Чего донорский профиль не делает
Он меняет то, как идентичность карты читается на уровне PCIe. Все остальные места, где вы можете засветиться, остаются как были. Это поведение софта и то, как устройство ввода двигает курсор. А также тракт вывода изображения, история самого аккаунта и то, что видит человек, разбирающий репорт. Качественная прошивка убирает один конкретный способ попасться на глаза. Это не безопасность. Гарантировать безопасность здесь не может никто, и любой продавец, который утверждает обратное, говорит то, что вы хотите услышать.
Что стоит спросить до покупки профиля
Ответы на эти вопросы скажут больше, чем любое название уровня.
- Донор — реальное серийное устройство или набор значений, отредактированный вручную?
- Сколько других карт прямо сейчас работают на этом же профиле?
- Размеры BAR и список capabilities скопированы с донора или оставлены по умолчанию из шаблона?
- Subsystem-пара заполнена или обнулена?
- Подходит ли профиль машине, в которой будет стоять, или он просто необычный?
- Что будет с профилем, если его с чем-то свяжут, — есть ли возможность пересборки?
Вопросы о донорах
Можно использовать своё донорское устройство?
Не делайте выводов ни в ту, ни в другую сторону — сначала спросите поддержку. Чтобы считать конфигурационное пространство донора, нужна сама карта и компьютер, в котором её можно прочитать. Полезен полный и точный дамп, а не три значения из объявления.
Донор должен совпадать с железом, которое у меня реально есть?
Нет, и обычно не совпадает. Это должно быть устройство, которое никого не удивит в машине вроде вашей. Наличие настоящего устройства никак не меняет того, как читается карта.
Редкий донор лучше распространённого?
Сам по себе — нет. Редкий и при этом общий для многих — худшее сочетание. Распространённый и хорошо скопированный — разумное. Профиль в единственном экземпляре — ровно то, ради чего существуют уровни с отдельным донором под каждый заказ.
Можно поменять конфигурационное пространство без перепрошивки?
Нет. Теневое пространство вкомпилировано в битстрим, так что другой профиль — это другой образ и новая прошивка. По той же причине смена профиля — это запрос на пересборку, а не переключатель в настройках.
Хороший донорский профиль означает, что моя сборка в безопасности?
Нет. Он закрывает один вектор риска — идентичность карты на уровне PCIe. Поведение софта, ввод, тракт вывода изображения и история аккаунта им не затрагиваются.
Источники
Что делает донора правдоподобным — наша собственная оценка. То же касается довода, что профиль, стоящий сразу на многих картах, хуже профиля распространённого устройства.
- 01PCI configuration space (overview)
структура заголовка и смещения vendor ID, device ID, BAR, subsystem ID и списка capabilities
en.wikipedia.org
- 02pcileech-fpga (Ulf Frisk)
публичная линейка gateware, о которой говорится на странице: в ней теневое конфигурационное пространство вкомпилировано в битстрим
github.com
Читать дальше
Не получилось? Откройте тикет в Discord
Все гайды