aboutsummaryrefslogtreecommitdiffstats
path: root/data (follow)
Commit message (Collapse)AuthorAge
* record the lead connecting the rollback gap to the confirmed underflowuser2026-09-30
| | | | | | | | | | | | | | | | | | | | Two results now sit side by side: a mechanically verified count underflow that is not reachable in the shipping build because its front half needs a larger payload than any application delivers, and the absence of version enforcement, which lets an attacker choose which build runs. Unreachability is a property of one build's gates, so the question becomes precise: in either older build, is the front half open? If it is, rollback plus the existing defect is an exercisable primitive rather than a documented but unreachable one. Both older bodies are plaintext by entropy so they are directly analyzable, and both are committed with hashes in the manifest. It is recorded as a lead rather than a result, with caveats stated: the defect shape exists in every build so the back half is only presumably open and must be confirmed per image, a string diff shows no added error messages so there is no cheap signal that a bounds fix landed in the window, and each detector must rediscover a known defect in that specific image before any negative from it is trusted.
* fw: fix the opcode rule (req[0] = store at [SP]); AUC/FP/XGMI reach was ↵user2026-09-29
| | | | | | | | | | | | | | | | | | | | | | | | misread as empty The opcode recovery was taking the first stack store in each thunk, which is a neighbouring field rather than req[0]. XGMI stores 2 to var_78 before storing the real opcode 0x1067 to var_7C, so every XGMI, AUC and FP opcode came out as 0x2 and their privilege reach looked empty. The rule is now the immediate stored at [SP], the store whose var_ offset equals the frame size. Re-ran all twelve TAs. AUC and FP each reach twelve SYS_DRV opcodes, XGMI thirteen including the 0x104x and 0x106x families, OC ten. GCP's ASD set is unchanged, so the 0x202 finding is unaffected. That also retracts my own claim from two commits ago that AUC, FP and XGMI use a different kernel ABI whose reach is not enumerable. They use the same svc 0xF2 ABI; my rule was misreading it. The SVC 0xF3 stub is real but is a lazy import resolver -- XGMI's sub_403CA0 caches a resolved pointer in a global and tail-calls it, and its callers build an ordinary request struct with the opcode at offset 0 -- so it is another route to the same service RPC rather than a separate privilege channel. This supersedes both earlier SVC tables in the document.
* fw: verify annotation state in all twelve IDBs; record the TMZ reopen hanguser2026-09-29
| | | | | | | | | | | | | | | | | | | | Reopened every database and read back what is actually stored rather than trusting the write reports: note lines, renamed command handlers, renamed RPC thunks and entry points for all twelve TAs. Distinct handler counts are lower than command-id counts wherever ids share a handler, as with RAP's seven ids funnelling into one and OPM's 6 and 7 sharing one through a goto. Noted that multi-line function comments are stored fine and only the listing view renders the first line inline, while pseudocode shows all; checking the listing alone briefly looked like truncation. Also recorded the operational cause of a real failure: tmz spawned once and then failed on every later attempt, with the pane present in the registry but absent from slosh and readiness never arriving. TMZ is the stub with no real entry function, and idatui documents that such a binary can land in the symbol palette on startup, so the saved database restores that modal and the readiness probe never completes. Deleting the .i64 and reopening works immediately. Worth recording because the symptom looks like a spawn bug rather than restored state.
* fw: harvest all 53 Windows driver versions -- 110 new firmware images, 17 TA ↵user2026-09-29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | types Ran the download/extract/carve/delete loop over every Adrenalin package for this card, 22.12.1 through 26.7.1, 53 of 53 processed with no failures. Recording a silent failure mode that nearly cost 30 packages: the first run reported "NO amdkmdag.sys" for every version from 23.7.1 onward. The cause is that 22.x-23.5.x are NSIS self-extractors while 23.7.1 and later are PE32+ 7-Zip SFX with the archive embedded around 0x1b3e00, and 7z -tnsis exits cleanly while extracting nothing from those. The harvester now tries both formats and retries versions previously recorded as failed. Dedup needed correcting too. The Windows sys_drv 0.49.0.51 differs from the linux-firmware build of the same version in exactly 256 contiguous bytes at the end of the body, which is the RSA-2048 signature -- identical code, different signature, as expected for randomised PSS. Counting on content excluding that trailing block gives 114 distinct contents from 117 Windows files, 4 overlapping the existing corpus, so 110 genuinely new firmware images rather than the naive count. Two groups inside the Windows set differ only by signature, including three copies of RAS 27.0.0.22, so AMD ships the same image re-signed; that is a useful data point for the rollback finding since multiple valid signatures exist over identical content. The corpus now spans 17 component types and 142 unique bodies, including CSU and OC which only appear in later drivers, so the TA inventory grows across the train. Also corrects the apu tag decode from the first pass, which was byte-reversed: the tags are NV31, NV33, NV24 and MI20. Seven sys_drv builds carry NV31, our exact silicon, and six of them are versions linux-firmware never shipped (0.49.0.35/.38/.40/.42/.46/.53), interleaving with the Linux set to give a near-contiguous .35 to .54 range for version diffing. No sOS images appear in Windows packages. Bodies, full signed containers, per-driver records and manifest hashes are all stashed.
* Hash the new firmware blobs into the manifestuser2026-09-28
| | | | | The DMUB images (including the historical 7.0.38/7.0.42 pair used to prove rollback) and the gfx11 MES/PFP/ME blobs, verified with sha256sum -c.
* Initial import: AMD PSP reverse engineering, emulator and vulnerability researchPeter Geissler2026-09-22
Split out of a tinygrad working tree, where all of this lived untracked. tinygrad remains a dependency for hardware-facing scripts only. Contents: psp_emu/ Unicorn-based PSP emulator that boots the real signed firmware from the ARM reset vector: sOS -> SYS_DRV -> HDCP/DTM/RAS TAs, with a CCP crypto device model faithful enough to run the firmware's own drivers (RSA-PSS/SHA-256 container verification passes 5/5 with 5/5 negatives rejected). A simulated host drives the real mailbox/ring path through to TA_InvokeCommandEntryPoint. psp_out/ Static analysis: six PSP modules fully named (asd 1562, sys_drv 1141, sos 527, ras 119, hdcp 109, dtm 14) plus SMU 1033, a cross-version diffing pipeline over 34+ builds, per-handler annotated analysis and ~125 findings documents. Deliberately not tracked: AMD firmware images, the Hex-Rays decompilation derived from them, and IDA databases. data/MANIFEST.sha256 pins the SHA-256 of all 301 blobs results were derived from, so findings remain traceable to their inputs without redistributing AMD code. 6 MB tracked instead of 315 MB. Verified from the new location: test_smoke 5/5, ccp_selftest 11/11, verify_real_image 5/5 + 5/5 negatives, fuzz_ta_invoke controls passing and host-driven TA invoke working (0.73s per invoke).