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