LINUX.ORG.RU

lddsafe — безопасный аналог ldd

 , lddsafe,


0

0

Узнав о уязвимости ldd, опубликованной несколько дней назад тут (новость на ЛОРе, в толксах), линуксоид rg3 написал небольшой скрипт lddsafe, выводящий ту же информацию, что и ldd. Скрипт использует objdump и безопасен, так как не запускает на исполнение проверяемую программу.

Два важных предостережения:

  • для работы необходим bash версии 4.0 или поздней (для быстрого выполнения в скрипте используются ассоциативные массивы, доступные только в bash 4);
  • скрипт проверен только в Slackware Linux (однако багрепорты и патчи принимаются, если он не работает должным образом в других дистрибутивах).

В будущем планируется переписать скрипт на Perl, чтобы он не зависел от версии bash 4.0.

Пример выполнения скрипта:

$ lddsafe /usr/bin/xcalc
        libXaw.so.7 => /usr/lib/libXaw.so.7
        libXmu.so.6 => /usr/lib/libXmu.so.6
        libXt.so.6 => /usr/lib/libXt.so.6
        libSM.so.6 => /usr/lib/libSM.so.6
        libICE.so.6 => /usr/lib/libICE.so.6
        libc.so.6 => /lib/libc.so.6
        ld-linux.so.2 => /lib/ld-linux.so.2
        libuuid.so.1 => /lib/libuuid.so.1
        libX11.so.6 => /usr/lib/libX11.so.6
        libxcb.so.1 => /usr/lib/libxcb.so.1
        libXau.so.6 => /usr/lib/libXau.so.6
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6
        libdl.so.2 => /lib/libdl.so.2
        libXext.so.6 => /usr/lib/libXext.so.6
        libXpm.so.4 => /usr/lib/libXpm.so.4
        libm.so.6 => /lib/libm.so.6

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

★★★★★

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

lddsave — безопасный аналог ldd

У меня только один вопрос. Почему это не сделали 5-10 лет назад? Потенциальная опасность известна уже давно.

krege
()

lddsave — безопасный аналог ldd

~/bin :$set |grep BASH_VERSION
BASH_VERSION='4.0.35(2)-release'
~/bin :$lddsafe /bin/bash
~/bin :$lddsafe /bin/cat
~/bin :$lddsafe /usr/bin/obj
objcopy objdump
~/bin :$lddsafe /usr/bin/objdump


что то не работает он у меня

Sylvia ★★★★★
()
Ответ на: lddsave — безопасный аналог ldd от krege

lddsave — безопасный аналог ldd

Почему это не сделали 5-10 лет назад?

Зачем?

Потенциальная опасность известна уже давно.

Кстати я так и не понял: в чём именно заключается опасность стандартного ldd?

Deleted
()
Ответ на: lddsave — безопасный аналог ldd от Deleted

>Зачем?

И сам же

>Кстати я так и не понял: в чём именно заключается опасность стандартного ldd?

Т.е., про саму опасность в курсе.

Так в чём вопрос? Зачем закрывать потенциальную дыру? А правда, вот ведь селинуксовцы дурью маются.

krege
()
Ответ на: lddsave — безопасный аналог ldd от Sylvia

lddsave — безопасный аналог ldd

опасность в том что можно подсунуть бинарник с измененным dynamic linker и при выполнении ldd на него, выполнится код этого линкера

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

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

lddsave — безопасный аналог ldd

Понял уже =).

Deleted
()
Ответ на: lddsave — безопасный аналог ldd от Sylvia

lddsave — безопасный аналог ldd

вот такое там есть...

Dynamic Section: NEEDED libncurses.so.5 NEEDED libdl.so.2 NEEDED libc.so.6

В скрипте жёстко задано с какой позиции в строке начинается имя библиотеки. Я уже отправил автору три патча, в твоём случае должен помочь последний.

From 5b525c9c893603c5725465854dbd451bd8000dad Mon Sep 17 00:00:00 2001
From: Ivan Mironov <mironov.ivan@gmail.com>
Date: Sun, 1 Nov 2009 19:20:11 +0500
Subject: [PATCH 1/2] Added bash version check

---
 lddsafe |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/lddsafe b/lddsafe
index be277e6..a7a47fe 100755
--- a/lddsafe
+++ b/lddsafe
@@ -8,24 +8,29 @@
 # Better for grep and expected output of other tools.
 export LANG=C
 
+# Print error and exit.
+die()
+{
+	echo "ERROR: $1" 1>&2
+	exit 1
+}
+
 # Check file exists and is executable.
 checkexec()
 {
-	if [ ! -x "$1" ]; then
-		echo "ERROR: $1 missing or not executable" 1>&2
-		exit 1
-	fi
+	[ ! -x "$1" ] && die "$1 missing or not executable"
 }
 
 # Check file exists and is readable.
 checkreadable()
 {
-	if [ ! -r "$1" ]; then
-		echo "ERROR: $1 missing or not readable" 1>&2
-		exit 1
-	fi
+	[ ! -r "$1" ] && die "$1 missing or not readable"
 }
 
