Я пишу приложение, которое имеет библиотеки Python и C ++. Часть Python должна отправлять и получать необработанные пакеты, поэтому я даю исполняемому файлу Python CAP_NET_RAW
возможность.
Я также загружаю разделяемые библиотеки C ++ с Cython в той же программе. Я хочу скомпилировать совместно используемые библиотеки с относительными путями для зависимостей, т.е. использовать $ORIGIN
специальная переменная.
Тем не менее, потому что Python имеет CAP_NET_RAW
Linux воспринимается как setuid
программа и игнорирует $ORIGIN
строка внутри определений зависимостей общих библиотек, поэтому они не могут загрузить:
В целях безопасности динамический компоновщик не позволяет использовать
$ORIGIN
последовательности замещения для программ-идентификаторов пользователя-пользователя и группы-набора. Для таких последовательностей, которые появляются внутри строк, указанныхDT_RUNPATH
записи динамического массива, конкретный путь поиска, содержащий$ORIGIN
последовательность игнорируется (хотя другие пути поиска в той же строке обрабатываются).$ORIGIN
последовательности вDT_NEEDED
запись или путь, переданный в качестве параметраdlopen()
рассматриваются как ошибки. Те же самые ограничения могут быть применены к процессам, которые имеют более чем минимальные привилегии в системах с установленными расширенными механизмами безопасности.
Эта функция безопасности причиняет нам много боли. Мы должны скомпилировать разделяемые библиотеки с полными путевыми зависимостями, и они не переносимы между машинами разработки.
Есть ли способ отключить эту функцию безопасности в Linux, чтобы $ORIGIN
будет интерпретироваться для программ с дополнительными возможностями?
Задача ещё не решена.