SpecterDev nous explique aujourd'hui son exploit Kernel nommé NamedObj, s'il le fait c'est grâce à la récente publication de l'exploit Kernel 4.05 par fail0verflow. Il dit détenir ce exploit depuis un certain temps lui et ses amis et que fail0verflow leur avait donner un coup de main pour le mettre en place et ne pouvaient pas le sortir de leurs propre gré.
Maintenant qu'il est sorti, il vient nous parler de ce exploit car c'est un exploit vraiment intéressant. Il nous explique l'exploit mais pas dans son intégralité, plus dans un cadre d'une stratégie pour ceux qui seront intéressés et voudront l'utiliser pour essayer de le mettre en œuvre. En temps voulu, il va publié son implémentation après avoir modifié les composants de l'exploit.
Voila une traduction française de leurs stratégies d'attaque pour mettre en place l'exploit (merci à @b&nder)
Après l'explication de fail0verflow il y'a quelques jours sur l'exploit "nameobj exploit", alors que moi et quelques autres avions déjà cet exploit depuis quelque mois, nous ne voulions pas faire de release car nous avions reçu de l'aide de fail0verflow.
Le bug se base sur une confusion dans le champ "kind" de "id_entry" grâce aux informations contenues dans l'un des champs (propriété) d'un objet nommé. Un objet nommé est un objet avec des propriétés attachés (comme par exemple leur nom), ces propriétés pointent vers l'objet réel dans la pile. En spécifiant un type 0x5000 pour votre objet, vous pouvez créer un bug (type confusion).
Il faut maintenant trouver une autre zone du kernel qui pourra manipuler notre objet. Par chance, il existe un service (sys_mdbg_service()) qui va nous permettre d’écraser les 32bits de poids faible d'un pointeur que nous pourrons libérer (free()) plus tard avec sys_namedobj_delete(). Grace cela nous nous retrouvons dans une situation qui nous permet d'obtenir l'execution de code en envoyant des faux objets dans la pile libérée pour corrompre un pointeur.
Une bonne stratégie pour exploiter ce bug consiste à :
- Trouver un objet cible.
- Créer le bug via sys_namedobj_create() avec un type de 0x5000
- Mettre en place une ropchain en userland (cette rop doit permettre de stopper la protection en écriture du kernel pour patcher la zone en RWX (écriture, lecture, exécution) et retourner en userland.
- Écraser les 32bits inférieurs de votre objet via sys_mdbg_service() avec les 32bits inférieurs de votre objet cible. Le pointeur stocké était un pointeur sur la pile (heap), les 32bits supérieurs sont donc réglés par FreeBSD à l'adresse 0xFFFFYYYYxxxxxxxx (YYYY est aléatoire géré par ASLR au boot).
- Utilisons l'appel systeme free() via sys_namedobj_delete()
- Envoyer votre faux objet dans la pile avec un pointeur sur une fonction pointant sur la chaine ROP.
- Trouver une fonction qui utilise l'objet corrompu et utilisez-la pour lire votre pointeur.
- Voila vous avez maintenant l’exécution de votre ROP chain dans ring0 (kernel).
- Réparer l'objet corrompu sinon lorsque le webkit s’arrêtera, le kernel voudra libérer l'objet corrompu menant à un double free() donc crash.
Vous pouvez tout lire dans la version originale sur ce lien si vous êtes intéressé ou voudrait en savoir plus : NamedObj Kernel Exploit
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now