Проект skitter-creek-bath-salts забирается в самый низ иерархии памяти — в MCT/DCT, контроллер DRAM — и переделывает финальную трансляцию физических адресов в координаты DRAM. Защищённые области (PSP private memory, SMRAM, C6 idle-state), которые обычно не видит даже ядро, оказываются доступны. Разработка проверена на AMD Family 16h: это последнее поколение, чьи даташиты документируют регистры трансляции контроллера и показывают, что их нельзя заблокировать. В 17h и новее этих деталей уже нет. Похожие трансформации есть и в ARM, RISC-V; проект показывает только начало.
Обычно &x == &x. Одна инструкция xor dword [0xf80c2094], 0x00400000 переключает bank-swizzle-mode в контроллере, и адрес, который вы читаете, физически оказывается в другом месте DRAM. Все защиты CPU, прошивки, IOMMU и кэшей построены для когерентного вида памяти и живут выше этого уровня, поэтому они ничего не подозревают. Чтобы пережить переключение, нужно действовать быстро и не трогать DRAM: отключить остальные ядра, разогреть TLB и кэши, запретить прерывания, сбросить целевую строку clflush, поставить mfence и lfence, переключить бит, прочитать или записать нужное, вернуть бит обратно и снова сериализовать доступы к памяти.
Дальше нужно узнать, как именно всё перемешалось. Трансформация MCT/DCT — линейное отображение над GF(2), значит её можно восстановить алгеброй. Работают так: из когерентного вида переключаются в перемешанный вид, кладут sentinel 0xdeadc0de в случайный адрес, возвращают когерентный вид и сканируют память. Значение всплывает в другой физической позиции — получается пара target/alias. Несколько таких пар подают SMT-солверу z3, и он вычисляет матрицу перехода. Теперь для любого защищённого адреса можно получить alias, который достанет до той же ячейки DRAM, минуя все заборы.
Этим уже вытаскивают секреты. PSP — это ARM-ядро, на котором работает fTPM; его память лежит в DRAM сразу за видимым верхом памяти. Утилиты проекта находят carveout, дампят его и дизассемблируют как Thumb-2. Из образа достают crAmd_ModExp — RSA-функцию модулярного возведения в степень, которой fTPM подписывает данные и через Miller-Rabin проверяет простоту при создании ключей. Для SMM читают SMBASE из MSR 0xc0010111, через alias-карту дампят SMI-handler по адресу SMBASE + 0x8000 и отдают дизассемблеру. Один бит в последнем уровне *p-пайплайна — и всё, что платформа спрятала в DRAM, открыто.