AlloySecureGroup/BlinkLinkSentiennel
GitHub: AlloySecureGroup/BlinkLinkSentiennel
BindlinkSentinel 是一个运行于 Windows 用户态的防御性检测工具,通过签名验证、哈希基线对比、诱饵监控和驱动状态检查来发现利用 Bind Filter minifilter 的绑定链接滥用这一 EDR 规避技术。
Stars: 3 | Forks: 3
# BindlinkSentinel
BindlinkSentinel 是一个运行于用户态的原型检测传感器,用于发现 Windows 上的**绑定链接滥用**(Bitdefender Labs 在 2026 年 7 月 15 日由 Martin Zugec 等人发表的 *Bind Link Abuse: One Windows Feature, Many Ways to Blind Your EDR* 中记录的 EDR 规避技术)。
BindlinkSentinel 是一款**防御性**工具。它会检测受信任路径的重定向、监控诱饵并确认 Bind Filter 驱动程序的状态。它不会创建绑定链接,也不包含任何规避攻击手段。如果要在实验室中对其进行测试,请使用 Bitdefender 公开发的 `bindutil` 工具生成测试映射,并将传感器指向受影响的路径。
## 背景
Windows 内置了一种文件系统虚拟化功能——Bind Filter minifilter (`bindflt.sys`),它可以在不触碰原始文件或在磁盘上留下持久化痕迹的情况下,在内存中将一个本地路径重定向到另一个路径。Store 应用、Windows Sandbox 和 Windows 容器都会合法使用该功能。Bitdefender 记录了具有本地管理员权限的攻击者可利用此原理构建的三种技术:
1. **文件绑定(File-Binding)。** 受信任的文件或 DLL 路径会返回由攻击者控制的内容。可击败 AMSI、用户态 EDR 传感器以及取证文件收集。
2. **进程绑定(Process-Binding)。** 启动受信任的可执行文件路径,但实际运行的是不同的镜像。可击败镜像路径白名单以及签名或策略检查。
3. **Silo 绑定(Silo-Binding)。** 通过 Silo 范围链接和反向全局链接将文件系统拆分为两个视图,使得 payload 在 Silo 内运行,而外部工具重新打开相同路径时看到的依然是干净文件。可击败 AppLocker、Windows 防火墙、Sysmon 哈希校验和异步重新扫描。
这些技术的共同点在于:许多安全逻辑的起点都是基于某个路径,并假定该路径映射到所有人都认为它映射的文件。而绑定链接打破了这一假设。
## 防御理念
攻击者的隐蔽性取决于防御者是否盲目信任报告的路径,而从不向驱动程序查询现存哪些映射。BindlinkSentinel 基于用户态可获取的信号进行工作:
- **签名验证。** 使用 `WinVerifyTrust` 对每个受监控的受信任路径进行 Authenticode 检查。重定向到未签名的 payload 会破坏验证。这是抗篡改能力最强的信号,因为针对 payload 伪造有效的 Microsoft 签名的门槛远高于仅仅替换哈希值。
- **哈希基线对比。** 使用 SHA-256 对每个受监控路径进行哈希处理,并与从已知干净镜像中捕获的基线进行对比。受信任文件上的影子绑定链接会表现为不再匹配的哈希值。
- **诱饵监控。** 监控作为诱饵的文件和目录。正常情况下没有任何合法程序会触碰它们,因此任何更改都会被视为安全事件。
- **驱动程序状态。** 传感器会确认 `bindflt` 服务状态,并为枚举实时映射提供一个明确的集成点。
## 仓库内容
| 文件 | 语言 | 用途 |
| --- | --- | --- |
| `bindlink_sentinel.cpp` | C++ (Win32) | 原生原型。使用 `WinVerifyTrust`、BCrypt SHA-256、`ReadDirectoryChangesW` 和 `fltlib`。 |
| `BindlinkSentinel.cs` | C# 5 / .NET Framework 4.8 | 托管移植版。通过 P/Invoke 调用 `WinVerifyTrust`,使用 `SHA256`、`FileSystemWatcher` 和 `ServiceController`。不使用字符串插值。 |
| `BindlinkSentinelSim.cs` | C# 5 / .NET Framework 4.8 | 测试工具。在临时沙盒中模拟影子绑定链接在文件层的效果,并断言检测逻辑能做出反应。不创建绑定链接,不需要管理员权限。 |
这两个版本的传感器共享相同的设计和配置模型。请根据您的部署环境选择合适的版本。模拟器是一个独立的测试工具,用于验证检测逻辑。
## 检测信号及其作用
| 信号 | 捕获内容 | 备注 |
| --- | --- | --- |
| 受信任路径上的签名失效 | 针对未签名 payload 的文件绑定、进程绑定 | 最强单一信号。 |
| 哈希偏离基线 | 受信任文件上的影子绑定链接,或磁盘篡改 | 需要干净的基线。 |
| 触碰诱饵 | 针对诱饵的侦察或环境部署 | `FileSystemWatcher` 能捕获创建、修改、删除和重命名操作,但无法捕获纯粹的读取。 |
| 实时映射枚举 | 任何重定向,包括 Silo 加反向全局链接对 | 保真度最高,无需基线。作为集成点保留。 |
## 编译
### C++
在 x64 Developer Command Prompt 中执行:
```
cl /EHsc /std:c++17 bindlink_sentinel.cpp ^
wintrust.lib crypt32.lib bcrypt.lib fltlib.lib shlwapi.lib
```
### C#
在 Developer Command Prompt 中,切换至该文件所在目录执行:
```
csc /langversion:5 /target:exe /out:BindlinkSentinel.exe ^
/reference:System.ServiceProcess.dll BindlinkSentinel.cs
```
## 使用方法
请以管理员权限运行。首先在受信任且已知干净的系统中捕获基线,然后再进行监控。
```
BindlinkSentinel.exe baseline
BindlinkSentinel.exe monitor
```
C++ 版本使用相同的两个命令。
基线数据将写入 `C:\ProgramData\BindlinkSentinel\baseline.txt`,格式为 `path`,后跟 `hash|signed`。请修改源代码顶部的监控列表和诱饵列表以匹配您的环境,包括 EDR 传感器的 DLL 目录以及您关注的任何产品路径。
## 配置
这两种实现方式都在源代码顶部附近提供了两个列表:
- **监控列表(Watchlist)。** 攻击者可能进行影子替换的受信任路径。默认包含 `amsi.dll`、`ntdll.dll` 以及 System32 中的伪装二进制文件,如 `winver.exe`、`tiworker.exe` 和 `wscript.exe`。
- **诱饵目录(Decoy directories)。** 您布下的看似合理的诱饵,例如虚假的 EDR 传感器目录或虚假的凭据存储。
## 枚举集成点
保真度最高的检测方式是枚举实时的绑定链接映射(包括全局和 Silo 范围),因为它不需要基线,并且能捕获基线扫描容易遗漏的 Silo 范围加反向全局链接对。该函数在这两个文件中均被刻意保留为未实现状态。
枚举操作需要连接到 `bindflt` 的通信端口并发送枚举控制代码,其消息布局因版本而异且未被完全公开记录。确切的端口名称、控制代码和回复解析方式应从 `bindutil` 源码中获取,而不应靠盲目猜测。C# 文件中已经声明并准备好了两个 `fltlib` P/Invoke 调用,C++ 文件中也标记了对应的钩子。当映射源是受监控的受信任路径、或是受签名系统二进制文件上的影子链接、亦或是 Silo 范围链接与同一文件对的反向全局链接成对出现时,应将该映射标记为可疑。
## 测试
测试分为两个层级。第一级验证检测逻辑,不需要管理员权限、不需要 `bindflt`,也不需要真实的绑定链接。第二级在隔离的实验室中验证真实的驱动程序路径。
### 第一级:模拟测试工具
对于用户态读取程序而言,受信任路径上的影子绑定链接表现为:字节内容不再匹配干净基线,且签名不再通过验证。`BindlinkSentinelSim.cs` 通过在临时沙盒中对文件建立基线,然后替换其内容来重现这种可观察到的效果,随后断言扫描和诱饵逻辑能做出反应。它不会创建绑定链接,也不会重定向任何真实的系统路径。
编译并运行:
```
csc /langversion:5 /target:exe /out:BindlinkSentinelSim.exe BindlinkSentinelSim.cs
BindlinkSentinelSim.exe
```
它会运行三项检查,为每个断言打印 `PASS` 或 `FAIL`,如果其中任何一项失败就会以非零状态退出,因此可以完美适配 CI 环境:
1. **签名检查器健全性。** 验证真实的已签名系统二进制文件通过验证,而随机数据块未通过。
2. **受信任路径重定向模拟。** 将已签名的二进制文件复制到沙盒中,并将其基线标记为干净且已签名。干净的扫描应当是静默的。当文件被覆写以模拟重定向后,扫描会同时触发哈希偏离和签名无效警报。
3. **诱饵监控。** 检测对诱饵文件的触碰操作。
所有操作都在 `%TEMP%\BindlinkSentinelSim` 目录下进行,并在退出时被删除。这种模拟方式与真实绑定链接唯一的区别在于,它会替换磁盘上的字节内容,而真实的链接不会修改原文件,只是在内存中重定向读取操作。这种差异对用户态传感器是不可见的,因为无论哪种方式,传感器看到的都是相同的偏离哈希和失效的签名。但这对于枚举路径确实有影响,这也是为什么该部分需要进行第二级测试的原因。
### 第二级:实验室环境
为了验证真实的驱动程序路径以及实现后的映射枚举集成点,请在一次性、带有快照的虚拟机中使用 Bitdefender 官方工具集重现该技术,然后将 BindlinkSentinel 指向受影响的路径。请务必使用无害的受监控路径和无害的诱饵后备文件,绝不要使用其重定向会导致宿主失去保护的路径,也不要在您珍视的物理机上进行测试。
- **bindutil 工具集:** https://github.com/bitdefender/bindutil-toolset
- `bindutil` 实用程序仅供研究和防御性测试使用。它直接针对 `bindflt.sys` 手动构建绑定链接请求,因此无需额外库即可跨 Windows 版本工作。您需自行确保您的使用方式符合相关法律法规和组织的规定。
## 局限性
- 具有本地管理员权限的攻击者同样可以终止用户态代理或向其喂入虚假数据,因此请将 BindlinkSentinel 视为多层防御中的一环,而非终极解决方案。具备防篡改能力的内核态传感器强度要高得多。
- 哈希对比依赖于可信的基线。请在干净镜像上捕获基线,最好在离线状态下进行。
- `FileSystemWatcher` 和 `ReadDirectoryChangesW` 不会在纯读取操作时触发。要检测攻击者仅打开诱饵文件的行为,请在诱饵上配置 SACL 以启用对象访问审核并监控 Security 事件日志,或者使用内核组件。
- Windows 24H2 中阻止对受保护路径创建绑定链接的限制仅能提供部分防御。它在旧版 Windows 中并不存在,仅针对启动分区上的链接触发,且可以被绕过。请将您自己的代理文件保留在启动卷上以确保该限制生效,且不要仅依赖它。
- 在系统遭到入侵后,应将所有文件系统虚拟化层都视为受攻击者控制的状态,而不仅仅是 `bindflt.sys`。
## 适用范围
本项目特意仅实现检测和欺骗功能。它不会创建绑定链接、影子替换受信任的二进制文件,也不会重现这三种规避技术中的任何一种。在实验室中测试检测功能时,请使用 `bindutil` 进行创建操作。
## 参考
- Bitdefender Labs, *Bind Link Abuse: One Windows Feature, Many Ways to Blind Your EDR*, 2026年7月15日。 https://www.bitdefender.com/en-us/blog/businessinsights/bind-link-abuses-windows-feature-edr-evasion-technique
- Bitdefender, *bindutil-toolset*(仅限研究和防御性测试)。 https://github.com/bitdefender/bindutil-toolset
## MITRE ATT&CK 背景
绑定链接滥用跨越了多种技术,而不是仅仅映射到某一项。BindlinkSentinel 旨在保护的控制措施会受到多种技术的攻击,其中包括但不限于:T1562.001(Impair Defenses)、T1574.001 和 T1574.002(Hijack Execution Flow)、T1036.005(Masquerading)以及 T1070.001(Indicator Removal: Clear Windows Event Logs)。
## 免责声明
本工具仅供防御性研究和测试使用。您需自行确保您的使用方式符合相关法律法规及所在组织的规定。
标签:漏洞靶场, 用户态传感器, 端点检测与响应, 绑定过滤器监控, 脱壳工具, 防御检测