FlawOpen

flawopen.com/Mass assignment/Объяснение

Mass assignment: риски и безопасные списки полей

CWE-915: Improperly Controlled Modification of Dynamically-Determined Object AttributesСправочная страница
Краткий ответ

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

VULNERABLE
# Rails: request keys reach model attributes
User.new(params[:user])

// Node / Mongoose: request object used as update
await User.findByIdAndUpdate(id, req.body);

// Express + Sequelize: request object used as create values
await User.create(req.body);

# Django: request keys passed as model fields
User.objects.create(**request.POST.dict())
FIXED
# Rails — permit only user-editable fields
attrs = params.require(:user).permit(:name, :email)
user = User.new(attrs)

// Node — construct an allowlisted update
const { name, email } = req.body;
await User.findByIdAndUpdate(id, { name, email });

# Django — explicit ModelForm fields
class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ["name", "email"]

// .NET — bind a DTO, then map explicitly
user.Name = input.Name;
user.Email = input.Email;

Зачем нужны серверные списки разрешённых полей

Список «всё, кроме role» может пропустить новое чувствительное поле. В списке разрешений новые поля закрыты, пока код явно их не откроет. Rails Strong Parameters отклоняет неразрешённые атрибуты при массовом присваивании, но контроллер должен разрешать поля только для данного действия. DTO или явный список полей создают такую же границу.

Список ограничивает атрибуты запроса, но не даёт права менять запись. Ограничьте её аутентифицированным субъектом, авторизуйте операцию и отделите привилегированные изменения.

Категории чувствительных полей

Проверьте атрибуты моделей, вложенные сериализаторы и обработчики обновления:

Частые вопросы

Это то же самое, что prototype pollution?

Это разные слабые места. Mass assignment задаёт лишние атрибуты создаваемого или изменяемого объекта. Prototype pollution меняет свойства прототипа и может влиять на поиск свойств других объектов. Небезопасное слияние может привести к этому; mass assignment зависит от использования свойств. См. prototype pollution.

GraphQL устраняет проблему?

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

Защищают ли серверные формы?

Нет. Форма не ограничивает HTTP-клиента. Считайте поля контролируемыми атакующим, проверяйте их на сервере и принимайте только поля действия.

Источники

См. также Утечка состояния serverless: изоляция данных запросов PHP == и сравнение magic hash Безопасен ли Rust с блоком unsafe? Безопаснее ли strncpy(), чем strcpy()? CWE и CVE: в чём разница?