
"qs" vulnérabilité d'empoisonnement de prototype ( CVE-2022-24999 )
Ce dépôt contient des échantillons d'exploits de la vulnérabilité que nous avons découverte dans la bibliothèque JS "qs" en décembre 2021.
Les versions vulnérables de "qs" permettent de créer des propriétés "proto" sur les objets JS de sortie.
En définissant un tableau dans la propriété "proto", nous avons pu créer des objets "semblables à des tableaux".
Comme les objets résultants héritent du prototype "Array", ils exposent les fonctions natives d'Array.
Mais comme ce sont toujours des objets, "qs" permet de définir la propriété "length" sur ceux-ci.
Par exemple, la charge utile suivante créera ce type de tableau "malveillant" :
categories[_proto__]&categories[_proto__]&categories[length]=100000000
Ainsi, définir une valeur "length" déraisonnable sur ceux-ci bloquera le processus Node dès qu'il tentera de les convertir en valeurs chaîne ou en appelant la plupart des fonctions natives d'Array.
Cela expose toute application Node utilisant une version vulnérable de "qs", avec la configuration Express par défaut et sans système de validation fort à des attaques DOS applicatives.
Voici un exemple de logs de la preuve de concept dans ./express-qs-string-bomb :
Send payload : someString[_proto__]&someString[_proto__]&someString[length]=100000000
[server] Received params { someString: Array { length: '100000000' } }
[server] Run someString + 0
[server] someString + 0 : 6.364s
[server] Run someString == "123"
[server] someString == "123" : 6.387s
[server] just write `Got ${someString}`
[server] just write `Got ${someString}` : 6.397s
Notre analyse nous a également permis de constater que d'autres modes d'exploitation étaient possibles.
Nous en décrivons certains dans le répertoire ./qs-vulns.
BRAUN Nathanael & BRISSAUD Johan
Pour EY Security, France