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

12 KiB
Raw Blame History

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:

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:

/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:

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:

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:

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:

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:

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.