Не знаю, почему, но эту новость я читал с улыбкой. Пусть оба проекта и компания, их объединившая, живут, процветают и делают работу простых смертных удобной.
Конечно, можно (и даже нужно, ибо правильнее) сделать красивую обертку, написать парсер конфига, man-страницу и прочее… Но ведь целью было не создание полноценного файрвола, а создание препятствия для одного-единственного скрипта, а также простой пример перехвата.
А для того, чтобы не «потерять» этот файрвол в системе, достаточно использовать LD_PRELOAD не для всей системы, а непосредственно перед вызовом скрипта, тогда найти и устранить проблему не будет слишком сложно.
А с проверкой действительно сплоховал. Безусловно, там стоило ее поставить.
Если верить man'у и методу тыка, то ни RTLD_CONNECT, ни RTLD_GLOBAL функции dlsym не передаются. Передавать ей можно либо RTLD_DEFAULT, либо RTLD_NEXT.
Если использовать первый, то точка входа будет искаться в нормальном порядке, т.е. сначала в нашей билиотеке, затем во всех остальных. А поскольку в нашей библиотеке есть эта точка входа, то именно она и вызовестся. Что произойдет в таком случае? Правильно, бесконечная рекурсия.
Для того, чтобы этого не было и стоит использовать RTLD_NEXT, который «пропускает» нашу библиотеку и поиск начинает со следующей в списке.
А вот насчет проверки возвращаемого значения действительно проглядел, каюсь.
Да, ваше решение действительно элегантнее. Но есть одна неувязка: что делать, если программа, которую нужно блокировать, будет запускаться от разных пользователей/групп?
В старых версиях ядра была такая опция, как --pid-owner и --cmd-owner. Теперь их, к сожалению, убрали.
[оффтоп]
Не подскажите, чем вы подсвечивали исходник в статье?
[/оффтоп]
P.S. Пафосно, но иначе сказать не могу.
Чем-то напомнило…
Конечно, можно (и даже нужно, ибо правильнее) сделать красивую обертку, написать парсер конфига, man-страницу и прочее… Но ведь целью было не создание полноценного файрвола, а создание препятствия для одного-единственного скрипта, а также простой пример перехвата.
А для того, чтобы не «потерять» этот файрвол в системе, достаточно использовать LD_PRELOAD не для всей системы, а непосредственно перед вызовом скрипта, тогда найти и устранить проблему не будет слишком сложно.
А с проверкой действительно сплоховал. Безусловно, там стоило ее поставить.
Если использовать первый, то точка входа будет искаться в нормальном порядке, т.е. сначала в нашей билиотеке, затем во всех остальных. А поскольку в нашей библиотеке есть эта точка входа, то именно она и вызовестся. Что произойдет в таком случае? Правильно, бесконечная рекурсия.
Для того, чтобы этого не было и стоит использовать RTLD_NEXT, который «пропускает» нашу библиотеку и поиск начинает со следующей в списке.
А вот насчет проверки возвращаемого значения действительно проглядел, каюсь.
В старых версиях ядра была такая опция, как --pid-owner и --cmd-owner. Теперь их, к сожалению, убрали.