Обнаружил, что под 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)