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)

ООО! Пока своего провайдера ломать )) Жалко, что толку мало и, что там работаю ((

Nilus
()

Это даже не решето, это что-то совершенно невообразимое.

Ramen ★★★★
()

олололо :)
как круто что я не использую dhcp нигде, кроме как дома во внутренней сетке :)
а вот прова сломать было бы ололо.
хотя я сомневаюсь что эта дырка есть где-то кроме как в dhclient

tazhate ★★★★★
()

так ведь проблема то на клиентах, а не на сервере.
клиентов dhcp надо обновлять

Atlant ★★★★★
()

Хм... В Ubuntu 10.04 в /sbin/dhclient-script (dhcp3-client 3.1.3-2ubuntu3) функции set_hostname нет, единственное упоминание new_host_name:

        if [ -n "$new_host_name" ]; then
            if [ ! -s /etc/hostname ]; then
                hostname "$new_host_name"
            fi
        fi
В Fedora 15 (dhclient 4.2.1-2) почти то же самое:
    if [ -n "${new_host_name}" ] && need_hostname; then
        hostname ${new_host_name} || echo "See -nc option in dhclient(8) man page."
    fi
IRL уязвимости нет?

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

Она есть =).

Но «работает» только если разрешено получение имени хоста по DHCP, что обычно не так.

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

Вот обязательно нужно, чтоб кто-нибудь подключенный с ним в один свич у провайдера (обычный неуправляемый, конечно) поднял свой dhcp-server и рассылал какие-надо пакеты. А у него при этом eth0 не был прописан в static.

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

спасибо за комплимент :)
как в адрес ISP, так и в мой :)

tazhate ★★★★★
()

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

Для перлоедов: обработка регэкспами к парсингу не относится.

anonymous
()

В дебиановском dhclient-script $new_host_name заквочен. Так что далеко не везде уязвимо.

vadic
()

dhcpcd - и ваши волосы станут мягкими и шелковистыми. :-)

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

IRL уязвимости нет?

В убунтовском варианте нет. А в федоровском таки есть.

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

EXPLOIT="Что тут должно быть?"
hostname ${EXPLOIT}

Deleted
()

в слаке вот:

  current_hostname=`hostname`
  if [ x$current_hostname = x ] || \
     [ x$current_hostname = "x(none)" ] || \
     [ x$current_hostname = xlocalhost ] || \
     [ x$current_hostname = x$old_host_name ]; then
    if [ x$new_host_name != x$old_host_name ]; then
      hostname "$new_host_name"
    fi
  fi

впрочем я dhcpcd юзаю в основном.

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

Сдается мне, я поторопился. Подумав, я, пожалуй, не вижу возможности remote code execution даже в федоровском варианте.

Присоединяюсь к вашему желанию увидеть работающий эксплойт. :)

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

> EXPLOIT=«`ls -la`»

Не взлетит. Parameter expansion и command substitution происходят на одном и том же шаге, поэтому вложенно не работают. Как мне кажется на данный момент, самое большее, что из этого можно выжать, это передать дополнительные параметры для hostname.

Может быть можно добиться DoS'а, если передать какой-нибудь -F <имя-файла-блокирующегося-при-чтении>.

vadic
()
Ответ на: комментарий от rapid
$ EXPLOIT="`touch /tmp/123.file`"
$ hostname ${EXPLOIT}localhost.localdomain
$ ls -la /tmp/123.file
-rw-r--r-- 1 username users 0 Apr 7 08:22 /tmp/123.file

Неа, не то. В этом случае touch выполняется при присвоении EXPLOIT=, а не при выполнении hostname.

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

В данном случае touch у вас выполняется в первой строке, а не во второй. :)

Попробуйте EXPLOIT='`touch /tmp/123.file`'

vadic
()

А кто вообще им пользуется ?

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

EXPLOIT=«Что тут должно быть?»

hostname ${EXPLOIT}

EXPLOIT='/etc/*'

Вот это уже интереснее. Но всё равно это не remote code execution, которое заявлено в новости.

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

> Вот не нравился мне dhclient.. dhcpcd лучше :)

dhclient зато более гибок, именно из-за dhclient-script.

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

А, ну да, это вариант. Правда это будет работать, опять же, только в тех дистрибутах, где $new_host_name незаквочен.

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

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

vadic
()

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

т.е. уязвимость в скрипто писателе и команде разрабов дистриба. кто же такой ужасный скрипт написал?

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

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

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

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

Насколько я понимаю, нет. Наверное можно придумать какое-нибудь расширение для dhcp с цифровыми подписями, но, думаю, это будет нетривиально, учитывая существование dhcp-релеев, которые могут модифицировать пакеты по пути.

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

Ничего страшного не происходит.

Уверен?

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

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

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