文章总结: 本文档系统阐述符号链接攻击的原理、常见攻击场景(如路径遍历、TOCTOU、沙箱逃逸、服务提权等)、Windowsjunctionpoint详解、Linux攻击手法、实际案例(如AdobeReader沙箱逃逸、runcCVE-2019-5736)及防御与检测方法,强调在授权环境下进行安全研究。 综合评分: 85 文章分类: 漏洞分析,二进制安全,web安全,安全工具
符号链接攻击
归不去的光影
2026年8月30日 09:44 内蒙古
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
符号链接攻击
本文档用于安全研究、漏洞分析和防御加固学习。
⚠️ 法律提醒:未经授权对他人系统、服务或文件系统进行符号链接攻击、本地提权或沙箱逃逸测试,可能违反《网络安全法》《刑法》等法律法规。请仅在自有环境、获得书面授权的测试范围、公开 CTF 题目或厂商官方漏洞赏金计划中使用相关知识。
一、符号链接攻击概述
符号链接攻击是一种利用操作系统文件系统链接机制,诱导高权限程序访问或修改攻击者控制路径的安全技术。它常用于本地提权、沙箱逃逸、权限绕过、文件覆盖等场景。
符号链接本身是正常的文件系统功能,但当高权限程序不正确地处理用户可控路径时,就可能被滥用,造成严重的安全后果。
二、什么是符号链接
符号链接是一种特殊文件,它指向另一个文件或目录。当程序访问符号链接时,操作系统会自动把访问重定向到目标路径。
Windows 上的链接类型
Windows 文件系统支持三种主要链接类型:
- Symbolic Link:符号链接,可指向文件或目录,支持跨卷和远程路径。创建文件符号链接需要
SeCreateSymbolicLinkPrivilege特权。 - Junction Point:目录连接点,只能指向本地目录。普通用户通常可以创建,因此是本地攻击中最常用的链接类型。
- Hard Link:硬链接,指向同一文件系统上的同一个文件。多个硬链接共享同一个文件内容和元数据。
创建命令示例:
mklink C:\link.txt C:\target.txt创建文件符号链接。mklink /D C:\dirlink C:\targetdir创建目录符号链接。mklink /J C:\junction C:\targetdir创建 junction 点。fsutil hardlink create C:\hlink.txt C:\target.txt创建硬链接。
Linux 上的链接类型
Linux 支持两种链接:
- Symbolic Link:符号链接,可指向文件或目录,支持跨文件系统。使用
ln -s创建。 - Hard Link:硬链接,只能指向同一文件系统内的文件。使用
ln创建。
三、符号链接攻击原理
符号链接攻击的核心思想是:让高权限程序以为自己正在访问一个正常路径,实际上通过符号链接被重定向到攻击者指定的位置。
典型攻击流程:
- 攻击者在能够控制的目录下创建符号链接或 junction 点。
- 符号链接指向高权限目录或敏感文件。
- 高权限程序收到用户可控的路径请求。
- 程序没有检测符号链接,直接跟随链接访问目标。
- 实际访问的是攻击者指定的位置,导致文件被读取、写入或删除。
例如,普通用户在临时目录创建 junction 指向系统目录,然后诱导以 SYSTEM 权限运行的服务向该路径写入文件,实际就写入了系统目录。
四、常见攻击场景
4.1 路径遍历与文件覆盖
攻击者控制一个目录路径,让高权限程序写入或删除系统文件。例如,攻击者创建 C:\Users\Alice\Temp\backup 指向 C:\Windows\System32,程序备份文件到该目录时实际覆盖了系统目录中的文件。
4.2 检查与使用时差攻击
程序先检查文件类型或权限,然后执行操作。攻击者在这两步之间替换文件或修改符号链接目标,从而绕过检查。
例如:
if (access("/tmp/userfile", R_OK) ==0) { // 检查时
fp=fopen("/tmp/userfile", "r"); // 使用时
}
攻击者先让符号链接指向普通文件通过检查,然后在打开前瞬间把目标改为敏感文件。
4.3 沙箱逃逸
低权限沙箱进程创建符号链接,诱导 Broker 高权限进程访问沙箱外路径。例如 Adobe Reader 的沙箱进程通过 IPC 让 Broker 写入文件,如果 Broker 跟随沙箱内创建的 junction,就能写入系统目录。
4.4 服务提权
Windows 服务通常以 SYSTEM 权限运行。如果服务接收用户可控路径并执行文件操作,可能被符号链接利用。常见结合点包括未引号服务路径、可写服务二进制路径、日志文件写入路径等。
4.5 安装程序与更新程序劫持
安装程序或更新程序临时解压文件到用户可控目录。攻击者创建符号链接,让解压文件实际写入系统目录,从而替换系统 DLL 或配置文件。
4.6 日志文件覆盖
某些程序以高权限写入日志文件,路径由用户控制。攻击者创建符号链接指向系统文件,导致系统文件被覆盖。
五、Windows Junction Point 详解
5.1 Junction Point 的特性
Junction Point 是 Windows NTFS 文件系统的一种重解析点,它可以把一个目录重定向到另一个本地目录。
关键特性:
- 只能指向本地目录。
- 普通用户通常可以创建,只需要对目标父目录有写入权限。
- 对大多数应用程序透明,程序会自动跟随 junction。
- 不需要 Symbolic Link 特权,因此在本地攻击中更常用。
5.2 Junction 与 Symbolic Link 的区别
Symbolic Link 可指向文件或目录,支持跨卷和网络路径,但创建需要特殊权限。Junction 只能指向本地目录,普通用户即可创建。在沙箱逃逸和本地提权场景中,junction 更实用。
5.3 Junction 的底层机制
Junction 使用 NTFS 重解析点机制。重解析点标签为 IO_REPARSE_TAG_MOUNT_POINT,值为 0xA0000003。
当程序访问 junction 目录时,NTFS 驱动发现该目录有重解析点,返回 STATUS_REPARSE 并把目标路径填入 I/O 请求包。I/O 管理器用新路径重新发起请求,最终访问到目标目录。整个过程对上层应用基本透明。
5.4 创建 Junction 的方法
使用命令行工具:
mklink/JC:\Users\Alice\junctionC:\Windows\System32
使用 PowerShell:
New-Item-ItemTypeJunction-PathC:\Users\Alice\junction-TargetC:\Windows\System32
使用 Sysinternals 工具:
junction.exeC:\Users\Alice\junctionC:\Windows\System32
使用底层 Win32 API 创建时,需要先创建空目录,然后使用 DeviceIoControl 发送 FSCTL_SET_REPARSE_POINT 控制码,设置重解析点数据。
5.5 检测 Junction 的方法
使用命令行:
dir/aC:\Users\Alice\junction
junction 会显示为 <JUNCTION>,并列出目标路径。
使用 fsutil:
fsutilreparsepointqueryC:\Users\Alice\junction
使用 PowerShell:
Get-ItemC:\Users\Alice\junction|Select-ObjectAttributes,Target
如果 Attributes 包含 ReparsePoint,说明是重解析点。
5.6 编程层面的检测
检查文件属性:
DWORDattrs=GetFileAttributesW(path);
if (attrs&FILE_ATTRIBUTE_REPARSE_POINT) {
// 是重解析点,可能是 junction 或符号链接
}
查询 Reparse Tag:
HANDLE h = CreateFileW(path, FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
DWORD bytes = 0;
DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0,
buffer, sizeof(buffer), &bytes, NULL);
DWORD tag = *(DWORD *)buffer;
if (tag == IO_REPARSE_TAG_MOUNT_POINT) {
// 是 junction 点
}
5.7 安全打开目录
如果程序需要进入一个目录但不希望跟随 junction,可以在打开时指定 FILE_FLAG_OPEN_REPARSE_POINT 标志:
HANDLE hDir = CreateFileW(path, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
这样打开的是 junction 本身,不会解析到目标目录。
六、Linux 符号链接攻击
6.1 Symlink 攻击
Linux 上普通用户很容易创建符号链接:
ln -s /etc/shadow /tmp/userfile
6.2 /tmp 目录攻击
很多程序在 /tmp 下创建临时文件。由于 /tmp 对所有用户可写,攻击者可以预测程序要创建的文件名,提前创建同名符号链接指向敏感文件,程序写入时就会覆盖敏感文件。
6.3 TOCTOU 攻击
利用检查与打开之间的时间差,攻击者先让符号链接指向合法文件通过检查,然后在打开前瞬间把目标改为敏感文件。
6.4 硬链接攻击
如果内核参数 fs.protected_hardlinks 关闭,普通用户可以创建指向任意文件的硬链接。多个硬链接共享同一个文件内容和权限,可能导致权限绕过。
七、实际攻击案例
7.1 Adobe Reader 沙箱逃逸
Adobe Reader 的沙箱进程运行在 Low Integrity。攻击者在沙箱内创建 junction 指向系统目录,然后通过 IPC 让 Broker 进程写入文件。Broker 跟随 junction,实际写入系统目录,从而实现沙箱逃逸。
7.2 runc 容器逃逸 CVE-2019-5736
runc 容器逃逸漏洞主要利用 /proc/self/exe,但其中也涉及符号链接和文件替换思想。攻击者在容器内操作,让 runc 覆盖宿主机上的自身二进制文件。
7.3 Windows 服务未引号路径提权
大量 Windows 服务存在未引号路径问题,配合符号链接或硬链接可实现本地提权。
7.4 反病毒软件本地提权
某些杀毒软件以 SYSTEM 权限扫描用户目录。攻击者创建 junction 指向系统目录,触发杀毒软件对系统文件的误操作。
八、防御方法
8.1 路径规范化
在访问文件前使用绝对路径和规范化函数,确认最终路径在允许范围内。
Windows 上可以使用 GetFullPathName 或 GetFinalPathNameByHandle。Linux 上可以使用 realpath。注意解析后可能仍需要进一步检查。
8.2 不要跟随符号链接
打开文件时指定不跟随标志:
- Windows:
FILE_FLAG_OPEN_REPARSE_POINT - Linux:
O_NOFOLLOW
这样打开的是符号链接本身,而不是目标文件。
8.3 使用文件描述符而非路径
Linux 上可以用 openat 加 /proc/self/fd 方式避免 TOCTOU:
fd = openat(dirfd, filename, O_NOFOLLOW);
// 后续操作都基于 fd,不重新解析路径
8.4 检查文件所有者
操作前确认文件属于预期用户,防止硬链接攻击。
8.5 避免使用用户可控路径
不要把用户输入直接拼接到文件路径中。
8.6 Windows 特定防护
- 使用
SeCreateSymbolicLinkPrivilege限制符号链接创建。 - 在沙箱中禁用 junction 创建能力。
- 使用
GetFileInformationByHandle检查文件 ID,识别硬链接。
8.7 Linux 特定防护
- 开启内核保护参数:
sysctl -w fs.protected_symlinks=1
sysctl -w fs.protected_hardlinks=1
- 使用
O_TMPFILE创建匿名临时文件。 - 使用
openat2的RESOLVE_NO_SYMLINKS标志。
九、检测方法
9.1 代码审计
检查以下危险模式:
- 使用用户输入拼接路径。
access检查后open。- 没有使用
O_NOFOLLOW或FILE_FLAG_OPEN_REPARSE_POINT。 - 临时文件创建在不安全目录。
9.2 动态检测
- 使用 ProcMon 监控符号链接创建和目标访问。
- 使用 Syscall 监控工具观察
NtCreateSymbolicLinkObject。 - 使用 PowerShell 扫描用户目录中的重解析点。
9.3 PowerShell 扫描示例
扫描用户目录中的 junction 和符号链接:
Get-ChildItem -Path C:\Users -Recurse -Attributes ReparsePoint -ErrorAction SilentlyContinue |
Select-Object FullName, Target, Attributes
检查关键路径是否被 junction 指向:
$targets = @(
"C:\Windows\System32",
"C:\Windows\SysWOW64",
"C:\Program Files"
)
Get-ChildItem -Path C:\Users -Recurse -Attributes ReparsePoint -ErrorAction SilentlyContinue |
Where-Object { $_.Target -in $targets } |
Select-Object FullName, Target
十、符号链接攻击利用链示例
一个典型的本地提权利用链如下:
- 普通用户确定一个以高权限运行的服务会访问用户可控目录。
- 用户在该目录下创建 junction,指向系统目录。
- 用户诱导服务执行文件写入操作。
- 服务跟随 junction,把文件写入系统目录。
- 用户通过 DLL 劫持或服务配置篡改进一步获得高权限执行。
- 下一次高权限程序启动时执行恶意代码,完成权限提升。
十一、学习与研究场景
符号链接攻击研究适合在以下场景进行:
- 自己拥有的隔离测试环境。
- 获得书面授权的渗透测试。
- 公开 CTF 题目。
- 厂商官方漏洞赏金计划。
- 学术研究和论文复现。
十二、法律提醒
⚠️ 符号链接攻击、junction 点攻击、TOCTOU 攻击、硬链接攻击等属于本地提权和沙箱逃逸技术。未经授权对他人系统、服务或文件系统进行测试和利用,可能违反《网络安全法》《刑法》等法律法规。
合法使用场景包括:自己拥有所有权的设备和软件、获得书面授权的渗透测试、公开 CTF 题目、厂商官方漏洞赏金计划、学术研究。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:归不去的光影 《符号链接攻击》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论