- Регистрация
- 13 Июн 2025
- Сообщения
- 4
- Реакции
- 2
- Баллы
- 3
Сегодня разберём неочевидную, но опасную уязвимость, которая встречается в JavaScript — Prototype Pollution (PP).Всем привет!
Что такое Prototype Pollution?
Это атака, при которой злоумышленник модифицирует прототип объекта в JavaScript, что может привести к:
- Изменению логики приложения
- XSS-атакам через переопределение встроенных методов
- Обходу проверок доступа
- Даже RCE (Remote Code Execution) в Node.js
Как это работает?
В JavaScript почти все объекты наследуются от
Код:
Object.prototype
Пример уязвимого кода
Допустим, есть функция, которая объединяет объекты:
Код:
javascript
function merge(target, source) {
for (let key in source) {
if (typeof target[key] === 'object' && typeof source[key] === 'object') {
merge(target[key], source[key]);
} else {
target[key] = source[key]; // Уязвимость!
}
}
return target;
}
Код:
source
Код:
__proto__
Код:
javascript
const maliciousPayload = {
__proto__: { isAdmin: true }
};
merge({}, maliciousPayload);
Код:
isAdmin: true!
Реальные последствия
1. Обход авторизации
Если приложение проверяет,
Код:
user.isAdmin
2. XSS через переопределение методов
Например, если переопределить
Код:
Object.prototype.toString:
Код:
javascript
Object.prototype.toString = () => '<img src=x onerror=alert(1)>';
3. RCE в Node.js
Если приложение использует уязвимые библиотеки (например, для шаблонов), можно добиться выполнения произвольного кода.
Как защититься?
1. Замораживание прототипа
Код:
javascript
Object.freeze(Object.prototype);
2. Проверка ключей
Отвергать любые попытки установки
Код:
__proto__
Код:
constructor
Код:
javascript
if (key === '__proto__') throw new Error('Prototype pollution attempt!');
3. Использование Map вместо объектов
Map не наследует свойства от Object.prototype
4. Обновление зависимостей
Многие npm-пакеты (например, lodash hoek) имели уязвимости PP — всегда обновляйте их
Вывод
Prototype Pollution — это тихий убийца JavaScript-приложений. Она может быть незаметна до момента эксплуатации, но последствия — катастрофичны.
Последнее редактирование: