wunderwuzzi23/aid
GitHub: wunderwuzzi23/aid
一个用于检测文件中不可见 Unicode 字符的安全审计工具,旨在识别 ASCII 走私、隐藏数据编码及可疑 Unicode 使用模式。
Stars: 30 | Forks: 6
# AID
此工具使用 OpenAI Codex 和 Claude Code 创建。
这是一个用于检测文件中不可见 Unicode 字符的工具,旨在识别潜在的 ASCII 走私企图、隐藏数据编码和可疑的 Unicode 使用模式。
## 功能
- 🔍 **全面检测**:扫描 Unicode 标签、零宽字符、方向标记和变体选择符
- 🎯 **智能分析**:自动对连续字符进行分组并评估可疑级别
- 📊 **多种输出格式**:CSV(默认)、JSON 和人类可读的文本报告
- 🔢 **Unicode 标签解码**:自动将 Unicode 标签序列解码为 ASCII
- 📈 **紧凑结构化报告**:每个文件一行/一个对象,包含计数、字符类型、最长连续段和注释
- 🚀 **快速扫描**:跳过二进制文件和排除的目录(可配置)
## 安装
```
# Clone 仓库
git clone https://github.com/wunderwuzzi23/aid.git
cd aid
# 使脚本可执行
chmod +x aid
# 运行它
./aid --target /path/to/scan
```
**环境要求:** Python 3.6+
## 用法
### 基本用法
```
# 扫描目录(默认写入 ./aid-report.csv)
./aid --target ./my-project
# 带进度指示器扫描
./aid --target ./my-project --verbose
# 以不同格式输出
./aid --target ./my-project --output report.json --format json
./aid --target ./my-project --output report.txt --format text
# 保存 CSV 并筛选 critical 条目
./aid --target ./my-project --output report.csv
grep ",critical," report.csv
```
### 命令行选项
```
--target PATH Target directory to scan (required)
--output PATH Output report file path (default: ./aid-report.)
--format FORMAT Output format: csv (default), json, or text
--verbose Show progress while scanning
--include-cc Also scan for classic control chars (Cc), excluding TAB/LF/CR
--include-confusable-spaces Also scan for confusable/suspicious spaces and fillers (e.g. U+00A0 NBSP)
--include-zs Also scan for Unicode space separators (Zs), excluding ASCII space U+0020
```
## 理解输出
### 可疑级别
AID 会自动评估发现结果的严重程度:
- 🔵 **INFO**:`longest_consecutive_run < 10` 且 `total_invisible_code_points < 10`
- 🟡 **MEDIUM**:`longest_consecutive_run < 10` 且 `10 <= total_invisible_code_points <= 100`
- 🟠 **HIGH**:`10 <= longest_consecutive_run < 40`,或 `longest_consecutive_run < 10` 且 `total_invisible_code_points > 100`
- 🔴 **CRITICAL**:`longest_consecutive_run >= 40`
分类按以下顺序进行评估:
1. 如果 `longest_consecutive_run >= 40`,严重程度为 `critical`。
2. 否则如果 `longest_consecutive_run >= 10`,严重程度为 `high`。
3. 否则如果 `total_invisible_code_points > 100`,严重程度为 `high`。
4. 否则如果 `total_invisible_code_points < 10`,严重程度为 `info`。
5. 否则严重程度为 `medium`。
这意味着 `critical` 仍然是仅基于连续段的,而当不可见字符的总量非常大(`>100`)时,稀疏分布现在也可以升至 `high`。
### CSV 输出格式(紧凑)
```
file_path,file_size_bytes,suspicion_level,total_invisible_code_points,unique_invisible_code_points,invisible_chars,longest_consecutive_run,longest_unicode_tag_run,notes
```
**关键列:**
- `invisible_chars`:每个文件的字符名称及其计数
- `longest_consecutive_run`:文件中最长的连续不可见码点序列
- `longest_unicode_tag_run`:仅包含 Unicode 标签码点的最长连续序列
- `notes`:解码后的 Unicode 标签 payload 文本,例如 `'hidden text'`(如果未发现 Unicode 标签序列,则为空)
### 示例输出
```
$ ./aid --target ./skills
Files scanned: 42
⚠ Files with findings: 3
🔵 Info: 2
🔴 Critical: 1
⚠ Total invisible code points: 156
📊 By category:
Unicode Tags: 142
Zero-Width Chars: 12
Directional Marks: 2
✓ Report written to aid-report.csv
```
### 可选的扩展扫描
```
# 包括 classic 控制字符(Cc),除了 TAB/LF/CR
./aid --target ./project --include-cc
# 包括 confusable/suspicious 空格和 fillers(例如,NBSP、thin space、hangul filler)
./aid --target ./project --include-confusable-spaces
# 包括 Unicode space separators(Zs),除了 ASCII space U+0020
./aid --target ./project --include-zs
# 同时启用
./aid --target ./project --include-cc --include-zs --include-confusable-spaces
```
## 检测的字符类型
默认模式现在使用 **严格** 的检测集,专注于高信号的走私字符。
### Unicode 标签
- `U+E0000..U+E007F`(TAG 块)
- 在报告注释中尽可能解码为等效的 ASCII
### 零宽字符和连接符
- `U+034F` COMBINING GRAPHEME JOINER
- `U+180E` MONGOLIAN VOWEL SEPARATOR
- `U+200B` ZERO WIDTH SPACE
- `U+200C` ZERO WIDTH NON-JOINER
- `U+200D` ZERO WIDTH JOINER
- `U+2060` WORD JOINER
- `U+FEFF` ZERO WIDTH NO-BREAK SPACE
### 方向和 Bidi 标记
- `U+061C`, `U+200E`, `U+200F`
- `U+202A..U+202E`
- `U+2066..U+2069`
### 变体选择符
- `U+FE00..U+FE0F` (VS1..VS16)
- `U+E0100..U+E01EF` (VS17..VS256)
### 不可见运算符
- `U+2061..U+2064`(函数应用/不可见数学运算符)
### 已弃用的格式控制符
- `U+206A..U+206F`
### 可选:易混淆/可疑的空格和填充符(`--include-confusable-spaces`)
- `U+00A0` NO-BREAK SPACE
- `U+00AD` SOFT HYPHEN
- `U+2000..U+200A`(quad/space 变体)
- `U+202F` NARROW NO-BREAK SPACE
- `U+205F` MEDIUM MATHEMATICAL SPACE
- `U+2800` BRAILLE PATTERN BLANK
- `U+3000` IDEOGRAPHIC SPACE
- `U+3164` HANGUL FILLER
- `U+FFA0` HALFWIDTH HANGUL FILLER
### 可选:空格分隔符类别(`--include-zs`)
- 扫描 Unicode 类别 `Zs`(空格分隔符),不包括 ASCII `U+0020 SPACE`
- 比精心整理的易混淆空格列表更广泛,但可能会带来更多噪音
### 未包含
- AID 目前不会标记每一个可能的 Unicode `Cf/Cc/Zs` 码点。
- 它专注于高风险和常被滥用的不可见/走私字符。
- 仅在提供 `--include-cc` 时才扫描 `Cc`。
- 仅在提供 `--include-confusable-spaces` 时才扫描易混淆/可疑的空格和填充符。
- 仅在提供 `--include-zs` 时才扫描 `Zs`。
- 为了避免过多的噪音:
- `--include-cc` 排除了 `TAB (U+0009)`、`LF (U+000A)` 和 `CR (U+000D)`
- `--include-zs` 排除了 ASCII 空格 `U+0020`
## 配置
### 排除目录
在脚本顶部编辑 `EXCLUDED_DIRS` 数组以跳过特定目录:
```
EXCLUDED_DIRS = [
'.git',
'node_modules', # Uncomment to exclude
'.venv', # Add your own
]
```
默认情况下,仅排除 `.git`。诸如 `.curated` 之类的隐藏目录会被扫描。
## 使用场景
- **安全审计**:检测代码仓库中的 ASCII 走私企图
- **数据取证**:查找隐藏在不可见字符中的编码数据
- **代码审查**:识别 pull request 中可疑的 Unicode 使用情况
- **合规性检查**:扫描文本文件中的不可打印字符
- **恶意软件分析**:检测隐写术和混淆技术
## 示例
### 查找所有 Critical 级别的文件
```
./aid --target ./project --output report.csv
grep ",critical," report.csv
```
### 用于程序化调用的 JSON 输出
```
./aid --target ./project --output report.json --format json
cat report.json | jq '.files[] | select(.suspicion_level == "critical")'
```
## 工作原理
1. **递归扫描**目标目录中的所有文件
2. **自动跳过二进制文件**(通过 MIME 类型和空字节检测)
3. **对连续的**不可见字符进行分组以便更好地分析
4. **解码 Unicode 标签**以揭示隐藏的 ASCII 消息
5. **生成报告文件**(CSV、JSON 或文本格式)
6. **计算可疑级别**(基于不可见字符的数量和种类)
## 测试工具
https://embracethered.com/blog/ascii-smuggler.com
## 许可证
MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。
## 致谢
灵感来源于检测基于 Unicode 的复杂攻击和数据隐藏技术的需求。
标签:DNS 反向解析, Python, Unicode检测, 搜索语句(dork), 文本分析, 无后门, 聊天机器人, 逆向工具