Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
POC-for-CVE-2023-41993 — Exploit de preuve de concept pour CVE-2023-41993, une confusion de type JIT WebKit dans Safari. Fournit des primitives addrof/fakeobj via la manipulation du tas et la confusion GetterSetter, permettant une lecture/écriture arbitraire dans le processus WebContent. | Kitploit
Outils/GitHubGitHub/po6ix/poc-for-cve-2023-41993
Analyse des VulnérabilitésExploitationExploitation d'Applications WebDéveloppement de Charges UtilesExploitation de Binaires
GitHubpo6ix/poc-for-cve-2023-41993

POC-for-CVE-2023-41993

Exploit de preuve de concept pour CVE-2023-41993, une confusion de type JIT WebKit dans Safari. Fournit des primitives addrof/fakeobj via la manipulation du tas et la confusion GetterSetter, permettant une lecture/écriture arbitraire dans le processus WebContent.

Voir le dépôt
2023716il y a 2 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2023-41993

Exploit PoC pour CVE-2023-41993. Il est écrit seulement jusqu'à addrof/fakeobj. La fiabilité n'est pas excellente. Si vous voulez l'améliorer, essayez de pulvériser les IDs de structure.

Lien POC

https://po6ix.github.io/POC-for-CVE-2023-41993/pwn.html

J'ai décidé d'héberger avec GitHub Pages suite à de multiples demandes.
Souhaitez-moi bonne chance que GitHub ne me bloque pas...

Versions affectées connues

  • MacOS 14.0
  • iOS 17.0, 17.1 beta 1
  • iPadOS 17.0

Versions non affectées connues

  • iOS 16.1.1, 16.2, 16.5, 16.5.1, 16.6 beta 1, 16.6.1, 16.7.1, 17.1 RC
  • iPadOS 17 beta 1

Q&R

Il plante seulement

C'est parce que la valeur du facteur définie dans la fonction pwn n'est pas correcte pour votre appareil.
Pour ce cas, j'ai fait en sorte qu'elle utilise une valeur aléatoire entre 87 et 1088.
Ainsi, vous pouvez trouver la bonne valeur du facteur en rafraîchissant simplement de temps en temps.
Cela devrait fonctionner en moins de 100 tentatives probabilistiquement.
Ce serait également bien si vous pouviez m'envoyer les informations affichées en cas de succès.

Alors, que puis-je faire avec cela ?

Cela vous donne une primitive de lecture/écriture sur le processus WebContent de Safari.
Mais pour le rendre vraiment utile, vous devrez l'enchaîner avec d'autres composants.

Brève explication

Vous souhaitez peut-être un article détaillé à ce sujet, mais malheureusement je n'ai pas le temps d'écrire le truc. J'écris donc quelques notes ici pour que vous puissiez comprendre comment cela fonctionne.

Si vous regardez le commit, il s'agit du changement pour HeapLocation. Un nouveau facteur a été ajouté pour savoir si les nœuds sont identiques ou non. Il nous indique que les nœuds comme GetByOffset, MultiGetByOffset peuvent être confondus. Mais en réalité, il ne s'agit que du décalage (offset). Disons qu'il a deux nœuds GetByOffset qui ont des offsets différents. L'un d'eux va être CSEed et le restant sera utilisé à la place. C'est donc fondamentalement une confusion d'offset, mais cela ne vous donne pas accès à un offset arbitraire. Car pour CSE ce type de nœuds, ils doivent être remontés (hoisted) par LICMPhase. Pour les types de nœuds qui effectuent une opération d'écriture, ils ne sont pas autorisés à être remontés dans cette phase. Donc la même confusion ne se produit pas pour les nœuds PutByOffset, MultiPutByOffset. De plus, lorsque GetByOffset est remonté, la fonction safeToExecute est appelée pour vérifier que le nœud est légitime à exécuter et permet d'accéder uniquement à un offset inférieur à la capacité de stockage (inline/ool). L'idée pour exploiter cela était GetterSetter. Si vous appelez Object.__defineGetter__ pour définir une propriété, un objet GetterSetter est créé mais stocké dans le stockage de propriétés et celui-ci n'est normalement pas accessible. Mais vous pouvez le faire avec cette manipulation d'offset que vous avez. Ensuite, vous appelez la fonction Object pour déclencher une confusion de type.

JSObject* JSCell::toObjectSlow(JSGlobalObject* globalObject) const
{
    Integrity::auditStructureID(structureID());
    ASSERT(!isObject());
    if (isString())
        return static_cast<const JSString*>(this)->toObject(globalObject);
    if (isHeapBigInt())
        return static_cast<const JSBigInt*>(this)->toObject(globalObject);
    ASSERT(isSymbol());
    return static_cast<const Symbol*>(this)->toObject(globalObject);
}

Cela créera un SymbolObject avec le GetterSetter comme valeur interne. Et c'est incorrect, car cette valeur interne de SymbolObject est censée être une instance de Symbol, pas GetterSetter.

let getterSetter = jitme(1);
let symbolObject = Object(getterSetter);

symbolObject.description; // call the getter
String Symbol::description() const
{
    auto& uid = m_privateName.uid();
    return uid.isNullSymbol() ? String() : uid;
}

Ensuite, lorsque vous appelez le getter description, il retournera une instance de String. C'est une confusion de type entre Symbol.m_privateName et GetterSetter.m_getter. Chaque fois que vous appelez ce getter, il va incrémenter le champ compteur de référence de m_privateName.m_uid qui se trouve à l'offset 0x0. C'est très utile, car cet offset est l'endroit où se trouve l'ID de structure de la fonction getter. En appelant cette fonction plusieurs fois, vous pouvez changer l'ID de structure de l'instance JSFunction. J'ai préparé un autre type qui a de nombreuses propriétés. Ensuite, si vous synchronisez l'ID de structure pour qu'il soit identique, vous pouvez faire une écriture hors limites (oob) dans le stockage de propriétés. Cela donne directement la primitive addrof/fakeobj.

Référence

  • Int64 module: https://github.com/saelo/jscpwn
Télécharger l’outil