1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# New-area exploration round (post ASD-0x308)
## ASD 0x308 fptr claim — WITHDRAWN (corrected)
Rigorous load-then-call scan of [0xd1f038,0xd2f038): ZERO called function pointers.
0xd25a3c/0xd26c94/0xd26ca8 are DATA counters/limits (installed as 1000/-1, compared
with CMP), not fptrs. ASD 0x308 is a confirmed UNAUTHENTICATED gate-bypass OOB but
DoS/data-corruption only, NOT RCE.
## ASD command surface — EXHAUSTED
All 49 dispatched ASD commands scanned: only 0x300/0x301/0x308 have non-const
copies; only 0x308 is the (re-derived-length) OOB. No second copy OOB.
sub_D0D134(0x102)/sub_D0D26C(0x103): validate ptr for 4B. sub_D15AF8(0x201): host
len capped <=0x920. All bounded.
## SYS_DRV PROG_REG (sub_E1B558) — bounded
Programs a FIXED register whitelist (0x4480/0x44B0/0x44E0) with host value gated by
(value>>28)&7 != 3. Register not host-selectable. Not arbitrary.
## Register syscalls SVC 0x7B/0x7C/0xA0 — 310 sites, bounded
Register addresses are constants (baked in SYS_DRV) or come from the signed
firmware / register-list. No host-controlled unbounded register address found.
## Register-list applier (ring cmd 4214 -> sub_E2005C -> sub_E20570/sub_E20108)
HOST-REACHABLE: cmd 4214 passes a host pointer (a1[2]); the PSP applies a
(register,value) list with PSP privilege and NO signature check in sub_E2005C.
BUT each register is gated by sub_E177FC((reg>>12)&0x3FF), an APERTURE WHITELIST
restricted to the GFX IP register apertures (table off_E17854, per-instance
ranges). So the host can only program GFX-block registers it ALREADY controls via
MMIO -> intended GPU-bringup path, not a privilege escalation. (Caveat: the
allowed-aperture table is runtime-populated; a runtime dump of off_E17854 would
confirm no non-GFX/PSP-protected aperture is whitelisted. Static intent = GFX.)
## Net
The reachable software attack surface (TA copies/indexed-writes/state, ASD 49
cmds, SYS_DRV copies + register programming + register-list, sOS RPC gate) is now
comprehensively audited. The headline confirmed bug remains the ASD 0x308 gate
fail-open (unauthenticated OOB, DoS). No new memory-corruption-to-RCE primitive.
Remaining frontiers (crypto-service internals; boot-chain signature/parse) need
different tooling (PSP RAM read / fault injection), not more host-side static+fuzz.
================================================================================
## Register-list whitelist — deep dive (answers: matches expectation? influenceable?)
WHITELIST TABLE = dword_E26270 (== off_E17854 == off_E13F44), in the SYS_DRV
image's .data. sub_E177FC checks (reg>>12)&0x3FF against per-GFX-instance fields.
instance 0 allowed apertures: 186(0xBA), 368(0x170), 384(0x180), range 390-393.
static init bytes: [1,3,4,5,6,7,8,9,11,15,16,18,34,35,36,37,40,41,45,46,49,70,
79,80,88,108,128,181,182,186,187,188,189,190,191,255,259,...]
=> a CURATED, restrictive per-instance list of GFX register segments (not "all GFX").
INFLUENCEABLE? NO (verified):
* Scanned ALL of SYS_DRV for stores through =dword_E26270 -> ZERO writes.
The table is read-only .data in the signed image; no code (let alone host
data) ever writes it.
* sub_E13C48 (reached from ring dispatcher via a1+14) selects WHICH fixed subset
of these static apertures to apply, based on host mode v7=*a1 -- but the
aperture VALUES are hardcoded constants / this static table, never host-supplied.
* Changing the whitelist requires modifying signed SYS_DRV (blocked by
signature/anti-rollback).
CONCLUSION: ring cmd 4214 register-list apply is confined to a fixed, curated set
of GFX register segments (host already controls these via MMIO); the whitelist is
NOT host-influenceable. Intended GPU-bringup mechanism, not an arbitrary-MMIO bug.
Caveat: values read from the file-based ELF; a runtime dump of 0xe26270 would
reconfirm, but the 0-writes result + sane static contents make static config certain.
================================================================================
## RCE target located: the ASD callback vtable @0xd42890 (DTM-reachable call)
DTM cmd 2 -> ASD 0x100 (sub_D1061C) does:
v13 = *(fptr)(dword_D115E0 + 6152); // dword_D115E0 = 0xd42890 -> slot 0xd44098
if (v13) result = v13(v6); // CALLS the vtable slot
More vtable calls in sub_D113A0: (0xd42890+6236)/(+6256)/(+6268)/(+6152) all
invoked on DTM/ASD-reachable paths. So the ASD callback vtable @0xd42890 is a
genuine, host-reachable indirect-call table = the ideal RCE target.
WHY IT'S STILL BLOCKED (precise gap):
* Installed with FIXED per-ASIC handlers (0 direct stores; register-offset
installer via ASD cmd 0x02 -> sub_D0D2AC). NOT host-controlled -> no
install-a-callback RCE.
* No write primitive reaches it. The only OOB write (ASD 0x308) writes forward
from byte_D1F038 (0xd1f038) and stops at 0xd2f038 (its source read faults at
the ASD stack top 0xd5b000, a1' max ~0x10000). The vtable at 0xd42890 is
~0x13858 (~78 KB) BEYOND that stop. Controlled content only reaches 0xd20438
(first 5120 B); that region is the pointer-free receiver buffer.
## Net (deepest characterization)
RCE on ASD reduces to: a write primitive that reaches [0xd42890, ~0xd44100] with
a controlled value. None exists on the reachable surface -- the 0x308 OOB (the
only OOB write) falls ~78 KB short, and the vtable install is fixed-handler. This
is the exact ceiling: target identified (DTM->ASD vtable call), gap quantified.
Closing it needs either a longer-reach / different-base write primitive (not
found) or influencing the fixed vtable install (signature/asic-gated).
|