+# Check for bash version.
+[ -z "$BASH_VERSION" ] && die "Bash required"
+[ ${BASH_VERSINFO[0]} -lt 4 ] && die "Bash version 4 or later required"
+
 # Check needed programs.
 checkexec /usr/bin/objdump
 checkexec /bin/cat
-- 
1.6.2.5

From 26b088ecf485994aa3c1f7c7c6aef40405e0fea3 Mon Sep 17 00:00:00 2001
From: Ivan Mironov <mironov.ivan@gmail.com>
Date: Sun, 1 Nov 2009 19:33:19 +0500
Subject: [PATCH 2/2] Don't hardcode paths to programs

---
 lddsafe |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/lddsafe b/lddsafe
index a7a47fe..1978c2f 100755
--- a/lddsafe
+++ b/lddsafe
@@ -15,6 +15,12 @@ die()
 	exit 1
 }
 
+# Find required program.
+findexec()
+{
+	which "$1" || die "$1 not found"
+}
+
 # Check file exists and is executable.
 checkexec()
 {
@@ -32,11 +38,11 @@ checkreadable()
 [ ${BASH_VERSINFO[0]} -lt 4 ] && die "Bash version 4 or later required"
 
 # Check needed programs.
-checkexec /usr/bin/objdump
-checkexec /bin/cat
-checkexec /bin/tr
-checkexec /bin/grep
-checkexec /bin/cut
+OBJDUMP=$( findexec objdump )
+CAT=$( findexec cat )
+TR=$( findexec tr )
+GREP=$( findexec grep )
+CUT=$( findexec cut )
 
 # Check needed files.
 checkreadable /etc/ld.so.conf
@@ -58,8 +64,8 @@ done
 
 # Library directories.
 libdirs="$( echo /lib /lib64 /usr/lib /usr/lib64 && \
-            /bin/cat /etc/ld.so.conf && \
-	    /bin/tr : ' ' <<<$LD_LIBRARY_PATH )"
+            $CAT /etc/ld.so.conf && \
+	    $TR : ' ' <<<$LD_LIBRARY_PATH )"
 
 # Search for a given library name.
 searchlib()
@@ -83,8 +89,8 @@ declare -A visitedlibs
 # Print dependency results, recursively.
 recursivedeps()
 {
-	for lib in $( /usr/bin/objdump -p "$1" | \
-			/bin/grep '^  NEEDED ' | cut -c24- ); do
+	for lib in $( $OBJDUMP -p "$1" | \
+			$GREP '^  NEEDED ' | $CUT -c24- ); do
 		if [ ! "${visitedlibs[$lib]}" ]; then
 			visitedlibs["$lib"]=1
 			file=`searchlib "$lib"`
-- 
1.6.2.5
From 61cf207eb8918417016f63802d529dddebf56c9f Mon Sep 17 00:00:00 2001
From: Ivan Mironov <mironov.ivan@gmail.com>
Date: Sun, 1 Nov 2009 20:22:00 +0500
Subject: [PATCH 3/3] Use sed instead of grep and cut

---
 lddsafe |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/lddsafe b/lddsafe
index 1978c2f..7233772 100755
--- a/lddsafe
+++ b/lddsafe
@@ -41,8 +41,7 @@ checkreadable()
 OBJDUMP=$( findexec objdump )
 CAT=$( findexec cat )
 TR=$( findexec tr )
-GREP=$( findexec grep )
-CUT=$( findexec cut )
+SED=$( findexec sed )
 
 # Check needed files.
 checkreadable /etc/ld.so.conf
@@ -90,7 +89,7 @@ declare -A visitedlibs
 recursivedeps()
 {
 	for lib in $( $OBJDUMP -p "$1" | \
-			$GREP '^  NEEDED ' | $CUT -c24- ); do
+			$SED -n 's,^ *NEEDED *\([^ ]*\) *$,\1,p' ); do
 		if [ ! "${visitedlibs[$lib]}" ]; then
 			visitedlibs["$lib"]=1
 			file=`searchlib "$lib"`
-- 
1.6.2.5
Deleted
()

lddsave — безопасный аналог ldd

Кстати, у меня (Fedora) tr лежит в /usr/bin, пришлось патчить.

krege
()

Не пробовали вообще линукс не использовать. чтобы не заморачиваться с безопасностью ldd ?

Есть много других удачных систем без подобной проблемы

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

>Есть много других удачных систем без подобной проблемы

но с морем других проблем

Genuine ★★★
()

А недостаточно ли просто запускать ldd не от рута, а от того же пользователя, которому принадлежит файл?

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

>А недостаточно ли просто запускать ldd не от рута, а от того же пользователя, которому принадлежит файл?

Если файл прислали по почте - вот, мол, посмотри, какие ему библиотеки надо? Иногда и запуска под простым юзером достаточно для компрометирования системы.

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

Если файл прислали по почте - вот, мол, посмотри, какие ему библиотеки надо?

Слабый развод. Ответ будет: «запусти ldd /your/file и посмотри»

sdio ★★★★★
()

Идиотизм.
В первом же комменте к сообщению об уязвимости было написано, как обезопасить ldd. Простенький скрипт на sh в несколько строчек.

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

rm -rf ~/ будет достаточо для печали?

Ну сценарий был: Вася звонит админу и жалуется на проблемы с запуском его программы. Админ заходит рутом делает ldd /home/vasea/app и Вася радуется.

Теперь в том же сценарии админ заходит рутом, делает

# su - vasea
$ ldd /home/vasea/app

И Вася резко печалится.

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

>И Вася резко печалится.

Вот бы посмотреть!!!

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

>Админ заходит рутом делает ldd /home/vasea/app и Вася радуется.

А потом приходит СБ с паяльником и админом, и Вася начинает грустить.

anonizmus
()

> В будущем планируется переписать скрипт на Perl, чтобы он не зависел от версии bash 4.0.

Кто-нибудь, скажите автору

1. Что он идиот.
2. Что прела чуть более одной версии.

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

>Кто-нибудь, скажите автору

>1. Что он идиот.


Это было видно из его неумения пользоваться readelf :D

Вместо простенькой функции на десять строчек, которая проверяет лоадер бинарника, он городит собственный гигантский лисапед на эзотерическом языке. баш4, ага. Может, сразу уайтспейс?

It's true windows way, huh!

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

>Линуксойд, сплойт. Откуда такая любовь к "й"? :)

