如何禁用环境变量LD_LIBRARY_PATH对应用程序的影响?
禁用LD_LIBRARY_PATH影响的实现方案
- 启动脚本直接清空环境变量
这是成本最低的方案,直接在你的应用启动脚本最开头添加unset LD_LIBRARY_PATH即可,无论外部传入的该变量值是什么,应用启动时都会直接清除,不会传递给进程。如果是systemd管理的服务,还可以在service配置的[Service]段添加Environment="LD_LIBRARY_PATH="强制覆盖为空。 - 编译时硬编码库搜索路径并设置高优先级
编译应用时给链接器传入参数,将你的预设库路径写入二进制的RPATH段,优先级高于LD_LIBRARY_PATH:
该配置下动态链接器会优先搜索你硬编码的路径,再读取LD_LIBRARY_PATH的配置,就算攻击者设置了该变量,只要你的预设路径下存在对应库,就不会用到变量指定路径的库。gcc 你的源码.c -o 输出二进制 -Wl,-rpath=/你的/预设/库路径 -Wl,--disable-new-dtags - 已编译好的二进制修改RPATH
不想重新编译的话可以用patchelf工具直接修改现有二进制的库搜索配置:
效果和编译时加参数完全一致。patchelf --set-rpath /你的/预设/库路径 --force-rpath 你的应用二进制路径 - 静态编译应用
直接将依赖的库全部静态编译进二进制,应用运行时完全不需要调用动态链接器加载外部库,自然就不受LD_LIBRARY_PATH的任何影响。 - 全系统范围禁用
如果你确认整个系统都不需要用到该环境变量,可以在全局shell配置文件/etc/profile、/etc/bash.bashrc末尾添加unset LD_LIBRARY_PATH,所有用户登录时都会自动清除该变量。
内容的提问来源于stack exchange,提问作者S D
相关产品推荐
相关产品推荐

