LINUX.ORG.RU
 
aydar

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


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

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


[#]  
krege

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

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

* ()
[#]  

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

lddsafe
а не save )

***** ()
[#]  

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


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

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от krege 01.11.2009 15:46:41  
mironov_ivan

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

>>-----Цитата---->>

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

<<-----Цитата----<<

Зачем?

>>-----Цитата---->>

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

<<-----Цитата----<<

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

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от Sylvia 01.11.2009 15:50:19  
mironov_ivan

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

>>-----Цитата---->>

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

<<-----Цитата----<<

Покажи что выдаёт objdump -p на эти бинарники.

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от mironov_ivan 01.11.2009 18:14:25  

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

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

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

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от mironov_ivan 01.11.2009 16:59:14  

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

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

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от mironov_ivan 01.11.2009 16:59:14  
krege

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

>Зачем?

И сам же

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

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

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

* ()
[#] Ответ на: lddsave — безопасный аналог ldd от Sylvia 01.11.2009 18:16:30  
mironov_ivan

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

>>-----Цитата---->>

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

<<-----Цитата----<<

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

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от Sylvia 01.11.2009 18:15:14  
mironov_ivan

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
***** ()
[#]  
krege

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

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

* ()
[#]  

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

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

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

anonymous ()
[#] Ответ на: lddsafe — безопасный аналог ldd от anonymous 01.11.2009 20:20:10  
Genuine

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

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

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

*** ()
[#]  

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

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

***** ()
[#] Ответ на: Re: lddsafe — безопасный аналог ldd от sdio 01.11.2009 20:41:45  
vigilante

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

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

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

()
[#] Ответ на: lddsafe — безопасный аналог ldd от vigilante 01.11.2009 21:07:15  

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

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

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

***** ()
[#]  
nnz

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

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

**** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от Frosty 01.11.2009 21:22:24  

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

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

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

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

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

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

***** ()
[#] Ответ на: Re: lddsafe — безопасный аналог ldd от sdio 01.11.2009 21:43:00  
anonizmus

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

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

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

* ()
[#]  

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

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

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

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

***** ()
[#] Ответ на: lddsave — безопасный аналог ldd от mironov_ivan 01.11.2009 16:59:14  

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

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

Его можно запустить !!11

***** ()
[#]  
Dimez

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

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

***** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от LamerOk 01.11.2009 22:26:59  
nnz

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

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

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


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

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

It's true windows way, huh!

**** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от Dimez 01.11.2009 22:35:20  
nnz

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

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

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

**** ()
[#]  
NekoExMachina

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

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

* ()
[#] Ответ на: lddsafe — безопасный аналог ldd от NekoExMachina 01.11.2009 23:43:51  
mironov_ivan

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

>>-----Цитата---->>

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

<<-----Цитата----<<

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

***** ()
[#]  
beastie

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

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

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

*** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от beastie 02.11.2009 0:46:39  
mironov_ivan

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

>>-----Цитата---->>

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

<<-----Цитата----<<

О том и речь.

***** ()
[#]  

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

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

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

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

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

***## ()
[#]  

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

~$ strings /bin/ls | grep '\.so\.'
/lib/ld-linux.so.2
librt.so.1
libselinux.so.1
libacl.so.1
libc.so.6

ибо нефиг

anonymous ()
[#]  
madcore

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

Тупняк какой-то.

***** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от anonymous 02.11.2009 7:57:44  
Rolex

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

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

* ()
[#] Ответ на: lddsafe — безопасный аналог ldd от Rolex 02.11.2009 10:00:55  
Cosmicman

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

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

** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от nnz 01.11.2009 23:31:16  
Dimez

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

>а сплоит — нет

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

***** ()
[#] Ответ на: Re: lddsafe — безопасный аналог ldd от Dimez 02.11.2009 10:36:15  
nnz

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

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

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

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

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

**** ()
[#] Ответ на: lddsave — безопасный аналог ldd от mironov_ivan 01.11.2009 18:38:27  

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

Как человек, занимающийся этим вопросом,
скажите мне, почему нельзя просто "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)
---

()
[#] Ответ на: Re: lddsave — безопасный аналог ldd от anonmyous 02.11.2009 14:12:25  
mironov_ivan

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

>>-----Цитата---->>

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

<<-----Цитата----<<

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

>>-----Цитата---->>

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

<<-----Цитата----<<

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

***** ()
[#] Ответ на: lddsafe — безопасный аналог ldd от mironov_ivan 02.11.2009 14:26:28  

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

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

()
[#]  
php-coder

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

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

***** ()
[#] Ответ на: Re: lddsafe — безопасный аналог ldd от anonmyous 02.11.2009 14:33:10  

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

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

()
[#] Ответ на: Re: lddsafe — безопасный аналог ldd от anonmyous 02.11.2009 15:57:32  

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

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

()
[#]  
scaldov

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

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

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

** ()