符号链接攻击

admin 2026-09-14 04:23:43 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文档系统阐述符号链接攻击的原理、常见攻击场景(如路径遍历、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 创建。

三、符号链接攻击原理

符号链接攻击的核心思想是:让高权限程序以为自己正在访问一个正常路径,实际上通过符号链接被重定向到攻击者指定的位置。

典型攻击流程:

  1. 攻击者在能够控制的目录下创建符号链接或 junction 点。
  2. 符号链接指向高权限目录或敏感文件。
  3. 高权限程序收到用户可控的路径请求。
  4. 程序没有检测符号链接,直接跟随链接访问目标。
  5. 实际访问的是攻击者指定的位置,导致文件被读取、写入或删除。

例如,普通用户在临时目录创建 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 特权,因此在本地攻击中更常用。

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&nbsp;(attrs&FILE_ATTRIBUTE_REPARSE_POINT) {
&nbsp; &nbsp;&nbsp;// 是重解析点,可能是 junction 或符号链接
}

查询 Reparse Tag:

HANDLE h = CreateFileW(path, FILE_READ_ATTRIBUTES,
&nbsp; &nbsp; FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
&nbsp; &nbsp; NULL, OPEN_EXISTING,
&nbsp; &nbsp; 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,
&nbsp; &nbsp; buffer, sizeof(buffer), &bytes, NULL);

DWORD tag = *(DWORD *)buffer;
if (tag == IO_REPARSE_TAG_MOUNT_POINT) {
&nbsp; &nbsp; // 是 junction 点
}

5.7 安全打开目录

如果程序需要进入一个目录但不希望跟随 junction,可以在打开时指定 FILE_FLAG_OPEN_REPARSE_POINT 标志:

HANDLE hDir = CreateFileW(path, GENERIC_READ,
&nbsp; &nbsp; FILE_SHARE_READ, NULL, OPEN_EXISTING,
&nbsp; &nbsp; FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);

这样打开的是 junction 本身,不会解析到目标目录。


六、Linux 符号链接攻击

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 |
&nbsp; &nbsp; Select-Object FullName, Target, Attributes

检查关键路径是否被 junction 指向:

$targets = @(
&nbsp; &nbsp; "C:\Windows\System32",
&nbsp; &nbsp; "C:\Windows\SysWOW64",
&nbsp; &nbsp; "C:\Program Files"
)

Get-ChildItem -Path C:\Users -Recurse -Attributes ReparsePoint -ErrorAction SilentlyContinue |
&nbsp; &nbsp; Where-Object { $_.Target -in $targets } |
&nbsp; &nbsp; Select-Object FullName, Target

十、符号链接攻击利用链示例

一个典型的本地提权利用链如下:

  1. 普通用户确定一个以高权限运行的服务会访问用户可控目录。
  2. 用户在该目录下创建 junction,指向系统目录。
  3. 用户诱导服务执行文件写入操作。
  4. 服务跟随 junction,把文件写入系统目录。
  5. 用户通过 DLL 劫持或服务配置篡改进一步获得高权限执行。
  6. 下一次高权限程序启动时执行恶意代码,完成权限提升。

十一、学习与研究场景

符号链接攻击研究适合在以下场景进行:

  • 自己拥有的隔离测试环境。
  • 获得书面授权的渗透测试。
  • 公开 CTF 题目。
  • 厂商官方漏洞赏金计划。
  • 学术研究和论文复现。

十二、法律提醒

⚠️ 符号链接攻击、junction 点攻击、TOCTOU 攻击、硬链接攻击等属于本地提权和沙箱逃逸技术。未经授权对他人系统、服务或文件系统进行测试和利用,可能违反《网络安全法》《刑法》等法律法规。

合法使用场景包括:自己拥有所有权的设备和软件、获得书面授权的渗透测试、公开 CTF 题目、厂商官方漏洞赏金计划、学术研究。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:归不去的光影 《符号链接攻击》

符号链接攻击 网络安全文章

符号链接攻击

文章总结: 本文档系统阐述符号链接攻击的原理、常见攻击场景(如路径遍历、TOCTOU、沙箱逃逸、服务提权等)、Windowsjunctionpoint详解、Li
评论:0   参与:  0