8.0 KiB
Kernelwrite proof matrix
Statuses mean: SAFE is proven only for the named scope, UNSAFE has a proven
policy violation, and UNPROVEN lacks necessary primary evidence. Absence of
an import is never used as the sole proof because SDK code is statically
combined in crt1.o.
| Component or behavior | Source | Linked in stock crt1.o |
Reachable from stock _start |
Status | Basis |
|---|---|---|---|---|---|
payload_args_t order/offsets |
public header + disassembly | yes | yes | SAFE |
six x86-64 fields; payloadout at 0x28 |
| stock SDK startup | crt/crt.c |
yes | yes | UNSAFE |
invokes patch and rtld paths |
__patch_init |
crt/patch.c |
yes | yes | UNSAFE |
relocation and callgraph edge from _start |
kernel_copyin/out |
crt/kernel.c |
yes | yes | UNSAFE |
reachable read/write transport |
kernel_set_ucred_caps |
crt/kernel.c |
yes | yes | UNSAFE |
reaches kernel_copyin |
kernel_set_ucred_attrs |
crt/kernel.c |
yes | yes | UNSAFE |
reaches kernel_copyin |
| syscall address lower/upper bounds | crt/patch.c |
yes | yes | UNSAFE |
writes offsets 0xf0 and 0xf8 |
| JIT capability change | crt/patch.c |
yes | yes | UNSAFE |
`caps[15] |
| ptrace attribute change | crt/patch.c |
yes | yes | UNSAFE |
`attrs[3] |
| runtime symbol discovery | syscall.c, crt.c, rtld |
yes | yes | UNSAFE for minimal profile |
multiple reachable dynamic resolutions |
__dlopen/__dlsym facade |
rtld_dlfcn.c |
yes | no static startup edge | UNSAFE linked capability |
absence from imports is not absence from bytes |
| Sce module load/start | rtld_sprx.c |
yes | yes | UNSAFE |
__rtld_sprx_init reaches function-pointer call |
| Sce module stop/unload | rtld_sprx.c |
yes | cleanup-dependent | UNPROVEN cleanup |
no guarantee after crash or partial init |
SO mapping/mprotect |
rtld_so.c |
yes | path-dependent | UNSAFE linked capability |
forbidden for minimal profile |
| socket-overlap helper | kernel.c |
yes | no static startup edge | UNSAFE linked capability |
still present in monolithic startup object |
| new network initialization | driver adds libSceNet |
dependency present in stock links | module-init internals unknown | UNPROVEN |
no caller/module initialization contract |
| GNM calls | no Phase-0.5 candidate source | no candidate | no candidate | SAFE source scope only |
no custom source or artifact created |
| VideoOut calls | no Phase-0.5 candidate source | no candidate | no candidate | SAFE source scope only |
no custom source or artifact created |
| SDL calls | no Phase-0.5 candidate source | no candidate | no candidate | SAFE source scope only |
no custom source or artifact created |
| direct MMIO/register writes | audited project source | no candidate | no candidate | SAFE source scope only |
none added |
-nostartfiles -nodefaultlibs suppression |
compiler -### |
not linked in trace | n/a | SAFE driver fact |
no CRT or default library added |
| loader stack/return contract | exact caller absent | n/a | n/a | UNPROVEN |
callee cannot prove caller |
| pre-entry loader changes | exact caller absent | n/a | before entry | UNPROVEN |
incoming kernel access exists; origin unknown |
The full source hashes, stock-object hashes, relocation-table hash,
disassembly hash, all reachable edges, and linked-but-unreachable prohibited
functions are in manifests/runtime/phase-0.5-startup-audit.json.
Phase 0.6 controlled-runtime classification
The table above preserves the stricter Phase-0.5 "kernelwrite-free" question.
Phase 0.6 uses the user's corrected policy: a documented temporary runtime
write is not automatically unsafe. Only PERSISTENT_WRITE and
UNBOUNDED_OR_UNKNOWN are hard blockers.
| Component/effect | Classification | Review status | Basis |
|---|---|---|---|
| first-stage QA flag enable | EXPECTED_VOLATILE_RUNTIME_EFFECT |
SAFE only as exact-source classification |
loader bootstrap, before payload |
child creation with rfork_thread/execve |
PAYLOAD_PROCESS_LOCAL |
SAFE source fact |
separate SceSpZeroConf child |
| ptrace service authid, normal path | RESTORED_BY_LOADER |
SAFE success path |
authid backed up and restored |
| ptrace authid restore failure | UNBOUNDED_OR_UNKNOWN |
UNSAFE for controlled profile |
returns without a second restore |
pt_call/pt_syscall completion |
UNBOUNDED_OR_UNKNOWN |
UNSAFE |
no step or time bound |
| breakpoint byte | RESTORED_BY_LOADER |
SAFE source fact |
original byte copied back |
| breakpoint page RWX permission | PAYLOAD_PROCESS_LOCAL |
UNPROVEN cleanup |
permission not restored; relies on child exit |
| child root/jail/caps/authid | RESTORED_BY_LOADER on success |
UNPROVEN partial |
UID is not restored |
| payload mapping, argument page, sockets, pipe | UNBOUNDED_OR_UNKNOWN |
UNSAFE for controlled profile |
no success-path cleanup before detach |
SDK __patch_init |
PAYLOAD_PROCESS_LOCAL |
SAFE classification, not execution proof |
affects payload child; not an automatic blocker |
| SDK terminate branch | UNBOUNDED_OR_UNKNOWN |
UNSAFE for controlled profile |
return/exit/trap branch unresolved |
| detached payload runtime | UNBOUNDED_OR_UNKNOWN |
UNSAFE |
no two-second watchdog |
| child reaping | UNBOUNDED_OR_UNKNOWN |
UNSAFE |
SIGCHLD ignored; semantics undocumented |
| Manager load hash binding | UNBOUNDED_OR_UNKNOWN |
UNSAFE |
path streamed without SHA-256 check |
| Manager upload path | PERSISTENT_WRITE |
UNSAFE |
writes and commits under /data/pldmgr/payloads |
No source or binary evidence showed a GNM, VideoOut, SDL, direct MMIO, flash, firmware, savegame, database, or system-configuration write in the proposed payload path. Because no payload was built, that is a source-scope absence, not an execution claim.
Phase 0.7 hardened-runtime classification
The machine-readable counterpart is
manifests/runtime/phase-0.7-kernelwrite-proof-matrix.json.
| Component/effect | Phase-0.7 status | Classification | Evidence boundary |
|---|---|---|---|
| freestanding kernelwrite-free startup | UNPROVEN |
historical blocked target | exact safe return contract still absent |
stock SDK __patch_init |
UNSAFE for a kernelwrite-free claim |
PAYLOAD_PROCESS_LOCAL accepted effect |
source, linker map, disassembly, reachable callgraph |
| stock SDK rtld module loading | UNPROVEN runtime branch; bounded externally |
PAYLOAD_PROCESS_LOCAL accepted effect |
linked module start/stop symbols, SDK source, child watchdog |
| ptrace step completion | SAFE offline |
BOUNDED_WATCHDOG |
source, unit/fuzz tests, disassembly |
| five-field credential restoration | SAFE offline |
RESTORED_BY_LOADER |
source, failure injection tests, callgraph |
| restoration failure | SAFE fail-closed logic |
FAIL_CLOSED_TERMINATION |
child killed/reaped; service disables ptrace |
| breakpoint byte/page | SAFE offline |
RESTORED_BY_LOADER |
source and disassembly |
| payload child lifetime | SAFE offline |
BOUNDED_WATCHDOG |
2000 ms, SIGTERM, SIGKILL, reap |
| mapping/descriptor cleanup | SAFE offline |
OS_RECLAIMED_ON_EXIT plus tracked cleanup |
source, tests, callgraph |
| manager hash-to-stream binding | SAFE offline |
HASH_BOUND_SAME_FD |
source, TOCTOU and negative tests |
| receiver digest/denylist enforcement | SAFE offline |
fail-closed | source, tests, disassembly |
| controlled artifact-directory write | SAFE for reviewed deployment budget |
ALLOWED_APPLICATION_WRITE |
exclusive temp, fsync, verify, atomic rename |
| GNM/VideoOut/SDL/MMIO/firmware mutation | SAFE absence claim |
prohibited | source scan, imports, map, disassembly |
| firmware-9.60 runtime behavior | UNPROVEN |
no execution evidence | no PS5 action occurred |
| installation, transfer, execution | UNPROVEN and unauthorized |
action state false | manifests and offline audit |
The overall decision is
READY_FOR_HARDENED_RUNTIME_DEPLOYMENT, not PROVEN KERNELWRITE-FREE.
The known normal-CRT process-local write prevents the latter claim.