Files
relapse-exploit-docker/docs/Y2JB_TEST_2026-10-02.md
T

269 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.