«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Шаги по предотвращению атак загрязнения прототипов в JavaScript

Шаги по предотвращению атак загрязнения прототипов в JavaScript

Опубликовано 31 июля 2024 г.
Просматривать:680

Steps to Preventing Prototype Pollution Attacks in JavaScript

В мире веб-безопасности загрязнение прототипов — это тонкая, но потенциально разрушительная уязвимость, которая может привести к серьезным последствиям, если ее не устранить должным образом. В этом блоге мы рассмотрим, что такое прототип загрязнения, как оно происходит и, самое главное, как его предотвратить. Давайте погрузимся!

Что такое загрязнение прототипа?

Загрязнение прототипов — это тип уязвимости, которая затрагивает приложения JavaScript. Это происходит, когда злоумышленник может внедрить свойства в прототип объекта, которые затем могут распространиться на все объекты, унаследованные от этого прототипа. Это может привести к неожиданному поведению, в том числе к возможности перезаписать существующие методы и свойства, что в конечном итоге поставит под угрозу безопасность и функциональность приложения.

Как происходит загрязнение прототипа

Чтобы понять, как происходит загрязнение прототипов, нам нужно поближе взглянуть на объекты и прототипы JavaScript. В JavaScript каждый объект имеет прототип — еще один объект, от которого первый объект наследует свойства и методы. Такая цепочка прототипов позволяет эффективно искать свойства, но также открывает двери для потенциальных атак, если их неправильно обработать.

Вот простой пример того, как может произойти загрязнение прототипа:

let obj = {};
console.log(obj.constructor); // function Object() { [native code] }

obj.__proto__.polluted = true;
console.log({}.polluted); // true

В этом примере, изменяя свойство proto объекта obj, мы непреднамеренно затрагиваем все объекты, имеющие один и тот же прототип, демонстрируя, насколько легко загрязнить цепочку прототипов.

Реальный пример прототипного загрязнения

Рассмотрим сценарий, в котором пользовательский ввод используется для расширения или объединения объектов без надлежащей проверки. Распространенным вариантом использования является объединение параметров запроса в объект конфигурации.

const merge = require('lodash/merge');

let config = {};
let query = JSON.parse('{"__proto__":{"admin":true}}');

merge(config, query);

console.log(config.admin); // undefined
console.log({}.admin); // true

В этом примере функция слияния из библиотеки Lodash используется для объединения конфигурации с запросом. Однако объект запроса, контролируемый злоумышленником, включает свойство proto, которое загрязняет прототип глобального объекта, устанавливая для admin значение true для всех объектов.

Предотвращение загрязнения прототипа

Чтобы защитить ваши приложения от загрязнения прототипами, рассмотрите возможность принятия следующих мер:

1. Избегайте расширения собственных прототипов:
Не расширяйте собственные прототипы (например, Object.prototype) напрямую, так как это может привести к конфликтам и уязвимостям безопасности.

Пример: избегайте расширения собственных прототипов
Не делайте этого:

Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

Вместо этого создайте служебные методы в своем собственном пространстве имен:

const myUtils = {
  polluted: function() {
    // Your method implementation
  }
};

let obj = {};
console.log(obj.polluted); // undefined

2. Подтвердите ввод пользователя:
Всегда проверяйте и очищайте вводимые пользователем данные перед их использованием для создания или изменения объектов. Используйте такие библиотеки, как Joi или Validator, чтобы обеспечить соблюдение строгих правил проверки ввода.

Пример: проверка ввода пользователя с помощью Joi

const Joi = require('joi');

const schema = Joi.object({
  admin: Joi.boolean().required()
});

const input = JSON.parse('{"admin":true}');

const { error, value } = schema.validate(input);

if (error) {
  console.error('Invalid input:', error.details);
} else {
  console.log('Valid input:', value);
}

3. Используйте методы безопасного объекта:

Предпочитайте использовать безопасные методы объекта, которые не пересекают цепочку прототипов, например Object.create(null), для создания простых объектов без прототипа.

Пример: используйте безопасные методы объекта

let safeObj = Object.create(null);
safeObj.admin = false;

console.log(safeObj.constructor); // undefined
console.log(safeObj.admin); // false

4. Заморозить прототип:

Заморозьте Object.prototype, чтобы предотвратить изменение цепочки прототипов. Это можно сделать с помощью Object.freeze().

Пример: заморозка прототипа

Object.freeze(Object.prototype);

let obj = {};
try {
  obj.__proto__.polluted = true;
} catch (e) {
  console.error('Attempt to modify prototype failed:', e);
}

console.log({}.polluted); // undefined

5. Обновить зависимости:

Регулярно обновляйте свои зависимости, чтобы убедиться, что вы используете последние версии, включающие исправления безопасности. Уязвимости в сторонних библиотеках часто используются для атак, загрязняющих прототипы.

Пример: обновление зависимостей с помощью npm

npm update

Регулярно запускайте эту команду, чтобы убедиться, что все ваши пакеты обновлены.

6. Мониторинг и тестирование:
Внедряйте мониторинг и автоматическое тестирование для обнаружения и устранения уязвимостей прототипов, вызывающих загрязнение. Такие инструменты, как аудит npm, могут помочь выявить уязвимые пакеты в вашем проекте.

Пример: мониторинг и тестирование с помощью аудита npm

npm audit

Запустите эту команду, чтобы просканировать ваш проект на наличие уязвимостей. Он предоставляет отчет об обнаруженных проблемах и предлагает шаги по их устранению.

Заключение

Загрязнение прототипов — это критическая уязвимость, которая может иметь далеко идущие последствия, если ее не остановить. Понимая, как это происходит, и применяя лучшие методы предотвращения этого, вы можете значительно повысить безопасность своих приложений JavaScript. Сохраняйте бдительность, обновляйте свои зависимости и всегда проверяйте вводимые пользователем данные, чтобы защититься от этого коварного вектора атаки.

Если этот блог оказался для вас полезным, обязательно поделитесь им со своими коллегами-разработчиками и энтузиастами безопасности. Оставаться в курсе и проявлять инициативу — ключ к поддержанию надежной веб-безопасности. Приятного программирования!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/rigalpatel001/steps-to-preventing-prototype-pollution-attacks-in-javascript-118g?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3