D360 - .bss markers that name themselves, and what they found

decided ยท 2026-08-29

D359 established that both payloads depend on .bss they were never given - a constant fill changes the fault completely. It could not say which global, and "an unknown number of globals" was the reason that route looked worse than working out the handoff structure.

So the fill carries markers instead: each eight-byte slot holds the fill byte in its top byte and its own address in the rest. A guest that loads a global and uses it as an address then faults on a value that reads back as bss+offset, and one boot names it.

It has not fired, and the honest report is that

Neither payload calls an uninitialised global. Both read .bss and derive something else - the fault is read of 0xffffffffffffffff, and a constant fill produces the identical one, so the markers added no evidence here.

What they did narrow is where. Both land at the same place:

klogsrv  image+0x28fc   klog_printf +300
ftpsrv   image+0x819c   klog_printf +300

Same function, same offset, two different programs. So the dependency is in the SDK's shared logging helper rather than in either payload - which is consistent with everything else here pointing at the runtime rather than at the servers.

klog_printf needing something __crt_start sets up is a coherent story and is not established: the mechanism between a filled .bss and a dereference of -1 was not determined, and working it out needs the payload's own code.

Why the mechanism is tested even though no guest tripped it

A marker that never fires and a marker that is wrong look identical from a run. The unit test decodes each slot back to the address it occupies, which is the difference between a mechanism that is right and one that is merely present - the same reason every other guard here has a negative test.

A test that broke two others

The first version set the fill byte through the cache bss_byte reads once. Tests share a process, so it changed what every other test in the binary saw and broke the one asserting .bss is zeroed. The byte is a parameter now.

Third time this hazard has appeared - after the orbistoun-abi shared array and the fixed-address collisions of D324 - and the fix is the same each time: pass the thing rather than reaching for it.