142 lines
7.6 KiB
Markdown
142 lines
7.6 KiB
Markdown
# Payload candidate evidence: kstuff-lite and ShadowMountPlus
|
|
|
|
Evidence date: 2026-10-02
|
|
|
|
This directory records a controlled intake and startup smoke test of two payload
|
|
candidates on a PS5 running firmware 13.20. The verified payloads were sent once,
|
|
in dependency order, from `net-utils01` to the console's ELF loader. No downloaded
|
|
binary is stored in this repository or left in the server's temporary directory.
|
|
|
|
The machine-readable handoff for a future payload-manager repository is
|
|
[`manifest-2026-10-02.v1.json`](manifest-2026-10-02.v1.json). It deliberately
|
|
imports both candidates as disabled and not favorited. Runtime success does not
|
|
implicitly enable a catalog entry. User state such as
|
|
active/inactive and favorite must be stored separately from source evidence.
|
|
|
|
## Selected releases
|
|
|
|
| Payload | Release and commit | Release asset | Size | SHA-256 |
|
|
| --- | --- | --- | ---: | --- |
|
|
| kstuff-lite | `v1.11`, `85fb88a526e58e357d6f1e626ce05af4acdb8b5d` | `kstuff.elf` | 1,737,080 | `ab9a6cb4d3b1daf139d4d646e402b1cf569071acd64599c936d7a3a6164dc779` |
|
|
| ShadowMountPlus | `1.7beta3`, `f0d15ffc46e9237d41cc3555b1cf11362d9a32e0` | `shadowmountplus.elf` | 2,437,848 | `2a7427e20ba7a70bd8cd01e47eb00ee7ca82db82dff3da7884f48f9c3fcbe95a` |
|
|
| ShadowMountPlus support bundle | `1.7beta3`, same commit | `ShadowMountPlus_1.7beta3.zip` | 1,352,255 | `2fb8edd89f2390a4a6a7b568ed9c5f34db01705781e0f3f386beb6612d29b6aa` |
|
|
|
|
The files were downloaded from the release URLs recorded in the manifest. Each
|
|
locally calculated digest matched the SHA-256 digest returned by GitHub's release
|
|
API. The ELF inside the ShadowMountPlus ZIP was also byte-for-byte identical to
|
|
the separately published `shadowmountplus.elf`.
|
|
|
|
## Static findings
|
|
|
|
Both payloads are stripped, dynamically linked, position-independent ELF64 x86-64
|
|
executables. Static inspection alone cannot establish that a privileged payload is
|
|
safe.
|
|
|
|
The kstuff-lite v1.11 release states support for firmware 1.00 through 13.60, which
|
|
includes the target firmware 13.20. ShadowMountPlus documents kstuff-lite v1.07 or
|
|
newer as a dependency, so the intended order is kstuff-lite first and
|
|
ShadowMountPlus second.
|
|
|
|
ShadowMountPlus contains HTTP, HTTPS and networking support. Its supplied default
|
|
configuration enables an HTTP API only on loopback `127.0.0.1:10101`; automatic
|
|
AMPR downloading is disabled; mounts are read-only; forced mounts and persistent
|
|
mounts are disabled. Do not change the API bind address to `0.0.0.0` without a
|
|
separate firewall and threat review. Upstream also warns that mounting images can
|
|
cause shutdown problems and data corruption.
|
|
|
|
## Provenance limitations
|
|
|
|
- GitHub release digests demonstrate that the downloaded bytes match the assets
|
|
currently registered by GitHub. They do not prove benign behavior.
|
|
- Neither release provides a detached signature, SBOM, or build attestation for
|
|
the ELF. Both referenced source commits are unsigned.
|
|
- kstuff-lite's CI downloads a toolchain through a mutable `releases/latest` URL.
|
|
- ShadowMountPlus's workflow checks out build dependencies without immutable
|
|
commit pins.
|
|
- This review did not reproduce either ELF from source. The relationship between
|
|
each binary and its source commit is therefore asserted by the publisher, not
|
|
independently proven by a reproducible build.
|
|
- A tag and its release assets can be moved or replaced upstream. The payload
|
|
manager must treat the recorded SHA-256 and size as authoritative and reject any
|
|
mismatch instead of silently accepting replacement bytes.
|
|
|
|
## Runtime smoke-test evidence
|
|
|
|
At `2026-10-02T12:42:02Z`, the two hash-verified ELFs were sent sequentially from
|
|
`net-utils01` (`192.168.20.30`) to the PS5 (`192.168.40.14`) over TCP 9021. The
|
|
Relapse page had already reached `elfldr is listening on port 9021`; no R2 action
|
|
was involved.
|
|
|
|
The observed sequence was:
|
|
|
|
1. `kstuff.elf` v1.11 connected successfully. Its output reported `app.db`
|
|
patching and a successful SceShellUI trophy `IsServerAvailable` patch.
|
|
2. After more than two seconds, `shadowmountplus.elf` 1.7beta3 connected
|
|
successfully. It detected firmware 13.20, reported kstuff runtime control ready,
|
|
installed its SceShellCore hooks, started the game lifecycle watcher, synchronized
|
|
the library with zero games found and started its API on loopback
|
|
`127.0.0.1:10101`.
|
|
|
|
The effective first-run defaults kept mounts read-only, forced and persistent
|
|
mounting disabled, automatic AMPR downloads disabled, and the API unavailable to
|
|
the LAN. The temporary copies of both ELFs were removed from `net-utils01` after
|
|
the send.
|
|
|
|
This is a startup smoke test only. No image was mounted, and suspend/resume,
|
|
shutdown, reboot, API actions, gameplay stability and automatic kstuff
|
|
pause/resume were not tested.
|
|
|
|
## Payload-manager import contract
|
|
|
|
The manager should:
|
|
|
|
1. import the versioned JSON manifest without executing or downloading anything;
|
|
2. keep catalog evidence separate from per-user `enabled` and `favorite` state;
|
|
3. fetch an artifact only on explicit request into a quarantine/cache directory;
|
|
4. require the exact byte size and SHA-256 before moving it into the usable cache;
|
|
5. reject redirects that end outside the expected GitHub release infrastructure,
|
|
or at minimum record and display the final origin;
|
|
6. never resolve a mutable `latest` URL for these pinned records;
|
|
7. enforce dependency and load order: kstuff-lite, confirmation, then
|
|
ShadowMountPlus;
|
|
8. record every send attempt with payload ID, version, digest, target, timestamp,
|
|
result and operator identity, without storing credentials in the log.
|
|
|
|
Release discovery may propose newer versions, but it must create a new candidate
|
|
record and require review. It must never overwrite the evidence for an already
|
|
approved digest.
|
|
|
|
For integration with Y2JB Autoloader, keep the manager as the executor of the
|
|
post-jailbreak chain. The autoloader should stop after Relapse and an externally
|
|
reachable, reviewed ELF loader are ready. Do not duplicate kstuff-lite or
|
|
ShadowMountPlus in `autoload.txt`, because their execution would bypass manager
|
|
hash checks, dependency handling and audit records. The default loopback-only
|
|
loader must be replaced or explicitly configured for the LAN integration; access
|
|
must remain restricted by firewall to `192.168.20.30 → 192.168.40.14:9021`.
|
|
|
|
The first manager profile should encode kstuff-lite, positive startup evidence,
|
|
at least 4000 ms delay, then ShadowMountPlus. An open port is not positive startup
|
|
evidence. Runtime state is valid only for the current console boot and must be
|
|
invalidated after reboot or ambiguous connectivity loss.
|
|
|
|
## Controlled runtime-test procedure
|
|
|
|
The current Relapse flow ends at `elfldr is listening on port 9021`; there is no R2
|
|
step. Use the following procedure for a repeat test only after explicit operator
|
|
approval:
|
|
|
|
1. confirm the PS5 is on firmware 13.20 and the ELF loader is visibly listening;
|
|
2. confirm the sender-to-PS5 firewall rule is limited to TCP 9021 on the LAN;
|
|
3. re-download and verify `kstuff.elf` against the recorded size and SHA-256;
|
|
4. send only kstuff-lite and record the console result before doing anything else;
|
|
5. confirm how the loader accepts the second payload and re-establish it if needed;
|
|
6. re-download and verify `shadowmountplus.elf`, then send it separately;
|
|
7. verify the on-console notification and `/data/shadowmount/debug.log`;
|
|
8. leave the API loopback-only and automatic downloads disabled for the first test;
|
|
9. avoid suspend, forced shutdown and writable mounts until the basic lifecycle has
|
|
been observed successfully.
|
|
|
|
A TCP connection probe is not a payload test. Do not infer runtime success from an
|
|
open port. Keep each execution as an independent runtime record rather than
|
|
overwriting this evidence.
|