В эпоху «бума майнинга», глядя на то, как любое железо, способное добывать криптовалюты, моментально сметается с прилавков, корпорация NVIDIA приняла решение выпустить на рынок чипы, не прошедшие полноценный контроль качества. При обычных обстоятельствах такие микросхемы утилизируются, но если неликвид можно продать, то почему бы и нет?
Так появились сначала видеокарты P100, P104 и P106 на ядре Pascal, а затем серия CMP (ядра Turing и Ampere). Они отличались от своих «полноценных» собратьев:
-
отсутствием видеовыходов;
-
урезанной версией шины и её шириной (PCIe 1.1 x4);
-
меньшим объёмом памяти;
-
отсутствием поддержки определённых технологий (NVENC, NVLink).
Некоторые из ограничений обусловлены дефектами кристаллов, а другие соображениями экономии (например, шина x4 превращается в x16 после распайки недостающих SMD-элементов).
Эти карты могут даже служить 3D-ускорителями (если выводить изображения через интегрированное в процессор видеоядро или вторую видеокарту), хотя NVIDIA относится к этому негативно и, как только тема «играем на дешёвых картах для майнинга» стала набирать обороты, компания внесла блокирующие изменения в драйверы. Впрочем, энтузиасты быстро научились этому противостоять.
Среди майнинговых карт особняком стоит самая малоизученная и дорогая (на старте продаж цена составляла сумасшедшие 5000 долларов, но с потерей актуальности опустилась до 200-300) — CMP 170HX. В отличие от остальных, она является отбраковкой не от игровых видеокарт GTX/RTX, а от серверной Tesla A100 и, подобно ей, наделена памятью HBM2e, которая располагается на одной подложке с видеочипом. Как следствие, все CMP 170HX имеют на борту столько же памяти, сколько их старшие собратья, карты Tesla. Однако эта память не прошла контроль качества и урезана до 8 или 10 ГБ (существуют две версии CMP 170HX: 8-гигабайтная представляет собой отбраковку от 40-гигабайтной A100, а 10-гигабайтная — от 80-гигабайтной).
Исследователь Jon Pry утверждает, что сумел обойти многие из упомянутых ограничений, в том числе разблокировал искусственно урезанную память.
Главной задачей было найти способ модифицировать защищённые от записи со стороны хоста регистры, переопределяющие фьюзы GPU, в которых хранятся заданные производителем «урезанные» значения. Снять с них защиту может только Falcon (специальный сопроцессор — “ядро безопасности”, присутствующее в каждом графическом чипе NVIDIA). Казалось бы, проще всего модифицировать прошивку, но, начиная с поколения Pascal, она подписана цифровой подписью (алгоритм RSA-3072), а GPU содержит в себе публичный ключ, с помощью которого проверяет подлинность прошивки и отказывается работать, если подпись повреждена.
Исследователь сосредоточился на поиске уязвимостей в прошивке. Он обнаружил, что в загрузчике (который поставляется в составе драйверов) есть баг с переполнением буфера памяти. Предположительно, подобные ошибки сложнее обнаруживать статическими анализаторами, поскольку запись выполняет DMA-движок, а не обычный memcpy. Возможно, именно по этой причине инженеры NVIDIA пропустили баг. Тем не менее, они предусмотрели защиту от такого класса атак — так называемую «стековую канарейку» (в стек помещается значение, а перед возвратом функции проверяется, что оно не изменилось). Сделано всё как по учебнику: значение генерируется аппаратным генератором случайных чисел и меняется при каждом запуске. Но дальше программисты допустили фатальную ошибку, сводящую защиту на нет — значение хранится в области данных, которую физически может перезаписать то самое переполнение буфера, от которого канарейка должна была защищать.

Переполнение буфера, в свою очередь, позволяет выполнить произвольный код. Что самое приятное, код выполняется уже после того, как подпись проверена. А значит, с точки зрения прошивки всё в порядке: подпись корректна, безопасность загрузки не нарушена.
Следующей сложностью стало то, что Falcon не позволяет хосту читать свою память (за исключением одного mailbox-регистра). Пришлось написать эмулятор прошивки. Поскольку Falcon не имеет собственной операционной системы, потоков или прерываний, то можно в любой момент воспроизвести состояние памяти и отладить полезную нагрузку, не имея возможности видеть стек на реальном железе.
Дальше выполняем наш код, который в режиме Heavy Secure способен открыть PLM (priv-level masks), защищающие регистры-переопределители фьюзов. После этого можно обычным образом писать в регистры с хоста и менять их значения на нужные.
Что удалось получить:
-
снять ограничение производительности вычислительных блоков (SM), производительность FP32/64 выросла в десятки раз;
-
объём памяти увеличился в 8 раз;
-
удвоилась пропускная способность шины PCIe. Попытки поднять её до Gen3 оказались безуспешными. Возможно это уже физическое ограничение со стороны дефектного чипа (помним про отбраковку). Как упоминалось выше, ширину шины можно увеличить ещё вчетверо, но потребуется физическое вмешательство (распайка SMD-элементов возле слота PCIe).

Что не удалось:
-
завести память на полной скорости (выдаёт ошибки в стресс-тестах). Оказалось, что на штатной частоте способна работать лишь половина памяти, очевидно, это и есть причина того, что GPU списали в брак. Пришлось увеличить тайминги памяти — ошибки пропали, но производительность памяти упала на треть;
-
включить поддержку ECC;
-
разогнать шину PCIe до Gen3 (не найден регистр-переопределитель).
В работе подчёркивается, что два последних пункта не являются принципиально невозможными, просто исследователь не смог их победить.
В настоящий момент сообщество энтузиастов пытается повторить описанное в этой работе и создать рабочий эксплоит. Уже удалось снять ограничение производительности SM. На очереди разблокировка памяти
Есть слабые свидетельства того, что это можно будет адаптировать к другим CMP-картам и, возможно, даже к линейке RTX. Впрочем, это далеко не первоочередная цель, хотя возможность за счёт более широкой шины превратить 60-долларовую CMP 90HX в нечто близкое к RTX 3080 по игровой производительности выглядит тоже весьма заманчиво (сейчас эти карты в играх буквально задыхаются из-за PCIe 1.1).
Уже можно смело сказать, что это самый серьёзный взлом прошивки видеочипов NVIDIA за последние 10 лет, открывающий очень заманчивые перспективы.
Источник: habr.com