
Разблокировка _всего_ на CPU с помощью скремблирования DRAM
Разблокировка всего на CPU с помощью скремблирования DRAM — PSP, C6, микрокод, SMM и всего остального, что осталось за рамками спецификаций.
&x == &x.
Обычно.

Ткните в контроллер DRAM, и адрес можно заставить попасть куда угодно в
памяти. skitter-creek-bath-salts модифицирует нижние слои иерархии памяти,
чтобы перекоммутировать трансляции физических адресов DRAM. Это скремблирует
память платформы, обнажая защищённые области DRAM — вырезы, невидимые даже
для ядра. Когда трансляции адресов ломаются, ломаются и примитивы
безопасности, построенные на них, и мы разблокируем всё.
Разработано и протестировано на AMD Family 16h CPUs, последнем поколении,
в даташитах которого документированы регистры трансляции контроллера DRAM — и
показано, что их нельзя заблокировать. 17h и далее просто опускают эту
информацию. Одиссея *p похожа across generations и
архитектур, а лежащие в основе преобразования простираются даже до ARM, RISC-V и
дальше; skitter-creek-bath-salts показывает нам лишь то, как начать.
*pЭто долгий путь вниз.
Память построена на слоях абстракции настолько глубоких, что они становятся почти
абсурдными. Когда ваш код разыменовывает *p, кажется, что он обращается к DRAM по адресу p. Это не так —
p — это виртуальный адрес, и прежде чем будет затронут хотя бы один бит DRAM, он должен
пройти через испытание, описанное ниже:```
── CPU core / MMU ─────────────────────────────────────────────────
┌─ VA ← 64-bit virtual address from load/store
│
└> canonical-form check ──────────────────────┐ ← bits [63:48] sign-extend from bit 47
┌─ segment base add <─────────────────────────┘ ← FS.base / GS.base (MSR_FS_BASE, MSR_GS_BASE)
│
└> TLB probe ─────────────────────────────────┐ ← tagged by PCID (host) / VPID (guest)
hit → physical address k │
miss → engage hardware page walker │
┌─ page walk (from CR3) <─────────────────────┘ ← walked only on TLB miss
│ PML5[VA 56:48] ← only if CR4.LA57
│ PML4[VA 47:39]
│ PDPT[VA 38:30] ← 1 GiB leaf possible
│ PD [VA 29:21] ← 2 MiB leaf possible
│ PT [VA 20:12]
│ PTE ← R/W · U/S · NX · A/D · PAT · PCD · PWT · G
│
└> per-level checks ──────────────────────────┐ ← evaluated at every level of the walk
privilege (U/S) │ ← CPL vs PTE.U/S
write (R/W) │ ← + CR0.WP
execute (NX) │ ← EFER.NXE
SMEP / SMAP │ ← CR4.SMEP · CR4.SMAP · EFLAGS.AC
protection keys │ ← PKRU (user) · IA32_PKRS (supervisor)
┌─ A/D bit update <───────────────────────────┘ ← locked RMW on PTE
│
└> if guest: EPT / NPT re-walk ───────────────┐ ← each guest-PA above re-walked
EPT-PML4 → EPT-PDPT → EPT-PD → EPT-PT │ ← + EPT memory-type override
⇒ ~5× walks per single guest walk │
┌─ TLB shootdown IPIs <───────────────────────┘ ← invlpg broadcast to peer vCPUs
│
│ ── IOMMU (chipset / I/O fabric) ──────────────────────────────────
│
└> if device-initiated, IOMMU page walk ──────┐ ← VT-d / AMD-Vi: device-ID → domain → tables
│
┌── physical address k <─────────────────┘
│
│ ── CPU core / MMU — memory-type resolution ────────────────────────
│
└> MTRR range match ──────────────────────────┐ ← IA32_MTRR_DEF_TYPE + fixed/variable MTRRs
┌─ PAT entry select <─────────────────────────┘ ← IA32_PAT[ PTE.PAT:PCD:PWT ]
│
└> effective memory type ─────────────────────┐ ← { WB, WT, WC, WP, UC-, UC }
│
── CPU uncore — caches & coherence ────────────────────────────────
│
┌─ L1-D probe <───────────────────────────────┘ ← VIPT, per-core
│
└> L2 probe ──────────────────────────────────┐ ← per-core / per-CCX
┌─ LLC probe + directory consult <────────────┘ ← shared, sliced
│
└> snoop / coherence ─────────────────────────┐ ← MESI / MOESI broadcast
intra-socket │ ← broadcast to peer cores
inter-socket │ ← QPI · UPI · Infinity Fabric · CXL.cache
home-node directory response │ ← data | intervention | abort
│
── system data fabric / interconnect ──────────────────────────────
│
┌─ if MMIO range or sub-4 GiB MMIO hole <─────┘ ← uncore/data fabric posted/non-posted txn
│ → device BAR; done
│
└> else DRAM-bound: data fabric / mesh ───────┐ ← AMD DF · Intel mesh-or-ring uncore
│
┏━━ ── MCT / IMC (memory controller) ────────────────────────────────
W ┃ ┌─ DRAM hole remap <──────────────────────────┘ ← high-memory remap above TOM
E ┃ │
┃ └> memory-region exclusion remap ─────────────┐ ← reserved / protected ranges
┃ ┌─ channel interleave hash <──────────────────┘ ← XOR of selected PA bits → channel
A ┃ │
R ┃ └> rank interleave hash ──────────────────────┐ ← XOR of selected PA bits → rank
E ┃ ┌─ bank interleave hash <─────────────────────┘ ← XOR of selected PA bits → bank
┃ │
┃ └> bank swizzle / XOR scramble ───────────────┐ ← vendor- and BIOS-configurable
H ┃ ┌─ chip-select normalize (DCT) <──────────────┘ ← per-rank CS line
E ┃ │ rank → CS map
R ┃ │
E ┃ └> sub-channel select ────────────────────────┐ ← DDR5 / LPDDR5 only
┗━━ │
│
DRAM coordinates <─────────────────────────┘ ← bank group · bank · row (RAS) · column (CAS)
Этот проект работает на самых глубоких уровнях конвейера `*p`, на уровне MCT/DCT
— там, где физический адрес из data fabric/interconnect попадает в контроллер
памяти и переписывается в последний раз в необработанные координаты DRAM, которые
выдаются на DIMM.
---
## Спагеттификация DRAM
> Физические адреса — это, скорее, рекомендация.```nasm
xor dword [0xf80c2094], 0x00400000
Вот эксплойт. Весь целиком.