Unjail-ps5app-payload
Une charge utile persistante du démon PS5. Au lancement il s'élève, cache la racine du noyau vnode, et ouvre un auditeur TCP sur 127.0.0.1:9069. Pour chaque...
Choisir une liste...
déjail-ps5app-payload
Une charge utile persistante du démon PS5. Au lancement il s'élève, cache la racine du noyau vnode, et
ouvre un auditeur TCP sur127.0.0.1:9069. Pour chaque connexion acceptée il lit un fixe
Demande de 2576 octets, favorise le processus de l'appelant (crédences, capacités et système de fichiers)
voir), et renvoie le résultat dans une réponse de taille fixe. Le démon continue à courir jusqu'au
Reboots de console.
Quand l'envoyer
Envoyer cette charge utile une fois, avant de lancer une application homebrew qui a besoin de lire/écrire accès en dehors de son bac à sable par titre.
Le démon s'exécute à l'intérieur du processus hôte choisi par le chargeur. Seul cet hôte a
l'ensemble de justificatifs et le tuyau primitif qui lui permettent d'écrire un autre processus,
bitmasques de capacité, etfd_rdir/fd_jdirpointeurs, donc le démon est le seul chemin
un module d'application doit atteindre la vue étendue au moment de l'exécution.
Firmwares supportés
Le démon lit ses offsets du noyau à partir de la table per-firmware intégrée au CRT au démarrage. Couverture
Major de la racine-vnode offset de la racine
C'est le cas.
1.00 - 10.60.00 Vérifié. La startup complète, l'auditeur ouvre, les demandes de promotion réussissent.
11h00 et plusPayloadKernel.GetRootVnode()renvoie zéro, les journaux du démonunjail: rootvnode read failedet sort avec le code -1 avant que l'auditeur se lie. autres
Vérifié de bout en bout sur l'appareil: firmware 10.01. Sur tout autre majeur soutenu le démon exécute le même chemin de code; les décalages qui varient entre les majors résolvent à travers le CRT table sans reconstruction.
Le champ de structure compense les utilisations du démon par l'intermédiaire des accédeurs CRT
(cr_uid,cr_ruid,cr_svuid,cr_ngroups,cr_rgid,cr_sceAuthID,cr_sceCaps,
,cr_sceAttrs,fd_rdir,fd_jdir) sont invariables sur chaque majeur supporté, donc
le même binaire de démon est correct sur toute la gamme couverte.
Séquence de démarrage
Le démon exécute les étapes suivantes une fois, dans l'ordre. Chaque étape émet une ligne klog, et chaque défaillance envoie une notification de noyau visible par l'utilisateur avec la même chaîne :
Étape En échec
C'est le cas.
- Ouiunjail: daemon startAutres
D'après les donnéesunjail: args okAutresunjail: no payload args-> sortie
dénomination des marchandisesunjail: getpid okAutresunjail: getpid failed-> sortie
- ouiunjail: self raisedAutres
5unjail: authid setAutres
6unjail: rootvnode cachedAutresunjail: rootvnode read failed-> sortie
7unjail: daemon ready, entering accept loop(aussi en tant que notification système)
L'auto-élévation aux étapes 4 et 5 utilise la même promotion de onze champs le démon s'applique aux appelants, plus un id-autorisation écrit. Sans le noyau du démon écrit échouerait la vérification d'autorisation sur le deuxième appel.
Accepter la boucle
L'auditeur utiliseAF_INET/SOCK_STREAMavecSO_REUSEADDRet un arriéré de deux.
Pour chaque connexion acceptée le démon:
- Lis jusqu'à ce qu'il ait 2576 octets ou que le pair ferme.
- Efface le tampon de réponse.
- Si la lecture produit au moins 16 octets et que l'en-tête de requête valide, applique la
promotion; autrement écrit
-1dans le créneau de résultat. - Rédige l'ensemble du tampon de réponse au client et ferme la connexion.
La validation de l'en-tête de requête vérifie trois champs:
Valeur requise
C'est le cas.
Autres+0x00Magie0xDEADBEEFAutres
Autres+0x04Commandement5Autres
Autres+0x08Plus de zéro
La promotion elle-même estPayloadKernel.JailbreakByPid(pid, rootvnode), récupéré jusqu'à 30
fois si elle retourne faux. Le point de résultat à+0x0Creçoit0sur le succès et-1en cas d'échec ou de rejet d'en-tête.
Format du fil
Chaque demande et chaque réponse est une structure de 2576 octets sur le fil:
Type de champ
C'est pas vrai.
Autres+0x00Magieuint32Autres0xDEADBEEFsur la demande; le démon laisse zéro sur la réponse. autres
autres+0x04Commandementint32Autres5pour une demande de promotion.
autres+0x08Pidint32L'identificateur de processus de l'appelant.
Autres+0x0CRetourint32Zéro sur la demande;0sur le succès ou-1sur l'échec de la réponse.
autres+0x10Réservé 1280 octets Zéro des deux côtés.
Autres+0x510Réservé 1280 octets Zéro des deux côtés
Les deux blocs réservés sont ce que le lecteur du démon compte sur pour la taille de lecture, donc leur présence est importante même si rien sur le fil ne les utilise aujourd'hui. Ils sont dans la chambre. pour les extensions de commandes pour se développer sans casser les appelants existants.
Promotion sur 11 sites
PayloadKernel.JailbreakByPid(pid, rootvnode)marche la liste des processus à localiserpidpuis écrit les champs suivants par l'intermédiaire des accédeurs à champ fixe :
Valeur du champ
-- -- -- -- -- --
Autrescr_uidAutres0Autres
Autrescr_ruidAutres0Autres
Autrescr_svuidAutres0Autres
Autrescr_ngroupsAutres0Autres
Autrescr_rgidAutres0Autres
Autrescr_sceAuthIDAutres0x4801000000000013Autres
Autrescr_sceCaps[0]Autres0xFFFFFFFFFFFFFFFFAutres
Autrescr_sceCaps[1]Autres0xFFFFFFFFFFFFFFFFAutres
Autrescr_sceAttr0Autres0x80Autres
Autresfd_rdirAutresrootvnodeAutres
Autresfd_jdirAutresrootvnodeAutres
Les neuf premiers écrits lèvent le titre de compétence et la capacité à l'autorisation complète
valeurs. Les deux derniers points des répertoires racine et prison de la cible
la vnode racine du noyau, donc chaque chemin que la cible résout ensuite commence à partir/.
Bâtiment
Pointer l'environnement au SDK une fois, puis construire la charge utile:
setx SHARPPROSPERO_ROOT "<sdk>"
pwsh $SHARPPROSPERO_ROOT/build/build-app.ps1 -ProjectPath samples/prospero-payload-unjail/SampleApp.csproj -Payload -Output Folder
La sortie est une seuleSampleApp.elfdans l'échantillonout/dossier. La construction
Le pipeline est le même que chaque échantillon de charge utile utilisé.
Pour inclure la chapelure diagnostique (voir ci-dessous), reconstruire avec
-DiagnosticBreadcrumbs. Chaque build écrit le même nom de sortie (SampleApp.elf);
renommer la construction précédente d'abord si les deux formes doivent s'asseoir à côté l'une de l'autre. Les
deux ELF préconstruits les navires échantillons avec suivre cette convention:SampleApp.elfest le
libération construction etSampleApp.diag.elfest une copie enregistrée de la compilation de la chapelure.
Appeler le démon depuis un module d'application
Un module d'application qui nécessite la vue étendue ouvre une connexion TCP loopback à
127.0.0.1:9069, écrit la requête de 2576 octets avec son propre pid, et lit la réponse.
La chapelure diagnostique
Chaque étape de la séquence de démarrage et chaque résultat accepte-loop écrit une ligne klog.
Bâtiment avec-DiagnosticBreadcrumbsconserve chaque appel de journal dans l'ELF; une version de compilation
bande ceux qui ne sont pas sur un chemin d'échec. La première ligne manquante nomme l'échec
étape:
Échec de l'échec
-- -- -- -- -- --
Le CRT n'a jamais atteint le code géré. Vérifiez le journal du chargeur pour une panne de cartographie. Autres
Autresunjail: daemon startAutresPayloadEntryPoint.Argsrendu nul. Le chargeur n'a pas réussipayload_argsbloc.
autresunjail: args okAutresgetpidrenvoyé zéro ou une valeur négative. Le chargeur n'a pas terminé la configuration du pid avant de sauter à la charge utile. Autres
Autresunjail: getpid okL'auto-élévation a échoué. Lisez le journal de console pour la ligne côté noyau. Autres
Autresunjail: authid setAutresGetRootVnoderenvoyé zéro : le firmware en cours d'exécution n'est pas couvert par la table root-vnode du CRT.
Autresunjail: rootvnode cachedLa configuration TCP a échoué. La ligne suivante (socket failed,bind failedoulisten failed) désigne le syscall
Une fois que la boucle accepte est en cours d'exécution, chaque requête produit l'un des produits suivants:
unjail: pid jailbroken- la promotion a réussi et le client a reçu0.unjail: jailbreak failed- les écritures ont été rejetées (la cible est sortie avant la fin de la séquence, ou les accédeurs CRT ont retourné une erreur).
Élargissement
Le format fil laisse les deux tampons réservés vides et réserve la fente de commande pour la croissance. Un démon qui nécessite des opérations supplémentaires peut ajouter des commandes sans casser appelants existants:
- Commande 6 - Restauration.Lire l'ucred de l'appelant avant d'appliquer la promotion, enregistrer il dans le démon, et ajouter une commande de restauration qui l'écrit en retour. Un module qui favorise pour une opération et retourne ensuite utilise cette paire.
- Commandement 7 - Promouvoir un autre pid.L'appelant nomme son propre pid (
+0x08) et la cible (dans la région réservée). Utile lorsqu'un module contrôleur favorise une module travailleur. - Commande 8 - Lisez un mot noyau.Le démon retourne un
ulongd'un appelant fourni adresse du noyau. Diagnostic; ne pas envoyer cela sur un bâtiment public.
Chaque extension suit la même forme : l'appelant écrit la commande dans+0x04, les
démon le lit dans la boucle d'acceptation, envoie, et écrit le résultat dans+0x0C.