OWASP API Security Top 10: 0xa6 mass assignment

# API6:2019 - Массовое Переназначение Параметров (Mass assignment)

| Источники угроз/Векторы атак | Недостатки безопасности | Последствия |
| - | - | - |
| Зависит от API : Сложность эксплуатации **2** | Распространенность **2** : Сложность обнаружения **2** | Технические последствия **2** : Зависит от бизнеса |
| Для эксплуатации зачастую требуется понимание бизнес логики, связей между объектами и структуры API. Эксплуатация массового переназначения параметров проще реализуема в API, поскольку они изначально предусматривают общедоступность внутренней реализации API и названий свойств объектов. | Современные фреймворки предлагают разработчикам функции, которые автоматически присваивают переменным и внутренним объектам значения соответствующих параметров из пользовательского ввода. Злоумышленник может использовать эту методологию, чтобы обновить или переназначить критичные свойства объектов, которые разработчик не намеревался делать доступными для пользователя. | Эксплуатация уязвимости может привести к повышению привилегий, злонамеренному изменению данных, обходу механизмов защиты и так далее. |

## Как определить, является ли API уязвимым?

Объекты в современных приложениях могут иметь большое количество свойств. Некоторые из них могут быть изменены напрямую клиентом (например, `user.first_name` или `user.address`), в то время как изменение других не должно быть доступно (например, флаг `user.is_vip`).

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

Примеры критичных свойств:

* **Свойства, относящиеся к привилегиям**: `user.is_admin`, `user.is_vip` должны устанавливаться только администраторами.
* **Свойства, зависящие от процесса**: `user.cash` должны устанавливаться только внутри кода после проверки платежа.
* **Внутренние свойства**: `article.created_time` должны устанавливаться только внутри кода самим приложением.


## Примеры сценариев атаки

## Сценарий #1

Приложение для совместных поездок позволяет пользователю редактировать базовую информацию своего профиля. В ходе редактирования отправляется следующий запрос `PUT /api/v1/users/me` с корректным JSON объектом в теле запроса:

```json
{"user_name":"inons","age":24}
```

Запрос к `GET /api/v1/users/me` включает в себя дополнительное свойство credit_balance:

```json
{"user_name":"inons","age":24,"credit_balance":10}
```

Злоумышленник дублирует первый запрос со следующим телом запроса:

```json
{"user_name":"attacker","age":60,"credit_balance":99999}
```

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

### Сценарий #2

Портал для обмена видео позволяет пользователям загружать и скачивать материалы в разных форматах. Злоумышленник исследует API и обнаруживает, что точка входа `GET /api/v1/videos/{video_id}/meta_data` возвращает JSON объект с параметрами видео. Один из параметров `"mp4_conversion_params":"-v codec h264"` дает понять, что приложение использует консольную команду для конвертации видео.

Злоумышленник также обнаружил, что точка входа `POST /api/v1/videos/new` уязвима к массовому переназначению параметров и позволяет клиенту установить значение любого свойства объекта видео.
Злоумышленник устанавливает следующее значение параметра: `"mp4_conversion_params":"-v codec h264 && format C:/"`. Это значение приведет к инъекции команды операционной системы, как только злоумышленник скачает видео в формате MP4.

## Как предотвратить

* Если возможно, избегайте использования функций, которые автоматически присваивают переменным и внутренним объектам соответствующие значения из пользовательского ввода.
* Добавляйте в белые списки только те свойства, которые могут быть изменены клиентом.
* Используйте встроенный функционал по добавлению в черный список свойств, к которым клиенты не могут иметь доступ.
* Если это возможно, явно определите схемы входящих данных и проверяйте входящие данные по ним.

## Ссылки

### Внешние

* [CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes][1]

[1]: https://cwe.mitre.org/data/definitions/915.html