Обнаружил, что под Solaris и Linux вызов ldd реально вызывает анализируемый процесс. Таким образом, нарушается концепция защиты, что не может не огорчать.
Доказательство под Солярис:
Здравствуйте, Vamp, Вы писали:
V>Обнаружил, что под Solaris и Linux вызов ldd реально вызывает анализируемый процесс. Таким образом, нарушается концепция защиты, что не может не огорчать.
Здравствуйте, Vamp, Вы писали:
V>Интересно, а зачем он ls зовет?
В смысле, как запуск процесса помогает определить, список модулей?
Возможно, родителя пинают при загрузке. Точнее, скорее, не родителя, а отладчик. Я недостаточно знаю unix, чтобы быстренько разобраться по этому трейсу в том, что делает ldd, так что на уровне гипотезы.
SH>В смысле, как запуск процесса помогает определить, список модулей?
Нет, в смысле, что ты трассил /bin/sh:
$ truss -fa -o truss.txt ldd /bin/sh
SH>Возможно, родителя пинают при загрузке.
В Linux (там ldd — скрипт, все видно глазами) выставляется переменная окружения. Возможно, что солярка и фри делают то же самое.
SH>А что за переменная? Почему от неё такой интересный эффект?
LD_TRACE_LOADED_OBJECTS.
Вызывает особое поведение загрузчика по умолчанию, который, однако можно и поменять. В солярке та же самая, я проверил только что.
Здравствуйте, Vamp, Вы писали:
SH>>А что за переменная? Почему от неё такой интересный эффект? V>LD_TRACE_LOADED_OBJECTS. V>Вызывает особое поведение загрузчика по умолчанию, который, однако можно и поменять. В солярке та же самая, я проверил только что.
Здравствуйте, Vamp, Вы писали:
V>Обнаружил, что под Solaris и Linux вызов ldd реально вызывает анализируемый процесс. Таким образом, нарушается концепция защиты, что не может не огорчать. V>Доказательство под Солярис:
чем это? а как ты думал он работает?
фтыкать первый абзац здесь например (статейка тоже не оч радостная но по кр мере развеит твою печаль относительно того что `ldd` якобы кавота запускает...
Здравствуйте, Vamp, Вы писали:
V>Ну скажи уродцы, а?
Подумать надо.
Механизм, конечно, кривой ужасно. Это с одной стороны. С другой -- универсальный способ настройки загрузчика вместо специального инструмента. С третьей -- не должен загрузчик этим заниматься, ну, это очень необычно для него. С четвёртой -- за у него это хорошо получается и добавить было несложно, и гарантируется аналогичное поведение.
Z>чем это? а как ты думал он работает? Z>фтыкать первый абзац здесь например (статейка тоже не оч радостная но по кр мере развеит твою печаль относительно того что `ldd` якобы кавота запускает...
s/абзац/параграф/
... ну вот пока искал пруфлинки тебе уже раскрыли тайну
Z>чем это?
Неконтроллируемое исполнение произвольного кода. Особенно прекрасно, если ldd запустит рут, но даже и под обычным пользователем тоже несладко.
Z>а как ты думал он работает?
Я думал, что он анализирует заголовок файла.
Z>фтыкать первый абзац здесь например (статейка тоже не оч радостная но по кр мере развеит твою печаль относительно того что `ldd` якобы кавота запускает...
С чего бы она ее развеяла? Она только подтверждает мою правоту.
Здравствуйте, Vamp, Вы писали:
V>Обнаружил, что под Solaris и Linux вызов ldd реально вызывает анализируемый процесс. Таким образом, нарушается концепция защиты, что не может не огорчать.
И почему ты думаешь, что она нарушается?
Если загрузчику сказано не делать реальный запуск, этого вполне достаточно. Заметь, что sugid запрещает такие действия вместе с запуском в этом случае.
Здравствуйте, Vamp, Вы писали:
Z>>чем это? V>Неконтроллируемое исполнение произвольного кода. Особенно прекрасно, если ldd запустит рут, но даже и под обычным пользователем тоже несладко.
ldd проверяет, что у бинарника надлежащий загрузчик.
Подмена, конечно, возможна, но не считается существенной проблемой.
N>ldd проверяет, что у бинарника надлежащий загрузчик.
В какой системе? Как именно он это делает? В Linux скрипт, там я вижу, что он ничего не проверяет.
Здравствуйте, Vamp, Вы писали:
N>>ldd проверяет, что у бинарника надлежащий загрузчик. V>В какой системе? Как именно он это делает? В Linux скрипт, там я вижу, что он ничего не проверяет.
RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2"
[...]
ret=1
for rtld in ${RTLDLIST}; do
if test -x $rtld; then
verify_out=`${rtld} --verify "$file"`
ret=$?
case $ret in
[02]) RTLD=${rtld}; break;;
esac
fi
done
case $ret in
[02])
try_trace "$RTLD" "$file" || result=1
;;
1)
# This can be a non-ELF binary or no binary at all.
nonelf "$file" || {
echo $" not a dynamic executable"
result=1
}
;;
по-моему, всё просто и ясно.
У меня Alt сизифовый конца прошлого года (между бранчами 5.0 и 5.1)
N>У меня Alt сизифовый конца прошлого года (между бранчами 5.0 и 5.1)
А там выше по ветке есть ссылка, из которой следует, что ничего он не проверяет? Кому верить?
Кроме того, из твоего кода не вполне очевидно, как он может проверить намеренно испорченный загрузчик. Сдается мне, он просто проверяет валидность сигнатур. Ты можешь проверить пример из ссылки? Интересно узнать, как это сработает у тебя.
Да здравствует мыло душистое и веревка пушистая.
Re: А сколько нам отличий чудных
От:
Аноним
Дата:
04.02.10 08:27
Оценка:
Здравствуйте, Vamp, Вы писали:
V>Обнаружил, что под Solaris и Linux вызов ldd реально вызывает анализируемый процесс. Таким образом, нарушается концепция защиты, что не может не огорчать.
"Реально вызывает" — что это? Можете развёрнуто написать?
Ну-ка, попробуйте запустить под ldd файл main() { return system("touch /tmp/ldd"); } и после ls /tmp/ldd
V>Я опечален.
Прежде чем печалиться, советую почитать man elf (в линуксе) и обратить внимание на секцию, описывающую INTERP хедер.