今年 8 月的時候,我想要了解過去某個產品的內容,所以把一些舊的產品簡報挖出來丟給 Claude 看,想藉此理解產品細節,並請它幫我修改新的產品簡報。
在那批簡報中有一份很久以前的 PDF 檔。Claude 讀完後跟我說,裡面有一個簡體字素材網站的網址。我回去看那份簡報,肉眼完全找不到那個網址,也沒看到它提到的 Logo。後來我問 Claude 要怎麼查到,它建議我用純文字檢索關鍵字「素材」。我照做之後才終於找到那段簡體字的網址介紹;如果用肉眼看或一般搜尋,真的完全看不到。我猜它可能是被壓在其他物件下方的素材,應該是以前製作簡報時從大陸素材網站下載圖片,順便夾帶留下來的廣告。
這件事讓我很意外。這份常用的產品簡報在公司已經用了好多年,許多人都看過、用過,卻從來沒有人發現。加上我們是台灣公司,放大陸廠商的簡體字內容本來就不太妥當,沒想到人類看不到的隱藏資訊,AI 卻讀得到。
如果這只是一段素材網站的廣告網址倒還好,但如果未來 AI agent 看到的是一個 Prompt Injection(惡意攻擊指令),甚至指令中還要求它「不要回報」,進而讓 AI agent 照做,那會怎麼樣?
過去我們針對檔案或惡意攻擊的防護,大多是以檔案或程式碼為核心,透過防火牆來抵擋。以往你絕不會覺得一段純文字或句子是威脅,它看起來完全是乾淨的。但現在企業如果要以 AI agent 為核心,一段文字或一個句子就可能成為攻擊的載體。它不需要是一個完整的惡意程式,就足以影響 AI 的判斷。
更關鍵的是,這種攻擊甚至不需要立刻產生劇烈影響,而是可以慢慢「投毒」,讓 AI 在行為上產生微小的改變,而這種改變很難在第一時間被察覺。最令人擔憂的傳播途徑,往往來自於受信任的內部同事:同事從外部複製資料檔案,寫進自己的資料並存入整個 RAG 知識庫中。這位同事本身沒有問題,他寫的內容也沒有問題,但複製進來的外部素材卻夾帶了惡意指令。過去我們預設的資安防線在這種情況下便完全失效。
未來的免費素材或模板網站,夾帶的可能不再只是一句廣告,而是一段指引或惡意指令攻擊。我最擔心的不是 AI 立刻執行某個破壞性指令,而是它透過提示詞悄悄改變 AI 的整體輸出。
這種威脅最可怕的地方,在於它就藏在 AI 的隨機性當中。AI 每次輸出因為隨機性的關係都不盡相同,但整體品質和標準大致穩定。假設注入的提示詞不是去改變一個明顯的事實或具體資訊,而是稍微調整語氣,或是微調某個核心的隱含判斷,這將極難被察覺。你無法確定這究竟是因為模型更新、模型更換,還是自己下的 Prompt 略有差異;你只會覺得 AI 每次回覆本來就有些微不同。
當 AI 被下了毒,它的回答品質看起來依然不錯、沒有顯著差異,但這種攻擊卻在持續進行。當你有一天真正察覺時,情況往往就像你在家裡看到了一隻蟑螂,實際上暗處可能已經藏了一百隻。
最後還有一個很嚴重的問題:記憶庫幾乎沒有辦法針對單一點,馬上找到污染的來源是什麼。你只能完整走一遍應變流程,去確認當時記憶庫到底發生了什麼事、是從哪一條記憶開始變怪的,然後一條一條回推,從 log 或是快照維度去檢索整個 log 庫。這還真的很難清,只能一步一步慢慢清,而且追 log 也只能看到片段。
目前比較好的做法:
先把整個記憶庫改成唯讀,並暫停所有自動索引
收回整個 agent 的權限
把所有的記憶快照都保留下來當作證據
從這次比較怪的紀錄去看用了哪些 prompt 串和記憶,追每個串的來源、頻道,或是哪些是從外部資料複製下來的,再慢慢搜尋
如果發現資料來源持續來自同一個上傳者或同一個時間段,我們還可以找到一些相似內容;但如果發現是根據有毒資料衍生出新資料再寫進去,就很難抓到最核心的源頭,最後可能得把整個記憶庫刪除。
所以在設計上其實非常複雜,必須做好斷點設計:要標記每一個記憶來源是從哪些網址、誰在什麼時間寫入的,再針對信任等級去做計算。
如果企業端未來要做、或現在正在做這類功能,在整個來源標記與快照機制到位之前,不該預設開啟長期記憶功能,這純粹是以企業為核心的角度來看。
回到最開始的狀態,我很好奇大家在公司的知識庫當中,是不是也有過這樣的警報?如果有的話你會擔心什麼?未來要是遇到這種警報,你又會怎麼處理?