iron-mukakin/glassworm_scanner
GitHub: iron-mukakin/glassworm_scanner
一款用于检测源代码文件中隐藏的不可见 Unicode 字符的安全扫描工具,帮助发现利用零宽字符等技术在代码中隐蔽恶意内容的攻击行为。
Stars: 2 | Forks: 0
# GlassWorm Scanner
一款用于检测源代码文件中隐藏的不可见 Unicode 字符的安全扫描工具——无需管理员权限。
## 什么是 GlassWorm?
GlassWorm 是一种网络攻击技术,攻击者利用**不可见的 Unicode 字符**将恶意代码隐藏在看似正常的源文件中。
这些字符的视觉宽度为零,因此在编辑器、GitHub 代码审查界面和差异对比工具中完全不可见。审查者在查看代码时看不出任何异常,但当文件被执行时,隐藏的代码就会运行。
真实案例:在 GitHub 的一行代码中,曾被发现有 18,000 个连续隐藏的不可见字符。
此工具会扫描您的文件,并在发现此类字符时向您发出警报。
## 环境要求(一次性设置)
在构建扫描器之前,您需要两款免费工具。
### 1. Visual Studio 2022
- 从 https://visualstudio.microsoft.com/ 下载
- 在安装过程中,选择 **"Desktop development with C++"** 工作负载
- 这将提供 Rust 在 Windows 上所需的链接器
### 2. Rust
- 从 https://rustup.rs/ 下载安装程序
- 运行并选择 **选项 1 "Proceed with standard installation"**
- 安装完成后,打开新的命令提示符并输入 `rustc --version` 以确认其正常工作
## 构建扫描器
1. 打开 **命令提示符**(无需管理员权限)
2. 导航至包含 `Cargo.toml` 的文件夹:
cd C:\path\to\glassworm_scanner_v3
3. 运行构建命令:
cargo build --release
4. 构建完成的 `.exe` 文件位于:
target\release\glassworm_scanner.exe
## 如何使用
双击 `glassworm_scanner.exe` 启动。无需安装。
### 操作步骤
| 步骤 | 操作内容 |
|------|-----------|
| 1 | 点击 **Scan Folder** 旁的 **Browse...**,选择您要检查的文件夹 |
| 2 | 设置 **File Extensions** —— 保留默认值以扫描常见的代码文件,或清除并输入您自己的扩展名(如 `.py .js`) |
| 3 | 设置 **Detection Threshold** —— 正常使用请保持为 **3** |
| 4 | 勾选 **Save Log** 并确认日志文件路径 |
| 5 | 点击 **Start Scan** |
### 扫描期间
| 按钮 | 作用 |
|--------|-------------|
| **Pause** | 完成当前文件处理后暂时冻结扫描。目前已找到的结果将被保留。 |
| **Resume** | 从暂停处继续扫描。 |
| **Stop** | 完成当前文件处理后取消扫描。目前已找到的结果将保存到日志中。 |
## 理解结果
### 未发现问题
```
Done -- No issues detected
```
所有扫描文件均显示正常。未发现超过您设定阈值的不可见字符。
### 发现问题 —— 阅读 [WARN] 条目
```
[WARN] C:\Projects\app\utils.py line 3 col 12 -- 520 consecutive char(s)
context: ...print("Hello, World!▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪")...
```
以下是各部分的含义:
| 部分 | 含义 |
|------|---------|
| `C:\Projects\app\utils.py` | 发现可疑字符的文件 |
| `line 3` | 该文件中的行号 |
| `col 12` | 从行首开始到不可见字符段开始之前的字符数 |
| `520 consecutive char(s)` | 连续出现的不可见字符数量 —— 520 个极其可疑 |
| `context: ...▪▪▪...` | 周围的可见文本。每个 **▪** 符号代表一个不可见字符 |
**当您看到 [WARN] 时该怎么做:**
1. 在文本编辑器中打开该文件
2. 跳转到报告的行号
3. 寻找视觉上看起来很短、但实际异常长的行
4. 使用十六进制编辑器(如 HxD,可免费下载)检查该位置的原始字节
5. 如果您确认存在可疑内容,请勿执行该文件,并向您的团队报告
## 阅读日志文件
日志文件(`.txt`)将保存到您指定的位置。它包含与屏幕上相同的信息,并进行了格式化以便于日后审查。
日志文件内容示例:
```
GlassWorm Scanner - Scan Report
Status : Complete
Date/Time : 2026-05-10 14:23:01
Target : C:\Projects\myapp
Threshold : 3 consecutive char(s)
Total files: 1247
Scanned : 1247
Hits : 2
------------------------------------------------------------
[WARN] C:\Projects\myapp\lib\parser.js
line: 7 col: 23 consecutive: 340
context: ...return result▪▪▪▪▪▪▪▪▪▪▪...
[WARN] C:\Projects\myapp\utils\helper.py
line: 3 col: 12 consecutive: 520
context: ...print("Hello"▪▪▪▪▪▪▪▪▪▪▪▪...)
```
**如果扫描提前停止:**
```
Status : STOPPED (incomplete)
Scanned : 412
```
这表示该日志仅覆盖了总计文件中的 412 个。请重新运行扫描以检查所有文件。
## 检测阈值指南
阈值控制在引发警告之前必须连续出现多少个不可见字符。
| 阈值 | 行为表现 |
|-----------|----------|
| 1 | 甚至连单个不可见字符也会标记 —— 非常敏感,可能会在某些大量使用 emoji 的文件中产生误报 |
| **3(默认)** | 推荐大多数用户使用 —— 能够捕获 GlassWorm 攻击,同时忽略罕见的合法用途 |
| 10 | 仅标记大量聚集的情况 —— 适用于对大型代码库的快速扫描 |
| 50 | 仅捕获极端情况(真实的攻击通常会嵌入数千个字符) |
实际中的 GlassWorm 攻击已使用了数百至数千个字符的序列。默认阈值 3 是安全且有效的。
## 检测到的字符类型
| Unicode 范围 | 名称 | 备注 |
|--------------|------|-------|
| U+FE00 – U+FE0F | Variation Selectors | 主要攻击向量 |
| U+E0100 – U+E01EF | Variation Selectors Supplement | 主要攻击向量 |
| U+200B | Zero Width Space | |
| U+200C | Zero Width Non-Joiner | |
| U+200D | Zero Width Joiner | |
| U+200E / U+200F | Left-to-Right / Right-to-Left Mark | |
| U+202A – U+202E | Bidirectional Control Characters | |
| U+2060 | Word Joiner | |
| U+FFF9 – U+FFFB | Interlinear Annotation Anchors | |
| U+E0000 – U+E007F | Tag Characters | |
## 使用内置测试文件进行测试
`test_target_hello.py` 是一个包含在压缩包中的安全虚拟文件,用于验证扫描器是否正常工作。
**测试文件的结构**
在真实的 GlassWorm 攻击中,不可见字符不会作为一大块直接堆砌——它们会被附加在看起来正常的代码行末尾。因为每个不可见字符紧跟在一个可见的基础字符之后,编辑器会将它们作为零宽度的字形变体处理,从而不渲染任何内容,使得 payload 在视觉上完全无法察觉。
这个测试文件复制了这种精确的结构。它看起来像是一个简短的 Python 函数调用,后跟 `print("Hello, World!")`。实际上,**有 7 行(第 14–20 行)在可见代码文本之后附加了 50 个连续的不可见 Variation Selector 字符(U+FE00–U+FE0F)**。在标准文本编辑器中打开该文件只会显示正常代码——不可见的 payload 不会出现。
**测试步骤:**
1. 将 **Scan Folder** 设置为包含 `test_target_hello.py` 的文件夹
2. 确保 `.py` 位于 **File Extensions** 列表中
3. 将 **Detection Threshold** 设置为 `3`
4. 点击 **Start Scan**
5. 您应该会看到 `test_target_hello.py` 的 **7 条 `[WARN]` 条目**,每个受影响的行(第 14–20 行)各一条,每条报告 50 个连续的不可见字符
如果全部 7 条警告都出现,说明扫描器工作正常。
## 致谢
- PowerShell 原始版本:`Scan-Glassworm.ps1`,作者 [@konapieces](https://x.com/konapieces)
- GlassWorm 研究:Aikido Security(2026 年 3 月),Koi Security(2025 年 10 月)
标签:DNS 反向解析, DNS 解析, GlassWorm, GUI工具, PFX证书, Rust, Unicode安全, 云安全监控, 代码审查, 代码隐藏, 可视化界面, 安全扫描, 安全防护, 提示注入防御, 攻击检测, 文件分析, 时序注入, 木马检测, 源代码安全, 终端安全, 编码安全, 网络安全, 网络流量审计, 通知系统, 隐形字符, 隐私保护, 静态分析