<feed xmlns='http://www.w3.org/2005/Atom'>
<title>amd-psp-re.git/hw/fence_write.py, branch main</title>
<subtitle>AMD PSP reverse engineering, emulator and vulnerability research</subtitle>
<id>https://git.sl0p.foo/amd-psp-re.git/atom/hw/fence_write.py?h=main</id>
<link rel='self' href='https://git.sl0p.foo/amd-psp-re.git/atom/hw/fence_write.py?h=main'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/amd-psp-re.git/'/>
<updated>2026-09-30T01:37:47Z</updated>
<entry>
<title>finding: the ring frame's fence address is not range-checked, unlike the command buffer</title>
<updated>2026-09-30T01:37:47Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-09-30T01:37:47Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/amd-psp-re.git/commit/?id=4d71df943745eb7a1d4f6bd63099198ceae6f431'/>
<id>urn:sha1:4d71df943745eb7a1d4f6bd63099198ceae6f431</id>
<content type='text'>
Every other test in this audit varied command content, but the ring frame itself is
equally host-controlled and carries both an address the processor writes to and the value
it writes there. The command buffer address is range-checked against the trusted region;
this destination never was.

Confirmed on hardware: the processor writes a host-chosen value to a host-chosen address;
a destination inside the trusted region is accepted and the command completes with the
processor healthy, where the equivalent command-buffer address is rejected; and a null
destination completes the command but freezes the heartbeat and wedges the card, a sixth
trigger of the known class needing a power cycle.

Corruption is explicitly not demonstrated. Host reads of the trusted region return all
ones so read-back cannot settle it, and a dense functional test of sixteen thousand
host-chosen values at sixty-four byte granularity across the whole first megabyte, where a
loaded application image lives, leaves that application's behaviour identical. The likely
explanation is that the write is subject to the same hardware protection, so the missing
software check is covered. A first sparse attempt of three hundred values over nineteen
megabytes is recorded as discarded for being too thin to support any conclusion.

This is therefore recorded as a defence-in-depth gap rather than an exercisable primitive,
with fixes to range-check the destination and to reject a null one with a status.
</content>
</entry>
</feed>
