Можно ли сделать переменные среды неизменяемыми?
С недавним обнаружением уязвимости Symbiote стало очевидно, что нам нужны меры по смягчению последствий атак с внедрением LD_PRELOAD и тому подобных. Один из способов предотвратить эту эксплуатацию — установитьLD_PRELOAD
и другие переменные, влияющие на безопасность, являются неизменяемыми.
Есть ли какие-либо средства для этого через SELinux, AppArmor, пространства имен, cgroups или любой другой механизм?
1 ответ
Переменные среды на самом деле не являются объектами, они похожи на второй массив аргументов, который можно передать в exec(). LSM, такие как AppArmor, могут фильтровать переменные среды, унаследованные от exec, хотя с AppArmor я не уверен, можно ли это сделать глобально (это доступно для каждого профиля).
Другим решением проблемы может быть поддержка ваших собственных сборок glibc с исправленной функциональностью LD_PRELOAD.ld.so
полностью.
В ld.soglibc уже есть проверки для игнорирования LD_PRELOAD при загрузке исполняемого файла 'setuid', поэтому любые такие переменные среды будут неэффективны против инструментов 'sudo' или 'su'. Это также можно в некоторой степени использовать для защиты «ssh» — дайте ему безвредную возможность, например «cap_net_broadcast=p», или назначьте ему безвредную группу, и он станет невосприимчивым к LD_PRELOAD.
Библиотеку необходимо откуда -то загрузить, поэтому необходимо смонтировать все доступные для записи места.noexec
должно помочь, поскольку он не позволяет ld.so создавать сопоставления исполняемых файлов в этих файловых системах и, следовательно, не только запускать исполняемые файлы, но и загружать библиотеки из файловой системы noexec.
Неясно, каким образом вредоносная программа заставляет первоначально устанавливать переменные среды, то есть влияют ли они наinit
сами по себе или они влияют только на процессы пользовательской оболочки. Если они не влияют на init, его можно попросить запустить новый процесс в чистой среде — например, с помощью systemd ничего не просачивается из вызывающего systemctl в службу.