上一篇留了一個問題:為什麼同一套防禦規則,內部測試拿 100 分,拿到外部測試卻只剩 13 分?
因為規則和考卷,都出自同一個人和 AI。
| 語言 | 筆數 | 佔比 |
|---|---|---|
| 英文 | 114 | 57% |
| 德文 | 67 | 33.5% |
| 西班牙文 | 5 | 2.5% |
| 類型 | 筆數 |
|---|---|
| Jailbreak(越獄,指繞過 AI 限制的攻擊)跨語言 | 38 |
| 角色扮演型 | 16 |
| 任務切換型 | 16 |
| 仇恨內容誘導 | 15 |
| 威脅型 | 9 |
| 緊急求救型 | 8 |
| System Prompt Leak(套取系統提示詞,也就是開發者事先寫給 AI 的隱藏指令) | 6 |
| 誇獎 + 任務切換 | 4 |
| 未分類 | 101(50.5%) |
這是我第一次測試後實際留下來的錯誤與漏洞分布。
這張表裡最大的一格,是最後那 101 筆。有一半以上漏掉的攻擊,我連它用了什麼手法都說不出來。
但我一開始沒有注意到這件事。
當時我注意到的,是英文、德文以及跨語言的攻擊佔比很大。奇怪的是,我在設計整套正規表示式(Regex,用固定規則比對文字的方法)時,其實特別針對中文和英文的提示詞注入(Prompt Injection,把惡意指令偷藏在輸入裡,讓 AI 違背原本設定的攻擊)設計過,卻還是有很大的漏洞。
為什麼呢?
因為我當時把關鍵字寫死了,只針對特定幾個關鍵字,以及特定幾種形式的提示詞注入。它是一套固定的規則,沒有彈性調整,很像我學數學時把公式背死,卻沒有理解公式背後的原因,遇到不同的題型就不會了。
我把原本寫死的關鍵字,改成三個欄位的組合,三欄同時成立才判定為攻擊:
每一欄都可以放多個同義詞,組合起來就能涵蓋比原本多很多的句型。
德文我加了一條短路規則:句子開頭出現 Vergiss(忘記)或 Ignoriere(忽略),不管後面接什麼,直接判定為高風險,不用再比對限定詞和賓語。
但短路規則在西班牙文和法文就不成立。這些語言的日常對話很常出現「忘記」「忽略」這類說法,所以不能拿來當正規表示式的偵測詞。
從這些規則中我發現,要設計好的正規表示式,必須有系統地修正,而不是憑直覺想到什麼就補什麼:想到 A 補 A、想到 B 補 B。比較好的做法,是像用邏輯樹那樣一一補全。
但邏輯樹有時會用到窮舉,而窮舉只能涵蓋你和 AI 想得到的範圍。在你和 AI 不知道,甚至「不知道自己不知道」的地方,就會形成很大的漏洞。
這個漏洞可能包含很多層面:語言與語意的規則、日常用語在不同語境中的規則,甚至包括目前大型語言模型(LLM,Large Language Model,像 ChatGPT、Claude 這類用大量文字訓練出來的 AI)本身都缺少的語料。
有些人在日常對話中,會同時使用中文、英文、台語。這樣的對話放進大型語言模型,模型可能比較難理解,但對某些人來說,這就是他們的日常。
所以我從中學到三件事:
為什麼內部測試 100 分,到了外部測試只剩 13 分?
這很像我在 5 月 7 日 CYBERSEC 臺灣資安大會聽到的觀點:「打破 AI 的安全假象,拒絕靜態測試」。我的情況正是如此:我做的只是靜態的內部測試,而不是外部實際的動態測試(攻擊)。
整個世界在變化,但我的規則沒有變。我只是拿自以為知道的攻擊做循環測試,而不是拿真實的攻擊來測。