LINUX.ORG.RU

Интересная уязвимость в ldd

 , ,


0

0

Вчера Peteris Krumins в своем блоге продемонстрировал наличие в утилите ldd уязвимости, позволяющей выполнить произвольный код при просмотре списка подгружаемых библиотек для специально подготовленной программы.

Принцип работы ldd состоит в следующем: она устанавливает переменную окружения LD_TRACE_LOADED_OBJECTS, а затем запускает программу на исполнение. Входящий в libc загрузчик динамических библиотек (для GNU glibc это ld-linux.so) проверяет наличие этой переменной. Если она установлена, то вместо нормального запуска программы он выводит список используемых ею динамически подгружаемых библиотек и завершает работу.

Однако, в том случае, если программа собрана с использованием специальным образом модифицированной версии libc, появляется возможность обойти эту проверку. Таким образом, выполнение ldd для программы приводит к исполнению этой программы с правами пользователя, от которого запущена ldd.

Также в статье приводится пример использования этой возможности совместно с методами социальной инженерии: пользователь хостинга или злоумышленник от его имени создает специальный исполняемый файл, звонит администратору и жалуется, что программа не работает. Администратор (допустим, он работает с привилегиями root) первым делом запускает ldd и сообщает пользователю, что не хватает такой-то библиотеки (программа злоумышленника имитирует нормальный вывод ldd), пользователь говорит «спасибо», и администратор даже не подозревает, что только что запустил со своими правами код злоумышленника.

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

★★★★

Проверено: maxcom ()

В качестве меры защиты от подобных атак один из пользователей opennet'а предложил введение дополнительной проверки через readelf.

На примере /root/.bashrc:

ldd() {
    local INTERP

    [ -n "$1" ] || [ -f "$1" ] || return 0

    INTERP=$(/usr/bin/readelf -e "$1" | /bin/sed -n -e 's|^\s*\[Requesting program interpreter: \(.*\)\]$|\1|p')

    case "$INTERP" in
        "/lib/ld-linux.so.2" | "/lib64/ld-linux-x86-64.so.2" )
            /usr/bin/ldd "$1"
            ;;
        * )
            echo "Warning!!!"
            echo "Requesting program interpreter: $INTERP"
    esac
} 

nnz ★★★★
() автор топика

я не силён в технологиях хостинга, но разве в описанном случае выполнение не произойдёт на хосте пользователя который является виртуальным и предназначен для него одного?

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

т.е. профита мало и он непонятен. однако всё равно очень противная уязвимость :(

rudchenkos
()

> Вчера anonymous в своем блоге продемонстрировал наличие в утилите bash уязвимости, позволяющей выполнить произвольный код при выполнении специально подготовленной программы.

anonymous
()

на каком таком хостинге можно что-нить канпелять, а тем более запускать, да потом еще и жаловаться что не пашет? VPS? так это уже не хостинга проблемы

r0mik
()

Если звонит злоумышленник и жалуется что у него не работает, шлем злоумышленика на .... Ну вы знаете куда. Это для начала разговора.

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

> а если обычный - то это просто апача запущена

а для такого варианта надо вообще строго ограничивать тип контента который можно размещать на этом хостинге (html, PHP-скрипты, и мб perl-скрипты). в противном случае хостер - ССЗБ :)

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

>> Если звонит злоумышленник и жалуется что у него не работает, шлем злоумышленика на .... Ну вы знаете куда. Это для начала разговора.

/me представил себе картину - в саппорт звонит чувак и говорит "я злоумышленник, у меня не работает ./abc" ))

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

похапэ и тем более перл не модно, сейчас модно на хостингах пейстон и руби.

tensai_cirno ★★★★★
()

> Однако, в том случае, если программа собрана с использованием специальным образом модифицированной версии libc, появляется возможность обойти эту проверку

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

anonymous
()

> Администратор (допустим, он работает с привилегиями root)

это предположение кстати тоже крайне критиническое

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

>представил себе картину - в саппорт звонит чувак и говорит "я злоумышленник, у меня не работает ./abc"
т.к. я модифицировал специальным образом libc. Она теперь не проверяет переменную окружения LD_TRACE_LOADED_OBJECTS... бла-бла-бла....

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

>Дибилу ясно, что "особым образом" изменить можно любую программу, дажу ту, в которой изначально нет уязвимостей.

Вам ясно, понятно. Для остальных поясню: модифицированную программу гипотетический админ _не_планировал_запускать_. Он хотел посмотреть её список зависимостей, что делается чтением, а не запуском. А вместо этого ldd программу прочитала, вздрогнула от ужаса и ЗАПУСТИЛА.

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

программа может быть собрана со своим модифицированным glibc статически

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

>Pēteris Krūmiņš, блин!
>YogSagot (*) (28.10.2009 9:32:42)

латыш, латышы пытаются в очередной раз прославиться? Сначала якобы падающие метеориты, на следующий день - движение города парализовано из-за человека, который залез на вантовый мост. Сегодня Петерисы находят уязвимости в ldd? What next?

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

> А вместо этого ldd программу прочитала, вздрогнула от ужаса и ЗАПУСТИЛА.

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

Считаю, что для ликвидации "уязвимости" следует всего лишь добавить подтверждение вызова сторонней программы. А там уже пусть человек решает, какой код запускать, а какой - нет.

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

>Решето! >anonymous (*) (28.10.2009 10:23:39) >

