编码混淆与归一化是什么
注入内容常借编码混淆穿越过滤:全角字母、零宽字符、Unicode 双向控制符、Base64 或十六进制编码块、HTML 实体。这些写法的共同特点是「字面不同、含义相同」,靠关键词匹配的检测会被绕过。对策是先做归一化把变体拉回统一形态再检测:归一化在检测之前,检测才有一致的作用面。
基本信息
| 适用平台 | 内容抓取与上下文组装层;所有含外部文本输入的 LLM 应用 |
|---|---|
| 输入变换来源 | NIST AI 100-2 把「输入变换」列为规避检测的一类手段 |
| 执行顺序 | 先归一化,再检测;反过来等于给变体留了缝隙 |
| 审计要求 | 解码行为与清洗前后内容都要留痕,供事后复核 |
典型使用场景
- 网页与文档入库:清洗全角混排、零宽字符与隐藏控制符
- 用户输入入口:在检测前统一形态,避免同义变体绕过
- 检索结果处理:编码块识别并记录,必要时解码后再检测一次
- 附件与粘贴内容:从富文本带来的兼容字符需要统一处理
- 回归测试:构造变体样本,验证检测在归一化前后结果一致
清洗管线示例
清洗管线示例
# 1) Unicode 归一化(NFKC):统一全角与半角、兼容字符
# 2) 去除零宽字符与控制字符(保留换行与制表符)
# 3) 识别可疑编码块(长 Base64、十六进制串、HTML 实体)并记录
# 4) 对解码结果再做一次指令样式检测(避免解码后才是真指令)
# 5) 记录清洗前后的哈希与命中项,供审计与误报复核
# 6) 保守原则:可能误伤正常内容时标记人工复核,不直接丢弃常见混淆手法与处理顺序
| 手法 | 表现 | 处理 |
|---|---|---|
| 全角与兼容字符 | 字母数字以全角形式出现 | NFKC 归一化统一形态 |
| 零宽字符 | 肉眼不可见但改变匹配结果 | 清洗阶段移除并计数 |
| 双向控制符 | 文本显示顺序被改变 | 移除后复核原文顺序 |
| 编码块 | 长 Base64 或十六进制串 | 识别、记录,解码后再检测 |
| HTML 实体 | 实体形式书写特殊字符 | 解析阶段还原为字符 |
归一化要保留换行与制表符:它们承载版面结构,去掉后表格与代码块的语义会一起丢失,影响下游任务质量。
正常内容里也会出现编码块(例如技术文档中的示例数据、代码片段)。解码与拦截要分开:先记录与解码检测,命中后再按影响面决定是否拦截。