269 lines
12 KiB
Markdown
269 lines
12 KiB
Markdown
# Teste YouTube → Y2JB → Relapse (2026-10-02)
|
||
|
||
Resultado: Y2JB e Relapse completaram o arranque em PS5 Pro firmware 13.20; o
|
||
ELF loader na porta TCP 9021 ficou acessível. O teste não mede estabilidade
|
||
prolongada nem segurança ao fechar a app neste firmware.
|
||
|
||
## Ambiente
|
||
|
||
- PS5 Pro: `192.168.40.14`, firmware 13.20.
|
||
- Servidor: `net-utils01`, `192.168.20.30`.
|
||
- DNS normal: gateway local restritivo neste repositório.
|
||
- Conta de teste: `PLAYER1`, utilizador local slot 2, separada da conta PSN pessoal.
|
||
- Não houve alterações ao submódulo ou ao runtime Docker.
|
||
|
||
## Ativação offline
|
||
|
||
ActRemoteLink identificou o slot 2 como utilizador atual, com account ID zero,
|
||
tipo vazio e flags `0x10000`. Com autorização explícita, foi executado `SETID`
|
||
apenas no slot 2, com ID fictício, tipo `np`, flags `0x1002` e Remote Play
|
||
ativado para o utilizador e globalmente. Retornos de escrita e releitura foram
|
||
zero/sucesso. O ID não foi associado à conta PSN pessoal.
|
||
|
||
Não foi executado fake sign-in. A revisão do código mostrou escritas de estado
|
||
de registo base para além das chaves por slot; não ficou provado que o efeito
|
||
fosse isolado da conta principal. Y2JB arrancou sem fake sign-in. Remote Play
|
||
está habilitado no registo, mas não foi emparelhado nem testado. O agente de
|
||
controlo foi terminado com `QUIT`.
|
||
|
||
## PKG YouTube e localização do ficheiro
|
||
|
||
O PKG analisado em Linux foi
|
||
`YouTube.app.PPSA01652.version.EUR.01.000.030.pkg`. Strings de metadados
|
||
confirmaram:
|
||
|
||
```text
|
||
Title ID: PPSA01652
|
||
Content ID: JA0004-PPSA01652_00-YOUTUBESIEJA0000
|
||
ContentVersion: 01.000.030
|
||
```
|
||
|
||
Apesar de `EUR` no nome, o prefixo do Content ID é `JA`; não inferir a região
|
||
apenas pelo nome. O ecrã Informações da PS5 confirmou versão `1.000.030`. Não
|
||
foi feito hash do PKG instalado nem comprovada a sua proveniência Sony.
|
||
|
||
O Y2JB 1.6 foi primeiro colocado em `/user/download/PPSA01650/`, diretório
|
||
incorreto para este Title ID. Surgiu um loop de avisos PSN/DNS (`NW-102312-9`).
|
||
Trocar temporariamente o DNS primário para `127.0.0.2`, sem secundário, mudou
|
||
o erro para `NW-102249-8`, mas o loop permaneceu. O DNS local foi reposto; a
|
||
consola nunca foi ligada à PSN para este diagnóstico.
|
||
|
||
Depois de confirmar o suporte a Title IDs regionais no autoloader upstream,
|
||
foi corrigido para `/user/download/PPSA01652/download0.dat`. Esse diretório
|
||
já continha um ficheiro diferente; foi preservado antes da cópia:
|
||
|
||
```text
|
||
/user/download/PPSA01652/download0.dat.before-y2jb-20261002T150112Z
|
||
SHA-256: dc553ea85aab9da884316c0fe9bb222da3e8d384ddf2c1fd119779b11c8a79c1
|
||
```
|
||
|
||
O ficheiro final tinha 336789504 bytes. A cópia de origem e a releitura FTP
|
||
no destino coincidiram com SHA-256
|
||
`946fb64427d340a1a302d260e0cc448b50fe15cfcff8ea167a0d33d3aa76f39d`.
|
||
O ficheiro em PPSA01650 ficou intacto. Não apagar a cópia de segurança sem
|
||
autorização. Como o caminho e o ficheiro anterior diferiam, não foi isolado
|
||
qual alteração resolveu o loop.
|
||
|
||
Depois de reinício normal, sem executar o exploit do Manual no mesmo boot,
|
||
YouTube mostrou Y2JB 1.6, FW 13.20, Title ID PPSA01652, AppVer 01.000.030,
|
||
popups desativados e Remote JS Loader em `192.168.40.14:50000`.
|
||
|
||
## Relapse
|
||
|
||
Release edisnord v1.0.0, asset `relapse.js`, 261458 bytes, SHA-256
|
||
`f85129b861f43a19f6810be5182aecdcf82a25e59ee5fbcd0604e4a4e2a40d69`.
|
||
O digest correspondeu ao publicado na release. O binário/script foi enviado
|
||
uma vez à porta 50000, depois de confirmada a ligação. Uma sondagem TCP anterior
|
||
sem conteúdo gerou `No valid data received`, esperado para uma ligação vazia.
|
||
|
||
Saída do teste confirmou offsets FW 13.20, self-test de workers, kernel
|
||
read/write, privilégios prontos, kexp de 18912 bytes com retorno zero,
|
||
descritores eboot restaurados e ambos os buffers reais dos pipes restaurados
|
||
com 10/10 escritas verificadas. O teardown terminou, apareceu `relapse complete`
|
||
e o ELF loader ficou à escuta na 9021. Uma sondagem TCP posterior à porta 9021
|
||
teve sucesso. O utilizador enviou foto que confirma `Executed successfully` e
|
||
`Awaiting connection` na porta JS.
|
||
|
||
Depois de o utilizador fechar YouTube, uma sondagem TCP sem payload confirmou que
|
||
a consola permaneceu acessível e o ELF loader continuou ativo na porta 9021. Não
|
||
foi observado crash imediato durante este fecho controlado em 13.20.
|
||
|
||
O payload deixa OIDs de sysctl alterados até reboot; `kern.smp.cpus` devolve um
|
||
endereço de kernel em vez do número de CPUs. O texto do payload indica que a app
|
||
pode fechar com os pipes restaurados, mas essa segurança foi medida upstream em
|
||
12.60. Este teste acrescenta apenas ausência de crash imediato e persistência da
|
||
9021 após um fecho em 13.20; não demonstra estabilidade prolongada. Não executar
|
||
outro exploit de kernel nesta sessão. Reiniciar normalmente antes de repetir.
|
||
|
||
## Cadeia homebrew após fechar YouTube
|
||
|
||
Com a porta 9021 ainda acessível, foram descarregados novamente e verificados os
|
||
artefactos registados abaixo. O envio ocorreu na ordem requerida:
|
||
|
||
1. kstuff-lite v1.11;
|
||
2. confirmação de `app.db` patching e patch SceShellUI Trophy bem-sucedido;
|
||
3. espera superior a quatro segundos;
|
||
4. ShadowMountPlus 1.7beta3.
|
||
|
||
ShadowMountPlus identificou FW 13.20 e confirmou controlo runtime KStuff, hooks
|
||
SceShellCore, watcher de ciclo de vida, quatro flags de sistema monitorizadas,
|
||
localização `pt-PT`, leitura de 58 títulos em `app.db`, biblioteca sincronizada
|
||
com zero jogos e API HTTP/JSON em `127.0.0.1:10101`. A configuração observada
|
||
manteve mounts read-only, force/persistent desativados e atualização AMPR
|
||
automática desativada. Foi criado `/data/.kstuff_noautomount` pela cadeia.
|
||
|
||
O teste demonstra o arranque KStuff → ShadowMountPlus a partir do loader obtido
|
||
por YouTube/Y2JB/Relapse. Não montou jogos ou imagens e não testou API, gameplay,
|
||
suspend/resume, shutdown, reboot ou estabilidade prolongada. As cópias em
|
||
`/var/tmp` foram removidas depois do envio.
|
||
|
||
## Artefactos verificados
|
||
|
||
| Ficheiro | Origem/versão | SHA-256 |
|
||
| --- | --- | --- |
|
||
| `actremotelink_agent.elf` | commit `e61a46eed4832ae563b65810685401ddadee2f9b` | `201ba90445e1ca1210237318f106724de238a2c629e16a0f190096319d263c4f` |
|
||
| `pkg-manager_v1.4.1.elf` | itsPLK v1.4.1 | `09adaff13b858bb3db519faaea673ee3fa67298081e608d32f6501ed6e9f706e` |
|
||
| `ftpsrv-ps5.elf` | v0.21.1 | `7d4b31c83eae4e056580482a3a074e1db25922efc74ac1e439473b45d71a5938` |
|
||
| `Y2JB_download0_1.6.zip` | Gezine 1.6 | `d032954033c17acda47c41179a22fa09016ddd40a274f4e9afbb051e5d08d3bd` |
|
||
| `download0.dat` | extraído do ZIP | `946fb64427d340a1a302d260e0cc448b50fe15cfcff8ea167a0d33d3aa76f39d` |
|
||
| `relapse.js` | edisnord v1.0.0 | `f85129b861f43a19f6810be5182aecdcf82a25e59ee5fbcd0604e4a4e2a40d69` |
|
||
|
||
Hash confirma identidade/integridade face à fonte indicada, não segurança
|
||
intrínseca. Não foi provado build reproduzível do agente nem reconstruído o JS
|
||
byte a byte nesta sessão.
|
||
|
||
## Rede e FTP
|
||
|
||
Regras foram limitadas a origem/destino nas VLANs, sem NAT, acima dos bloqueios:
|
||
|
||
| Origem → destino | TCP | Finalidade |
|
||
| --- | --- | --- |
|
||
| net-utils01 → PS5 | 9021 | ELF loader, regra habitual |
|
||
| net-utils01 → PS5 | 31337 | ActRemoteLink temporário, sem autenticação |
|
||
| net-utils01 → PS5 | 2121 | controlo FTP temporário |
|
||
| net-utils01 → PS5 | 49152–65535 | dados FTP passivos temporários |
|
||
| PS5 → net-utils01 | 20212 | tentativa FTP ativo; obsoleta |
|
||
| net-utils01 → PS5 | 50000 | loader JavaScript deste arranque |
|
||
| net-utils01 → PS5 | 8844, 18842 | PKG Manager e Direct Install |
|
||
|
||
ftpsrv v0.21.1 em modo ativo aceitou `PORT`, mas falhou com `550 Bad file
|
||
descriptor`; revisão do código encontrou socket fechado antes de connect.
|
||
Modo passivo foi funcional e cada porta anunciada foi validada no intervalo
|
||
aberto. FTP foi encerrado com `KILL`. Desativar regras temporárias 31337, 2121,
|
||
49152–65535, 20212 e 50000 quando já não necessárias; o estado final do pfSense
|
||
não foi verificado remotamente.
|
||
|
||
## Memória do net-utils01
|
||
|
||
O host tem aproximadamente 1.9 GiB RAM, sem swap; `/tmp` é tmpfs. Guardar ZIP
|
||
mais ficheiro extraído (cerca de 622 MiB) causou pressão severa de memória,
|
||
SSH sem banner e HTTP sem resposta. PSI `memory full` chegou a ~54%. Apagar os
|
||
dois downloads recuperou SSH. Não foi observado OOM kill confirmado.
|
||
|
||
Os testes seguintes usaram `/var/tmp`, verificado em ext4 `/dev/sda1`, com ~70
|
||
GiB disponíveis. Antes de staging grande, verificar:
|
||
|
||
```sh
|
||
findmnt -T /var/tmp
|
||
df -h /var/tmp
|
||
free -h
|
||
```
|
||
|
||
Não limpar `/tmp` indiscriminadamente: diretórios privados de serviços systemd
|
||
foram preservados. Os ficheiros exatos dos testes foram removidos após uso.
|
||
|
||
## Pendentes
|
||
|
||
- Montagem read-only de uma imagem conhecida e teste de gameplay/lifecycle.
|
||
- Suspend/resume, shutdown e reboot com a cadeia ativa.
|
||
- Teste Remote Play, após rever uma forma de fake sign-in que não afete slot 1.
|
||
- Autoloader itsPLK v0.9.1 não tem kernel exploit para 13.20. v1.0.0-dev
|
||
integra Relapse 10.20–13.60 mas é experimental, não instalado; rever hash,
|
||
cadeia automática e elfldr loopback-only antes de o testar.
|
||
- PKG Manager corre em memória (8844 UI, 18842 Direct Install) e precisa de
|
||
reenvio depois de reboot. A UI respondeu HTTP 200 antes do reboot deste teste.
|
||
|
||
## Integração proposta: Y2JB Autoloader e Payload Manager
|
||
|
||
O desenho preferido mantém responsabilidades separadas:
|
||
|
||
```text
|
||
YouTube
|
||
→ Y2JB Autoloader
|
||
→ Relapse para FW 13.20
|
||
→ ELF loader TCP 9021
|
||
→ Payload Manager no net-utils01
|
||
→ kstuff-lite
|
||
→ espera e confirmação
|
||
→ ShadowMountPlus
|
||
```
|
||
|
||
O Y2JB Autoloader fica responsável apenas pelo exploit userland, seleção do
|
||
exploit de kernel, execução do Relapse e arranque do ELF loader. O Payload
|
||
Manager externo continua responsável pelo catálogo, fontes, releases, versões,
|
||
compatibilidade, downloads, tamanho, SHA-256, dependências, ordem, envio e logs.
|
||
KStuff e ShadowMountPlus não devem ser colocados no `autoload.txt` quando esta
|
||
arquitetura estiver ativa, porque isso contornaria a política e os registos do
|
||
manager.
|
||
|
||
### Loader loopback e acesso externo
|
||
|
||
O autoloader usa por defeito um ELF loader que aceita ligações apenas da própria
|
||
PS5. Essa opção é segura para payloads carregados internamente, mas impede o
|
||
manager em `192.168.20.30` de enviar para `192.168.40.14:9021`. A integração
|
||
externa exige uma variante revista do loader que escute na interface LAN. A
|
||
proteção passa então a depender da firewall existente, limitada a:
|
||
|
||
```text
|
||
192.168.20.30 → 192.168.40.14 TCP 9021
|
||
```
|
||
|
||
Nenhum outro host deve alcançar essa porta. Antes de adotar a variante LAN,
|
||
confirmar o binário, o hash, o bind efetivo e o comportamento após fechar
|
||
YouTube. Não iniciar dois ELF loaders concorrentes nem reenviar Relapse no mesmo
|
||
boot.
|
||
|
||
### Perfil de execução no manager
|
||
|
||
O perfil inicial deve representar explicitamente a cadeia validada:
|
||
|
||
```text
|
||
1. kstuff-lite v1.11
|
||
2. aguardar confirmação de arranque
|
||
3. esperar no mínimo 4000 ms
|
||
4. ShadowMountPlus 1.7beta3
|
||
```
|
||
|
||
O manager deve rejeitar qualquer artefacto cujo tamanho ou SHA-256 não coincida
|
||
com o registo aprovado. `enabled` e `favorite` são preferências do utilizador e
|
||
ficam separados da evidência imutável da fonte. ShadowMountPlus declara KStuff
|
||
como dependência e não pode ser enviado se a etapa anterior não tiver confirmação.
|
||
|
||
### Estado da consola e sessões
|
||
|
||
Uma porta 9021 aberta prova apenas que existe um listener. A primeira versão do
|
||
manager deve combinar o output recebido no envio, padrões de sucesso conhecidos
|
||
e confirmação manual quando não existir uma API de estado fiável. Estados úteis:
|
||
|
||
```text
|
||
offline
|
||
loader-disponivel
|
||
kstuff-confirmado
|
||
shadowmount-confirmado
|
||
cadeia-concluida
|
||
estado-desconhecido
|
||
```
|
||
|
||
O estado runtime deve pertencer a uma sessão/boot da consola. Depois de reboot,
|
||
perda de ligação ou resultado ambíguo, o manager limpa as afirmações de payloads
|
||
ativos e volta a `estado-desconhecido` ou `offline`. Histórico e evidência de
|
||
execuções permanecem, mas não servem como prova do boot atual.
|
||
|
||
Cada tentativa deve guardar timestamp, consola, firmware, payload, versão,
|
||
digest, origem final do download, resultado e operador. Não guardar credenciais
|
||
nos logs. O manager deve apresentar claramente que o autoloader v1.0.0-dev é
|
||
experimental e que o fluxo manual documentado continua a ser a referência de
|
||
comparação para o primeiro teste A/B.
|
||
|
||
Este registo é documental; não exigiu rebuild nem deployment do runtime Docker.
|