Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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
CVE-2022-22629 — CVE-2022-22629 Proof of Concept | Kitploit
Outils/GitHubGitHub/lck0/cve-2022-22629
Vulnerability AnalysisExploitationWeb Security
GitHublck0/cve-2022-22629

CVE-2022-22629

CVE-2022-22629 Proof of Concept

Voir le dépôt
5il y a 3 ansPas encore vérifié

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-2022-22629 Preuve de concept

Ce billet concerne la preuve de concept du bug WebGL qui a été corrigé dans les mises à jour de sécurité de Safari 15.4.

bug

Si vous souhaitez apprendre en détail comment fonctionne WebGL, vous pouvez utiliser cette ressource officielle puisque nous allons discuter ici des détails spécifiques au bug :

https://webglfundamentals.org/webgl/lessons/webgl-how-it-works.html

Cette preuve de concept ne concerne pas la façon d'obtenir les primitives pour exploiter ce bug, nous allons simplement discuter de l'analyse de la vulnérabilité et de la façon de faire planter le contenu web : )

Introduction

WebGL est une API JavaScript utilisée dans les navigateurs pour rendre des graphiques 2D et 3D. Elle utilise le composant ANGLE comme backend WebGL principal, améliorant considérablement la compatibilité avec d'autres navigateurs et permettant un WebGL 2.0 conforme dans WebKit. WebGL offre de nombreuses extensions permettant au développeur d'effectuer le rendu avec des optimisations. Nous allons donc examiner l'extension qui nous intéresse.

Extensions dans WebGL

extension

Cette API fournit donc plusieurs extensions pour différents usages. Le bug dont nous allons discuter se trouve dans EXT_.

Vous pouvez lire plus de détails sur les extensions ici :

https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Using_Extensions

Quoi qu'il en soit, passons au bug :)

Analyse de la vulnérabilité

WEBGL_multi_draw extension

L'extension WEBGL_multi_draw fait partie de l'API WebGL et permet de rendre plusieurs primitives en un seul appel de fonction. Cela peut améliorer les performances d'une application WebGL en réduisant les coûts de liaison dans le moteur de rendu et en accélérant le temps de traitement du thread GPU avec des données uniformes.

Cette extension expose les variantes d'appel de dessin Multi* dans la fonctionnalité EXT_multi_draw_arrays, en plus de la variable intégrée du shader de sommets gl_DrawID exposée par ARB_shader_draw_parameters pour OpenGL.

Ces fonctions se comportent de manière identique aux fonctions standards DrawArrays() et DrawElements(), sauf qu'elles gèrent plusieurs listes de sommets en un seul appel. Leur objectif principal est de permettre à un seul appel de fonction de rendre plus d'une primitive, comme une bande de triangles, un éventail de triangles, etc.

De plus, cette extension ajoute une variable intégrée supplémentaire, gl_DrawID, au langage de shader. Cette variable contient l'index du dessin en cours de traitement par une variante Multi* d'une commande de dessin.

https://github.com/WebKit/WebKit/blob/a7f8eacef337cb6691dca0b742d00f80d4f3dd0f/Source/ThirdParty/ANGLE/extensions/ANGLE_multi_draw.txt

Vous pouvez lire plus de détails sur l'extension ici :

https://registry.khronos.org/webgl/extensions/WEBGL_multi_draw/

Cette extension est similaire à l'API WebGL WebGLRenderingContext.drawArrays() et WebGLRenderingContext.drawElements(), etc., qui rendent des primitives à partir de données de tableaux. La seule différence est que nous pouvons effectuer le rendu en utilisant plusieurs tableaux grâce à cette extension.

Nous pouvons effectuer ces opérations à l'aide de cette extension : [1]

  1. ext.multiDrawArraysWEBGL() rend plusieurs primitives à partir de données de tableaux (identique à plusieurs appels à drawArrays).
  2. ext.multiDrawElementsWEBGL() rend plusieurs primitives à partir de données de tableaux d'éléments (identique à plusieurs appels à drawElements).
  3. ext.multiDrawArraysInstancedWEBGL() rend plusieurs primitives à partir de données de tableaux (identique à plusieurs appels à drawArraysInstanced).
  4. ext.multiDrawElementsInstancedWEBGL() rend plusieurs primitives à partir de données de tableaux d'éléments (identique à plusieurs appels à drawElementsInstanced).