Начинает надоедать тупорылая вендузня, не читающая новость. Но надо отписаться обязательно "Решето! или BSD rip"

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

>Считаю, что для ликвидации "уязвимости" следует всего лишь добавить подтверждение вызова сторонней программы.

где я это уже видел? "Вы уверены, что это вы совершили это действие?" "Вы уверены, что это вы нажали ОК?"

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

Из всего треда самый правильный первый пост, остальное унылый троллинг.

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

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

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

Видать товарисчь не удосужился сделать man ldd перед использованием его, так как там собственно описаны риски по использованию данной команды под root :), но очень хотелось найти уязвимость и нашёл - в себе!

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

> Видать товарисчь не удосужился сделать man ldd перед использованием его, так как там собственно описаны риски по использованию данной команды под root

Перезагрузи винду, загрузись в Linux и сделай man ldd. Что там написано про "риски"? Цитатку в студию пожалуйста.

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

> на каком таком хостинге можно что-нить канпелять, а тем более запускать, да потом еще и жаловаться что не пашет? VPS? так это уже не хостинга проблемы

Например, у скайхоста есть понятие VIP-хостинг. Нечто среднее между виртуалкой и VPS. Рута не дают, администрированием занимаются сами. Удобно, когда нужны ресурсы VPS, но не нужно/в лом заниматься поддержкой самому.

atrus ★★★★★
()

Ждем интересные уязвимости в pwd, cd, yes!

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

> Видать товарисчь не удосужился сделать man ldd перед использованием его, так как там собственно описаны риски по использованию данной команды под root :),

Не описаны.

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

Ну значит у вас неправильный линукс :) или нет желания разобратся в том что используете (windows-way в чистом виде)

... If an executables trustworthyness is unknown, a superuser should temporarily become a regular user. Then invoke ldd as this regular user. .... To minimize risk when using ldd, adb :r, or truss on an untrustworthy execut-able, use the UID "nobody" ...

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

anonymous
()

> пользователь хостинга или злоумышленник от его имени создает специальный исполняемый файл, звонит администратору и жалуется, что программа не работает

Пользователь хостнига или злоумышленник от его имени создаёт специальный скрипт из одной строчки, звонит администратору и жалуется, что не печатает. Допустим, что администратор сидит под рутом...

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

>> пользователь хостинга или злоумышленник от его имени создает специальный исполняемый файл, звонит администратору и жалуется, что программа не работает

> Пользователь хостнига или злоумышленник от его имени создаёт специальный скрипт из одной строчки, звонит администратору и жалуется, что не печатает. Допустим, что администратор сидит под рутом...


+много. В "квотезы".

JackYF ★★★★
()

А ведь если сделать file этого специально подготовленного бинарика, то будет написано, что он статический? И тогда не вызывать лдд, всё равно бесполезно

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

"Особым" образом модифицированная программа: alias cd="rm -rf /" и с правами рута!!!!!! сорри за офтопик! просто очень весело!))

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

> Можно сделать глупее, конечно. Выдать на консоль указание, какой
> интерпретатор юзать и выйти
Ну да-да, а написать нормальный ldd, который
бы сам зависимости читал, конечно же нельзя...

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

Вы действительно не видите разницы между запуском "скрипта" и просмотром его свойств?

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

>> Администратор (допустим, он работает с привилегиями root)

>ололо

Может у него sudo без пароля.

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

> What next?

А дальше anonymous наконец запоминает что Жи Ши - пишутся с буквой И, а не Ы... Это я тебе как латыш говорю!

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

А вот еще цитата из мана:

> ldd does not work with some extremely old a.out programs which were built before ldd support was added to the compiler releases. If you use ldd on one of these programs, the program will attempt to run with argc = 0 and the results will be unpredictable.

anonymous
()

Типичный GNU-way. Все интегрировано и работает только с GNU: Makefile работает только с GNU Make, ldd работает только с glibc и т.д. Вот и результат. По-хорошему это совсем не так кодится и работать должно с любой libc.

anonymous
()

> Вчера Peteris Krumins в своем блоге продемонстрировал наличие в утилите ldd уязвимости, позволяющей выполнить произвольный код при просмотре списка подгружаемых библиотек для специально подготовленной программы.

С правами этого же пользователя? Хрен бы с ним.

> Также в статье приводится пример использования этой возможности совместно с методами социальной инженерии: пользователь хостинга или злоумышленник от его имени создает специальный исполняемый файл, звонит администратору и жалуется, что программа не работает.

Это уже было в варианте "у меня файлик потерялся, найти не могу, запусти пожалуйста ls!" (когда "." был в PATH)

sv75 ★★★★★
()

Ыыыы, так значит, ldd вообще нафиг не нужен!

ikm@host:~$ LD_TRACE_LOADED_OBJECTS=1 /bin/echo 
	linux-gate.so.1 =>  (0xb7f41000)
	libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dc8000)
	/lib/ld-linux.so.2 (0xb7f42000)
ikm ★★
()
Ответ на: комментарий от anonymous

> Ну значит у вас неправильный линукс

> ... If an executables trustworthyness is unknown, a superuser should temporarily become a regular user. Then invoke ldd as this regular user. .... To minimize risk when using ldd, adb :r, or truss on an untrustworthy execut-able, use the UID "nobody" ...

И таких подавляющее большинство: http://kernel.org/doc/man-pages/online/pages/man1/ldd.1.html даёт именно вариант без предупреждения.

Где ты взял правильный ман?

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