软链接劫持攻击本质是辅助性技术,防御核心在于阻断其利用的权限路径和执行上下文:需收紧临时目录权限、禁用非授权用户创建软链接、最小权限运行脚本、启用fs.protected_symlinks内核防护、审计可疑软链接创建行为,并在程序中使用O_NOFOLLOW或realpath等机制加固。

软链接劫持攻击本身不是直接的权限提升手段,而是常被用作辅助技术——比如绕过路径校验、隐藏恶意文件位置、或配合LD_PRELOAD等机制实现函数劫持。真正的防御核心不在于“禁止软链接”,而在于**阻断其被恶意利用的权限路径和执行上下文**。
严格控制敏感目录的写权限
攻击者要实施软链接劫持,必须能在目标程序读取路径前,将合法文件替换成指向恶意内容的软链接。这通常依赖于对日志目录、临时目录(/tmp、/var/tmp)、配置目录(如/etc)等的写入能力。
- 将全局可写的临时目录权限收紧:sudo chmod 1777 /tmp(保留sticky bit,防止非属主删除他人文件)
- 禁用普通用户在系统关键目录创建软链接:例如,对/etc下子目录设置不可写(chmod 755),并确保属组不包含非授权用户
- 避免使用root身份运行监控类、日志轮转类脚本;若必须,应以最小权限用户运行,并通过chroot或命名空间隔离其可访问路径
启用内核级防护:fs.protected_symlinks
现代Linux内核(≥3.5)提供sysctl参数,能从根本上限制软链接的解析行为:
- 启用后,仅当进程与目标文件位于同一挂载点且拥有对目标路径的可执行权限时,才允许解析软链接
- 执行命令启用:sudo sysctl -w fs.protected_symlinks=1
- 永久生效:echo "fs.protected_symlinks = 1" | sudo tee -a /etc/sysctl.conf
审计与监控可疑软链接创建行为
重点不是查“有没有软链接”,而是查“谁在不该建的地方建了什么”:
- 定期扫描高风险目录中的软链接:find /tmp /var/tmp /dev/shm -type l -ls 2>/dev/null
- 结合auditd监控符号链接操作:sudo auditctl -a always,exit -F arch=b64 -S symlink -S symlinkat -k symlink_attack
- 检查/var/log/audit/audit.log中含“symlink”和“key=symlink_attack”的记录,重点关注非root用户在系统目录下的创建动作
程序开发侧加固:避免路径拼接+启用O_NOFOLLOW
防御需延伸到应用层。许多劫持成功,源于程序未校验open()或stat()调用是否落在真实文件上:
- 在C代码中打开文件时,显式添加O_NOFOLLOW标志:open("/path/to/file", O_RDONLY | O_NOFOLLOW)
- Shell脚本中避免直接使用$PATH变量拼接路径;改用绝对路径或校验:[ -L "$file" ] && echo "拒绝软链接" && exit 1
- 对于需要处理用户输入路径的服务(如Web上传解析器),应在解析前调用realpath -e验证路径真实性

















