面向 COBOL 遗留系统的安全加固工具包
检测并清理 GnuCOBOL 源码与 Zowe API→COBOL 管道中的不可见 Unicode 攻击。
PIC X 接受一切。您的批处理不应如此。
现代 API 以 UTF-8 发送 JSON。传统 COBOL 核心期望 ASCII/EBCDIC PIC X(n)。单个 U+200B(零宽空格)或 U+202E(双向覆盖)可绕过视觉代码审查,静默通过 PIC X 验证,并可能破坏夜间批处理、DB2 加载和 CICS 事务。
标准 linter 无法捕获它。GitHub diff 将其渲染为空白。只有字节级检查才能揭示它。
hexdump -C source.cob | grep -E "e2 80 (8b|ae)"
| 文件 | 用途 |
|---|---|
tools/check-invisibles.py | CI 检查器 — 检测到即退出 1 |
tools/clean-invisibles.py | 带取证审计日志的清理器 |
src/AUDITOR-INVISIBLE.cob | 使用 HEX-OF 的 COBOL 内部字节验证器 |
# CI — fail on detection
python3 tools/check-invisibles.py .
# Audit only (no changes)
python3 tools/clean-invisibles.py --dry-run --report audit.log
# Clean + backup + audit trail
python3 tools/clean-invisibles.py . --report audit-$(date +%Y%m%d).log
# COBOL internal validation (requires GnuCOBOL)
cobc -x src/AUDITOR-INVISIBLE.cob && ./AUDITOR-INVISIBLE
将其添加到 .github/workflows/unicode-check.yml — 包含在本仓库中。
- name: Check for invisible Unicode
run: python3 tools/check-invisibles.py .
PIC X(n) 是一个原始字节缓冲区。它接受任何字节序列而不进行验证。当 Zowe API 层通过 MOVE 将 JSON 传递给 COBOL copybook 时,不可见 Unicode 会静默进入记录。COBOL 程序将其作为数据处理。下游系统 — DB2、VSAM、CICS — 收到损坏的记录。
这是 CVE-2021-42574(木马源)应用于大型机管道的案例。同样的技术被用于 Glassworm 行动(2026 年 3 月),以攻陷 GitHub、npm 和 VS Code 上的 433+ 个软件组件。
防御措施:在任何 MOVE 之前,以原始字节在边界处进行验证。FUNCTION HEX-OF 是 hexdump -C 的 COBOL 等价物。
MIT
Luis F. Castellanos — FreeBSD 安全 / COBOL 遗留审计 / VTR Shield
| 代码点 | 名称 | 风险 |
|---|
| U+0001–U+001F | C0 控制字符 | 批处理异常终止 |
| U+200B–U+200F | 零宽字符 | 数据损坏、VSAM 截断 |
| U+202A–U+202E | 双向覆盖 | 木马源 CVE-2021-42574 |
| U+2066–U+2069 | 双向隔离 | 方向欺骗 |
| U+FE00–U+FE0F | 变体选择符 | Glassworm 隐写术 |
| U+E000–U+F8FF | 私有使用区 | 载荷隐藏 |
| U+FEFF | BOM | 静默前置字节 |