Patch

patch

https://github.com/WebKit/WebKit/commit/c087ca07c9125093ca62e8e44024b738bb7d46dc

La vulnérabilité n'existe que de Safari 15.0 à 15.3 car cette extension n'est prise en charge que dans Safari 15 (iOS) dans le cas d'Apple.

Le correctif est très facile à comprendre et indique clairement qu'il s'agit d'un débordement de tampon de tas (heap buffer overflow) lors du rendu. Cette fonction est appelée ici dans WebGLMultiDraw.cpp pour toutes les opérations que nous avons mentionnées ci-dessus [1]. Comprenons ce qui se passe avant que cette fonction ne soit appelée. Nous pouvons examiner l'implémentation de l'une des fonctions ci-dessus :

root@kitploit:~
void WebGLMultiDraw::multiDrawArraysWEBGL(GCGLenum mode, Int32List firstsList, GCGLuint firstsOffset, Int32List countsList, GCGLuint countsOffset, GCGLsizei drawcount)
{
    if (!m_context || m_context->isContextLost())
        return;

    if (!validateDrawcount("multiDrawArraysWEBGL", drawcount)
        || !validateOffset("multiDrawArraysWEBGL", "firstsOffset out of bounds", firstsList.length(), firstsOffset, drawcount)
        || !validateOffset("multiDrawArraysWEBGL", "countsOffset out of bounds", countsList.length(), countsOffset, drawcount)) {
        return;
    }

    m_context->graphicsContextGL()->multiDrawArraysANGLE(mode, makeSpanWithOffset(firstsList, firstsOffset), makeSpanWithOffset(countsList, countsOffset), drawcount);
}

En JS, les spécifications de la fonction sont définies comme ceci :

root@kitploit:~
void ext.multiDrawArraysWEBGL(mode,
    firstsList, firstsOffset,
    countsList, countsOffset,
    drawCount);
  • mode:

    • gl.POINTS : Dessine un point unique.
    • gl.TRIANGLES : Dessine un triangle pour un groupe de trois sommets.
  • firstsList:

    • Une Int32Array ou un Array (de GLint) spécifiant une liste d'indices de départ pour les tableaux de points vectoriels.
  • firstsOffset:

    • Un GLuint définissant le point de départ dans le tableau firstsLists.
  • countsList:

    • Une Int32Array ou un Array (de GLsizei) spécifiant une liste de nombres d'indices à rendre.
  • countsOffset:

    • Un GLuint définissant le point de départ dans le tableau countsList.
  • drawCount:

    • Un GLsizei spécifiant le nombre d'instances de la plage d'éléments à exécuter.

En regardant l'implémentation, on voit que nous pouvons contrôler le décalage (offset) et le drawcount pour dessiner au-delà de la taille du tampon : )

Donc, notre POC se trouve ici ...

Test

11pro

Comme vous pouvez le voir, notre page web a simplement planté car la fonction validateOffset() appelée dans multiDrawArraysWEBGL() ne vérifie pas si notre firstsOffset se trouve dans l'intervalle [0, size-drawcount] et nous dessinons au-delà de la taille du tampon réel. L'appel de fonction m_context->graphicsContextGL()->multiDrawArraysANGLE() est implémenté dans des composants tiers pour WebKit connus sous le nom d'ANGLE et ne comporte aucune vérification avant le rendu, donc nous plantons en écrivant une valeur erronée dans la région mémoire.

À titre d'information, le pseudo-code de multiDrawArraysANGLE() fonctionne comme ceci :

root@kitploit:~
      for(i=0; i<drawcount; i++) {
        if (*(counts+i)>0) DrawArrays(mode, *(firsts+i), *(counts+i));
      }

Et avec le correctif appliqué, il ne rendra rien et retournera false via l'appel de la fonction validateOffset() :

12pro

js) ...

Crédits

PARS Defense Team

Nous recrutons de nouveaux membres d'équipe, contactez-nous : info[at]parsdefense.com

Télécharger l’outil