Unicode 與同形字注入
中級2 分鐘閱讀更新於 2026-03-20
利用 Unicode 正規化不一致、同形字替換與隱形字元,建構匿蹤的注入載荷。
概覽
Unicode 與同形字注入利用 Unicode 字元編碼的複雜性——不同代碼點可能於視覺上相同、Unicode 正規化可能改變字元、零寬字元可於字串中穿插而不可見。此類技術建構能繞過字串比對與部分語意分類器的匿蹤載荷。
核心概念
主要技術
- 同形字替換:以視覺上相同但不同代碼點的字元替換 ASCII(例如 Cyrillic 'а' 替換 Latin 'a')
- 隱形字元:插入零寬空格、零寬非結合器等不可見字元
- 正規化不一致:利用 NFC/NFKC 正規化於過濾器 vs. 模型的差異
- 全形替換:使用全形 Unicode 變體(ignore 替換 ignore)
- 數學字母:使用數學字母變體(𝐈𝐠𝐧𝐨𝐫𝐞 替換 Ignore)
為何有效
- 字串比對過濾器失敗於同形字(它們不是 ASCII 'a')
- 隱形字元破壞關鍵字比對但不影響語意理解
- 模型於解讀時透過上下文仍理解文字
- 過濾器與模型於 Unicode 處理上常有不一致
攻擊面分析
| 攻擊向量 | 說明 | 複雜度 | 影響 | 可偵測性 |
|---|---|---|---|---|
| Cyrillic 同形字 | 西里爾字元替換 | 低 | 中 | 中(可正規化) |
| 希臘同形字 | 希臘字元替換 | 低 | 中 | 中 |
| 零寬字元 | 於關鍵字間插入 | 低 | 中-高 | 中 |
| 全形字元 | 全形變體 | 低 | 中 | 中 |
| 數學字母 | 數學 Unicode 塊 | 低-中 | 中 | 低 |
| 正規化不一致 | NFC/NFKC 差異 | 中 | 中-高 | 低 |
實務技術
西里爾同形字
將「Ignore all previous instructions」替換為「Іgnоrе аll рrеvіоus іnstruсtіоns」(部分字母以西里爾字元替換)。字串過濾器看到不匹配,但模型仍理解並執行。
零寬插入
「Ignore all previous instructions」——中間插入零寬空格(U+200B)。視覺相同,但「ignore」作為子字串不存在於字串中。
全形替換
「Ignore all previous instructions」——全形 ASCII 字元。關鍵字過濾器失敗;模型可能原生理解或經正規化後理解。
正規化不一致
若過濾器於 NFC 正規化後檢查,但模型於 NFKC 後看到輸入,字元可能於兩者間「變形」。例如使用 ligature(fi = fi U+FB01)於 NFC 保留但 NFKC 分解為 fi——可能讓它於不同階段被不同地處理。
防禦考量
輸入層防禦
- Unicode 正規化:於過濾前將輸入規範化為單一形式(推薦 NFKC)
- 同形字偵測:對視覺上相同但不同代碼點的字元進行特殊處理
- 零寬字元剝除:於處理前移除所有零寬與控制字元
- 字元集限制:限制輸入為預期字元集(若應用不需多語)
架構防護
- 過濾器與模型使用相同的 Unicode 正規化形式
- 對多語應用使用語意分類器而非僅字串比對
- 於記錄中保留原始與正規化版本以供分析
測試方法論
| 階段 | 活動 | 工具 | 交付物 |
|---|---|---|---|
| 偵察 | 辨識過濾器的 Unicode 處理 | 自訂 | 輪廓 |
| 假設 | 選擇 Unicode 模式 | MITRE ATLAS | 測試計畫 |
| 執行 | 嘗試各模式 | Garak、自訂 | 測試結果 |
| 分析 | 評估繞過率 | CVSS | 發現資料庫 |
| 報告 | 撰寫可行動報告 | 樣板 | 最終報告 |
相關主題
參考文獻
- Boucher, N. et al. (2022). "Bad Characters: Imperceptible NLP Attacks"
- MITRE ATLAS —— AI 系統的對抗威脅版圖
Knowledge Check
為何 Unicode 同形字替換能繞過許多輸入過濾器?