LINUX.ORG.RU

Критическая уязвимость в dhclient (удалённый root)

 , ,


0

2

При обмене данными с DHCP сервером dhclient не экранирует (или не удаляет) мета-символы в полученных ответах, а передаёт эти данные напрямую во вспомогательный скрипт dhclient-script. Это может использоваться злоумышленниками для удалённого запуска кода с правами root на клиенте. Подвержены все версии dhclient начиная с 3.0.x и до 4.2.x. Рекомендуется обновиться, или вручную добавить следуюший код в самое начало функции set_hostname() в скрипте dhclient-script:

new_host_name=${new_host_name//[^-.a-zA-Z0-9]/}

>>> Подробности

★★★

Проверено: anonymous_incognito ()
Последнее исправление: Deleted (всего исправлений: 2)

Ответ на: комментарий от vadic

echo /*/*/*/*/*/*/*/*/*/*/*/*/*

Действительно, это надёжнее =).

Deleted
()

Подобный сабжевому скрипт из dhcpcd

# Set the hostname from DHCP data if required

need_hostname()
{
        local hostname=""

        case "$force_hostname" in
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) ;;
        *) hostname="$(hostname)";;
        esac
        case "$hostname" in
        ""|"(none)"|localhost|localhost.localdomain)
                [ -n "$new_host_name" -o -n "$new_fqdn_name" ];;
        "$old_host_name"|"$old_fqdn_name")
                true;;
        *)
                false;;
        esac
}

set_hostname()
{
        if need_hostname; then
                if [ -n "$new_host_name" ]; then
                        hostname "$new_host_name"
                elif [ -n "$new_fqdn_name" ]; then
                        hostname "$new_fqdn_name"
                fi
        fi
}

if $if_up; then
        set_hostname
fi

Я вижу «$new_host_name» заквоченным, так что ничего страшного происходить не должно, верно?

// c: insurance recese

anonymous
()
Ответ на: комментарий от anonymous

в венде есть nap

Я вот не сильно разбираюсь в вендах, но разве NAP как-то поможет от подмены DHCP-сервера?

Deleted
()
Ответ на: комментарий от vadic

Вот, кстати, да. Есть какой-нить механизм проверки подлинности DHCP-сервера? Ну, чтоб убедиться, что это именно сервер провайдера, а не сосед Вася WAN и LAN на роутере местами перепутал?

Чисто для DHCP ЕМНИП ничего такого нет. Можно решить проблему несколько другим путём - развернуть WPA2 Enterprise поверх ethernet-сети =).

Deleted
()
Ответ на: Подобный сабжевому скрипт из dhcpcd от anonymous

Я вижу «$new_host_name» заквоченным, так что ничего страшного происходить не должно, верно?

По идее да. Но мы ещё не до конца поняли как должна работать эта уязвимость =).

Deleted
()
Ответ на: комментарий от roof

Можно делать силами свича провайдера. Гугли dhcp snooping.

У нормальных провайдеров это уже лет 5 должно быть включено.

hiokio
()
Ответ на: комментарий от Lonli-Lokli

развернуть WPA2 Enterprise поверх ethernet-сети =)

Люто, бешено запрашиваю подробности.

По идее - hostapd на сервере, wpa_supplicant на клиенте. Но сам лично я это настраивал только со стороны клиента.

Deleted
()

В супер-мега защищенной OpenBSD этот пакет используется тоже?

ttnl ★★★★★
()

> не экранирует (или не удаляет) мета-символы в полученных ответах, а передаёт эти данные напрямую во вспомогательный скрипт

Утечка сырья «дырки» на фабрике по изготовлению дуршлагов.

valich ★★★
()

какой чудовищный ахтунг! хорошо что пользуюсь традиционным, хотя и не всегда удобным dhcpcd.

splinter ★★★★★
()
Ответ на: комментарий от Lonli-Lokli

Не подскажете, что почитать на тему?

Всякое-разное про IEEE 802.1X, документацию к hostapd на тему driver=wired, документацию к wpa_supplicant на тему опции -D wired. Но повторюсь: сам я такое всё вместе настраивать не пробовал, вполне возможно что оно работает совсем не так как я себе представляю...

Deleted
()
Ответ на: комментарий от Deleted

802.1x строго пофиг, в какой среде применяться. Однако хз, как это реализовано в линупсе. Видел реализацию .1x «в проводах», на цисковском оборудовании с виндовым RADIUS-сервером. Впечатлился.

Механизм проверки подлинности DHCP-сервера - полная чушь. Как комп может проверить эту подлинность? У него еще нет сетевого адреса, даже спросить не у кого. Если в сети будет левый DHCP, и если он будет отвечать на запросы клиентов быстрее, чем легитимный DHCP, у клиентов БУДУТ левые адреса.

IPv6 тоже имеет свои особенности - если к сети есть физический доступ, можно впихнуть в нее соответствующим образом настроенный роутер, тогда сеть поскачет опять-таки по елде.

NAP - очень хорошо. Он что, позволяет адреса получать без DHCP? Не смешно даже. Не теплое и не мягкое.

А вообще позитивная новость, мне нравится.

anonymous
()
Ответ на: комментарий от anonymous

802.1x строго пофиг, в какой среде применяться. Однако хз, как это реализовано в линупсе. Видел реализацию .1x «в проводах», на цисковском оборудовании с виндовым RADIUS-сервером. Впечатлился.

Я с этим столкнулся всего один раз, когда настраивал офисный сервер одной организации, которой провайдер интернет доставляет эзернетом с авторизацией 802.1x. С клиентской стороны в линупсе всё ОК - wpa_supplicant завёлся сходу. А вот по поводу сервера - хз. У того провайдера скорее всего за авторизацию и раздачу интернета отвечала какая-нибудь циска.

Deleted
()
Ответ на: комментарий от anonymous

Если в сети будет левый DHCP, и если он будет отвечать на запросы клиентов быстрее, чем легитимный DHCP, у клиентов БУДУТ левые адреса.

А если умный коммутатор будет фильтровать базар клиентов, решая кому можно отправлять DHCP и кому нельзя, владельцы «левые DHCP» обломаются как бы быстроих сервера не отправляли кривые ответы.

no-dashi ★★★★★
()
Ответ на: комментарий от anonymous

> Механизм проверки подлинности DHCP-сервера - полная чушь. Как комп может проверить эту подлинность? У него еще нет сетевого адреса, даже спросить не у кого.

Не, ну если постараться, то думаю можно разработать dhcp'шную опцию для передачи подписи для стандартных параметров (и даже других опций) прямо в ответах сервера.

vadic
()
Ответ на: комментарий от roof

> Есть какой-нить механизм проверки подлинности DHCP-сервера?

Оказывается, есть RFC3118. Насколько и где он реализован – хз.

vadic
()

Странно, но никакой функции set_hostname я там не нашел. Только две строчки:

    if [ -n "${new_host_name}" ] && need_hostname; then
        hostname ${new_host_name} || echo "See -nc option in dhclient(8) man page."
    fi
segfault ★★★★★
()
Ответ на: комментарий от Deleted

Для убунты, в большинстве случаев, достаточно две строчки местами поменять:

if [ -n "$new_host_name" ]; then

и

if [ ! -s /etc/hostname ]; then
A-234 ★★★★★
()
Ответ на: комментарий от A-234

Для убунты, в большинстве случаев, достаточно две строчки местами поменять:

Лично я в убунтовском скрипте вообще уязвимости не вижу. В федоровском уязвимость есть, но не remote code execution, а максимум DoS.

Deleted
()

Я всё понял!

ISC dhclient did not strip or escape certain shell meta-characters in responses from the dhcp server (like hostname) before passing the responses on to dhclient-script. Depending on the script and OS, this can result in execution of exploit code on the client.

Так что сам по себе dhclient не уязвим, уязвимыми *могут быть* скрипты конкретной ОС или конкретного дистрибутива. Судя по всему, в ubuntu и debian уязвимости нет.

Deleted
()
Ответ на: Я всё понял! от Deleted

Ну это как бы очевидно, да. Но чтоб написать скрипт, уязвимый для исполнения кода, надо нетривиально постараться.

vadic
()
Ответ на: комментарий от vadic

Да это понятно. Так, на всякий случай. Вдруг еще что вылезет с обработкой заквоченных строк.

A-234 ★★★★★
()

ну а я вот который раз толдычу:

если вы НЕУММЕЕТЕ писать скрипты на bash (а умеете например на Perl или Python или XXX) — то и пишите скрипты именно на том языке на котором умеете

user_id_68054 ★★★★★
()

Что курили разработчики? Это же любой ведроидофон можно эксплуатировать так.

Quasar ★★★★★
()

Странно, что это заметили лишь сейчас.

bbk123 ★★★★★
()
Ответ на: комментарий от tazhate

> а вот прова сломать было бы ололо.

Дыра в клиенте. Это провы тебя будут ломать направо и налево. Ну и гэбня тоже.

anonymous
()
Ответ на: комментарий от Deleted

> Значит я не понял как должна работать эта уязвимость. Можно пример?

HOSTNAME=«vasja_pupkin.com; rm -rf /»

hostname ${HOSTNAME}

anonymous
()
Ответ на: комментарий от baaba

> Если бы такую уязвимость нашёл я, я бы захватил власть над миром.

Интересно, как? Для этого не плохо было бы быть не самым последний провайдером, чтобы подключённых к тебе сначала попытаться захватить.

anonymous
()
Ответ на: комментарий от anonymous

HOSTNAME=«vasja_pupkin.com; rm -rf /»

hostname ${HOSTNAME}

В bash и dash не работает.

Deleted
()
Ответ на: комментарий от anonymous
HOSTNAME="vasja_pupkin.com; rm -rf /"
hostname ${HOSTNAME}

Не взлетит:

$ foo="bar; echo baz"
$ set -x
$ hostname $foo
+ hostname 'bar;' echo baz

А все потому, что шелл сначала определяет конец команды, а потом уже проводит все expansions и substitutions.

vadic
()
Ответ на: комментарий от vadic

Тут правда есть еще один момент: если противник контролирует dhcp-сервер


Противником может быть провайдер «бесплатного» WiFi и таким образом снабжать всех «Linux-оидов» троянами когда они будут пользоваться его сеткой.

anonymous
()
Ответ на: комментарий от anonymous

> Противником может быть провайдер «бесплатного» WiFi и таким образом снабжать всех «Linux-оидов» троянами когда они будут пользоваться его сеткой.

Нет никаких троянов тут, самое большее, на что эта фигня способна, это DoS.

vadic
()
Ответ на: комментарий от anonymous

> Противником может быть провайдер «бесплатного» WiFi и таким образом снабжать всех «Linux-оидов» троянами когда они будут пользоваться его сеткой.

А это идея! У меня как раз открытая сетка вифи.

anonymous
()
Ответ на: комментарий от anonymous

Ну вставь пробел перед ;

И что это даст?

$ foo="bar ; echo baz"
$ set -x
$ hostname $foo
+ hostname bar ';' echo baz

Все равно, когда подставляются переменные, точка с запятой уже не распознается как конец команды.

vadic
()

В генте заквочено. Опять феил.

Nao ★★★★★
()
Ответ на: комментарий от vadic

Я делал cd / && echo.... :)
Я понимаю что делает эта команда, но повторюсь - даже на ляптоповом 320GB харде с мизерной 5400 скоростью ничего страшного не случилось.

arknir
()
Ответ на: комментарий от anonymous

при условии если у меня линукс наружу торчит и используется именно dhclient.

у меня статика и внешник :)
плюс фраерволльчик и прочие радости жизни.

tazhate ★★★★★
()

И после этого кто-то еще на Си гнать будет с переполнением буферов. Вон на bash даже поле не пахано.

ostin ★★★★★
()
Ответ на: комментарий от user_id_68054

вообще нельзя писать скрипты на баш. Там даже если стреляешь себе в ногу попадаешь в яйца.

anonymous
()

Так посоны.Поясните меня что не так HOSTNAME=«vasya.cc.local; ls -l» hostname ${HOSTNAME}

Но оно мне просто пишет что не верный ключ «l» То есть ничего не выполняется.

polovinamozga
()

Непонятки

Я правильно понимаю, что для того, чтобы это использовать, в dhclient.conf должно стоять request host-name?

lfhn
()

dhcp3 (3.1.3-2ubuntu3.1) lucid-security; urgency=low

* SECURITY UPDATE: arbitrary code execution via crafted hostname - debian/patches/CVE-2011-0997.dpatch: filter strings in client/dhclient.c, common/options.c. - CVE-2011-0997  — Marc Deslauriers <email address hidden> Mon, 11 Apr 2011 08:57:21 -0400

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.