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), 文本分析, 无后门, 聊天机器人, 逆向工具