Имхо линускоид — звучит, а сплоит — нет. И, судя по устоявшимся вариантам написания означенных слов, это имхо большинства :)

nnz ★★★★
()

на будующее - если в какой-то софтине обнаружен баг - ни в коем случае не исправляйте этот баг! Напишите свою софтину, с блекджеком и зависимостями от bash-4.0 или, что гораздо лучше, от жирного perl'а!

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

>и зависимостями от явы

fixed.

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

на будующее - если в какой-то софтине обнаружен баг - ни в коем случае не исправляйте этот баг! Напишите свою софтину, с блекджеком и зависимостями от bash-4.0 или, что гораздо лучше, от жирного perl'а!

Ради интереса, посмотри исходники ldd.

Deleted
()

а этот супер-пупер lddsafe ловит LD_LIBRARY_PATH и т.п.?

а вообще, как уже заметили, ТС просто делать нечего, если он такой <censored> занимается.

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

а что там смотреть то? 138 строк, включая коментарии

О том и речь.

Deleted
()

>линуксоид rg3 написал небольшой скрипт lddsafe

>для работы необходим bash версии 4.0 или поздней

>скрипт проверен только в Slackware Linux

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

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

Увы, не катит. Это только его прямые зависимости. А если бы тут была какая-нибудь libfoo.so.1, зависящая от libbar.so.2? Показало бы только первую.

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

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

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

>Правильно, есть устоявшееся слово "exploit".

А также distribution, repository, computer, keyboard, etc.

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

И неправильно это — ответы оппонента удалять ;)

nnz ★★★★
()
Ответ на: lddsave — безопасный аналог ldd от Deleted

Как человек, занимающийся этим вопросом,
скажите мне, почему нельзя просто "ld.so --list"
использовать?
---
$ /lib64/ld-linux-x86-64.so.2 --list `which egrep`
linux-vdso.so.1 => (0x00007fff973ea000)
libpcre.so.0 => /lib64/libpcre.so.0 (0x00007f887419b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8873e2d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f88743f9000)
---

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

Как человек, занимающийся этим вопросом,

Не не не, мопед не мой =). Думаю Silvy в этом больше разбирается.

скажите мне, почему нельзя просто «ld.so --list» использовать?

Подозреваю, что получим ту же проблему, т.к. скорее всего и в этом случае ld.so запустит бинарник.

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

> Подозреваю, что получим ту же проблему, т.к. скорее
> всего и в этом случае ld.so запустит бинарник.
Ну я "strace -f" на это хозяйство делал -
вроде, не запускает на выполнение. Да и
зачем ему самому запускать - ведь, в конечном
итоге, он же зависимости и выводит, когда ldd
бинарник "запускает". Это и есть тот самый
dynamic linker, который должен переменную
проверить. Ему, как бы, запускать не резон.
Отправил вопрос автору скрипта. :))

anonmyous
()

Идея-то хорошая, но зависимость на bash, да ещё и 4.0 -- не хорошо. У кого-то просто нет баша или настолько свежего баша, а кто-то и вовсе не любит баш.

php-coder ★★★★★
()
Ответ на: комментарий от anonmyous

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

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

В том смысле, что все остальные
ldd запускать и так не пытается,
и по этому для них скрипт не нужен.

anonmyous
()

>В будущем планируется переписать скрипт на Perl, чтобы он не зависел от версии bash 4.0.

зацени сколько весит баш и перл. потом купи учебник по Си 198х года, прочитай его, и перепиши на Си, школота.

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