В эпоху «бума майнинга», глядя на то, как любое железо, способное добывать криптовалюты, моментально сметается с прилавков, корпорация 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 имеют на борту 6 стеков памяти — столько же, сколько их старшие собратья, карты Tesla. Однако эта память не прошла контроль качества и урезана до 8 или 10 ГБ (существуют две версии CMP 170HX: 8-гигабайтная представляет собой отбраковку от 40-гигабайтной A100, а 10-гигабайтная — от 80-гигабайтной). В реальности памяти даже ещё больше, поскольку 80-гигабайтная Tesla A100 на самом деле несёт на себе 96 гигабайт памяти (очевидно, в процессе соединения GPU и HBM, часть памяти повреждается, поэтому выпускать 96-гиговые видеокарты затруднительно). Эта дополнительная память, в отличие от описанной выше «дефектной» (работоспособной, но не удовлетворяющей критериям качества), помечена как «отключённая» и, по-видимому, действительно неработоспособна.

Исследователь Jon Pry утверждает, что сумел обойти многие из упомянутых ограничений, в том числе разблокировал искусственно урезанную память.

Со своей стороны NVIDIA максимально усложнила задачу любителям модифицировать её продукты. Современные видеокарты защищены покруче, чем тюрьмы для особо опасных преступников:

  • Безопасность через неясность (NVIDIA старается раскрывать как можно меньше информации);

  • Отдельный сопроцессор, отвечающий за защиту кода от несанционированных изменений;

  • Несколько уровней безопасности (L0—L3);

  • Шифрование кода (AES);

  • Цифровая подпись кода (RSA);

  • Неизменяемый загрузчик;

  • Стековые канарейки.

Главной задачей было найти способ модифицировать защищённые от записи со стороны хоста регистры, переопределяющие фьюзы GPU, в которых хранятся заданные производителем «урезанные» значения. Снять с них защиту может только Falcon (специальный сопроцессор — “ядро безопасности”, присутствующее в каждом графическом чипе NVIDIA). Казалось бы, проще всего модифицировать прошивку, но, начиная с поколения Pascal, она подписана цифровой подписью, а GPU содержит в себе публичный ключ, с помощью которого проверяет подлинность прошивки и отказывается работать, если подпись повреждена.

Исследователь сосредоточился на поиске уязвимостей в прошивке. Он обнаружил, что в загрузчике (который поставляется в составе драйверов) есть баг с переполнением буфера памяти. Предположительно, подобные ошибки сложнее обнаруживать статическими анализаторами, поскольку запись выполняет DMA-движок, а не обычный memcpy. Возможно, именно по этой причине инженеры NVIDIA проглядели баг. Тем не менее, они предусмотрели защиту от такого класса атак — так называемую «стековую канарейку» (в стек помещается значение, а перед возвратом функции проверяется, что оно не изменилось). Сделано всё как по учебнику: значение генерируется аппаратным генератором случайных чисел и меняется при каждом запуске. Но дальше программисты допустили фатальную ошибку, сводящую защиту на нет — значение хранится в области данных, которую физически может перезаписать то самое переполнение буфера, от которого канарейка должна была защищать.

Переполнение буфера, в свою очередь, позволяет выполнить произвольный код. Что самое приятное, код выполняется уже после того, как подпись проверена. А значит, с точки зрения GPU всё в порядке: подпись корректна, безопасность загрузки не нарушена.

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

Дальше выполняем наш код, который в режиме Heavy Secure способен открыть PLM (priv-level masks), защищающие регистры-переопределители фьюзов. После этого можно обычным образом писать в регистры с хоста и менять их значения на нужные.

Что удалось получить:

  • снять ограничение производительности вычислительных блоков (SM), производительность FP32/64 выросла в десятки раз;

  • объём памяти увеличился в 8 раз;

  • удвоилась пропускная способность шины PCIe. Как упоминалось выше, ширину шины можно увеличить ещё вчетверо, но потребуется физическое вмешательство (распайка SMD-элементов возле слота PCIe).

Что не удалось:

  • завести память на полной скорости (выдаёт ошибки в стресс-тестах). Оказалось, что на штатной частоте способна работать лишь половина памяти, очевидно, это и есть причина того, что GPU списали в брак. Пришлось увеличить тайминги памяти — ошибки пропали, но производительность памяти упала на треть;

  • включить поддержку ECC;

  • разогнать шину PCIe до Gen3 (не найден регистр-переопределитель). Возможно это уже физическое ограничение со стороны дефектного чипа (помним про отбраковку).

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


В настоящий момент сообщество энтузиастов пытается повторить описанное в этой работе и создать рабочий эксплоит. Уже удалось снять ограничение производительности SM. На очереди разблокировка памяти

Есть слабые свидетельства того, что это можно будет адаптировать к другим CMP-картам и, возможно, даже к линейке RTX. Впрочем, это далеко не первоочередная цель, хотя возможность за счёт более широкой шины превратить 60-долларовую CMP 90HX в нечто близкое к RTX 3080 по игровой производительности выглядит тоже весьма заманчиво (сейчас эти карты в играх буквально задыхаются из-за PCIe 1.1).

Уже можно смело сказать, что это самый серьёзный взлом прошивки видеочипов NVIDIA за последние 10 лет, открывающий очень заманчивые перспективы.