2.6 KiB
Phase 1.0B linker and W^X analysis
SDK baseline
PS5 Payload SDK v0.41 ldscripts/elf_x86_64.x:20-25 emits three load
segments but deliberately marks text 0x7 (RWE), rodata 0x6 (RW) and data
0x6 (RW). The Phase-1.0A software ELF consequently has a permanent RWE
text segment.
Loader evidence
Both public elfldr 699e8bcff03e91e8d6ca6eba281af25c5a58d8c2
and hardened elfldr 197623058f509eddde18868dafcb92fdcac66464:
- enumerate every
PT_LOAD; - initially reserve one RW image mapping;
- copy all segments and apply
R_X86_64_RELATIVErelocations in the host mirror; - copy the completed image to the child;
- translate every
p_flagsbit throughPFLAGS; - use
kernel_mprotectfor executable segments andpt_mprotectotherwise.
Relevant hardened source is elfldr.c:54-56,144-263. This supports multiple
load segments and a temporary relocation-write phase followed by final
per-segment protection.
Smoke layout
The smoke-only pkg/ps5/elf_x86_64_smoke_wx.x preserves the SDK symbols and
0x4000 page alignment while arranging:
.textand.plt: RX;- unwind tables and constant
.rodata: R; - dynamic symbol/hash/string/relocation tables,
.data.rel.ro, GOT, init/fini arrays,.dynamic,.dataand.bss: RW.
Runtime-relocated GOT and related metadata deliberately remain writable.
The final program-header audit must show no segment with both W and E. All
R_X86_64_RELATIVE destinations must lie in RW load ranges. The primary
candidate is accepted only if both checks pass twice byte-identically.
RELRO and self-modification
The pinned SDK/loader contract does not implement a post-CRT RELRO transition. Marking the GOT read-only before SDK runtime linking would be unsafe, so no RELRO claim is made. No self-modifying RetroArch/smokecore code, JIT or dynamic core loader is enabled or reachable. No production elfldr code was changed.
Residual risk
W^X is statically established, but the exact protected layout has not run on firmware 9.60. Loader protection errors, an SDK runtime write to an unexpected R-only section, or firmware-specific mapping behavior could end the child/session. No persistent installation effect follows from the artifact design, but that claim also remains unobserved.
The SDK CRT's statically linked runtime loader is present independently of
RetroArch's feature set and may conditionally load libSceSysmodule.
The final import list has no module-loader symbol, but absent imports alone
are not used as proof that startup has no module effects; the CRT source and
startup disassembly are the controlling evidence.