Перейти к содержанию

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 объектом в теле запроса:

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

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

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

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

{"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.

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

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

Ссылки

Внешние