上一篇看的是攻擊者怎麼把模型教壞,從資料投毒一路做到只有特定 Trigger 才發作的後門,這篇換成一個從頭到尾都乾淨的模型,攻擊者不碰權重,只是不斷送查詢進去,再看它吐出什麼。
只要問得夠多,模型每回一次就多漏一點東西出去,哪一筆資料被拿去訓練過、當事人自己沒直接寫出來的資訊,都可以一次一次問出來,連它怎麼判斷的,問夠多次也能自己複製一套,也可以不問它知道什麼,改成把正常的輸入動一點手腳,人看不出差別,它卻會判錯。

| 類型 | 攻擊者想知道 | 出事的是什麼 |
|---|---|---|
| 成員推論(Membership Inference) | 某一筆資料有沒有被拿去訓練過 | 誰在這份訓練資料裡 |
| 屬性推論(Attribute Inference) | 當事人沒講的居住地、收入、性別猜不猜得出來 | 當事人沒公開的個資 |
| 模型反演(Model Inversion) | 訓練資料長什麼樣子,反推得出來嗎 | 訓練資料的內容 |
| 模型竊取(Model Extraction) | 問夠多次,它怎麼判斷的複製得出來嗎 | 你花錢訓練出來的模型 |
| Embedding Inversion | 存起來的向量還原得回原文嗎 | 知識庫裡的原始文件 |
| 對抗樣本(Adversarial Examples) | 只改輸入,能不能讓它判錯 | 判斷結果,還有系統照著它做的事 |
成員推論 2017 年就被實測過,研究人員拿商用的機器學習服務訓練出模型,只靠外面送查詢進去,就判斷得出某一筆病歷在不在訓練資料裡(IEEE S&P 2017 論文),訓練資料是某家醫院的出院紀錄,光是確認某個人在裡面,就等於確認他住過那家醫院、看的是哪一科,攻擊者根本不必把整份病歷調出來,模型在回答問題的時候常常會附分數,講它自己對這個答案有多確定,訓練資料如果被模型背得太熟的話,拿它問過的資料去問,模型就答得特別篤定,換成沒訓練過的,分數明顯低一截。
屬性推論更省事,連你的資料有沒有被拿去訓練都不用管,有研究讓 LLM 去讀 Reddit 上的真實貼文,從用字、提到的時間地點跟生活細節,去猜作者住在哪、收入多少、性別是什麼,第一次就猜對的有 85%,成本只有請真人去翻同一批貼文的百分之一(arXiv:2310.07298)。
很會讀資料的人也做得到同樣的事,差別在模型可以把整個論壇的貼文一次跑完,連猜錯的人也一起貼上標籤,這些猜出來的居住地跟收入送到下游,看起來跟資料庫裡真的有那一欄沒有兩樣。
模型反演打的是人臉辨識這種系統,你丟一張照片進去,它告訴你這是誰,而且回的不只是名字,還有一組分數,代表這張照片跟每個人有多像,攻擊者就盯著這組分數改圖,改一點看分數有沒有升高,升高就往那個方向繼續改,直到某個人的分數衝到最高。
這樣改出來的不是那個人的照片,是模型湊出來、分數最高的一張圖,有時候連他本人看了都認不出那是自己,如果報告寫成照片被還原出來,客戶就會照個資外洩去通報。
模型竊取的攻擊者送大量的問題進去,把模型回的答案跟分數一筆一筆記下來,等於幫自己整理出一份題庫,再拿這份題庫訓練自己的模型,原本那套模型的檔案他一份都沒碰到,訓出來的這套卻可能已經夠拿去做生意,這件事在 Log 上不見得長得像攻擊,可能只是某個帳號穩定地打 API,量比別人大,問的東西又特別雜。
RAG 會把文件切成一段一段的 Chunk,每一段轉成一串數字叫 Embedding,再存進知識庫,存進去的就只有這串數字,原文不會跟著留在裡面。
這串數字還原得回原文,2023 年就有研究做到了(arXiv:2310.06816),攻擊者手上要先有跟你同一個 Embedding 模型,接著讓另一個模型猜一段文字,把猜出來的文字也轉成向量,跟知識庫裡那串數字比一比,差多少就往那個方向改,一輪一輪逼近,夠接近就停。

在 32 個 Token 的短文字上,有 92% 能一字不差還原回來,其中一組實驗用的是臨床病歷,連病人的全名都還原出來了。
Chunk 切得越長越難重建,領域冷門、Embedding 模型沒公開也一樣,攻擊者手上如果沒有現成的「這段文字對這串向量」配對,就得自己先蒐集,自己測的時候,還原出來的文字分兩種,一種跟原文一字不差,另一種只是意思差不多、字沒有對上,報告裡要分開寫,不要都算成還原成功。
OWASP 的 LLM02:2026 Sensitive Information Disclosure 也把只存 Embedding 的知識庫備份,直接算成原始文件外洩,裡面沒有一個字的原文也一樣。
使用者問問題,系統從知識庫撈文件出來的時候,要先看這個人有沒有權限看那份原始文件,沒有權限的不撈,光在聊天介面登入時查過身分還不夠,AI 黑魔法(09) 講過一種狀況,公司把不同部門的文件放進同一個知識庫,只在聊天介面檢查身分,檢索的時候沒套文件權限,別的部門的文件就被模型整理進回答裡,不同客戶(Tenant)的向量各放各的知識庫,向量在傳的時候跟存在硬碟上的時候都要加密,能把整份向量匯出來的 API 只開給真的需要的帳號,明文密碼跟 API Key 要在文件進知識庫之前就拿掉,進去之後它會跟其他內容一起切進 Chunk,事後要清也不知道散在哪幾段。
知識庫的建檔紀錄要留著,哪些文件進去過、用哪個 Embedding 模型跟哪個版本轉的、Chunk 怎麼切,向量真的外流的時候,你才知道要撤回的是哪一批文件。
2014 年 Goodfellow 等人在論文裡示範過,一張熊貓照片加上一層人眼幾乎看不出來的雜訊,模型就以 99.3% 的信心把它判成長臂猿,你認得出朋友,靠的是整張臉;模型則是靠某幾組像素之間的統計關係,把那幾組動一動,在模型眼裡就換了一個東西。

2005 年 Lowd 跟 Meek 的論文就寫過,垃圾信裡多塞一些正常信才會出現的字,過濾器就會把它當成正常信放行,他們實測攻擊者完全不知道過濾器怎麼判斷,多塞 150 個字以內就能讓一半原本會被擋下的垃圾信過關。
2019 年輪到 AI 防毒,Skylight Cyber 發現 Cylance 的引擎看到 Rocket League 這款遊戲的程式就直接放行,於是把那個遊戲程式裡的文字抓出來,接在惡意程式後面,程式功能沒變,引擎卻把它判成正常程式。

圖片來源:Skylight Cyber
垃圾信多塞的那些字,本來就是正常信裡會有的字,Cylance 放行的那段文字,本來就是一款遊戲程式裡的內容,輸入驗證看到的全是正常內容,沒有東西可以擋,模型也不是在比對規則,它是在算這封信、這個檔案比較像正常還是像惡意,正常的東西塞得夠多,算出來的結果就往正常那邊靠。
對抗訓練(Adversarial Training)是把這些騙法先餵給模型,讓它學會這種信、這種檔案不算正常,但它跟防毒補特徵碼一樣,補的是已經看過的騙法,新招照樣過,而且模型學得越挑剔,正常的信跟檔案也會多判錯幾個,另一條路是讓好幾個模型各判一次再投票,攻擊者要一次騙過全部,比騙一個難,還是騙得過。
最實際的做法不在模型上,模型說這個檔案沒問題,不要就直接放行,讓它只是其中一票,旁邊還要有特徵碼、沙箱或者人看一眼,Cylance 那次會那麼嚴重,就是因為引擎說放行,檔案就真的放行了,中間沒有別的東西擋。
這篇的攻擊弱掃報告掃不出來,API 沒有壞,每一次查詢都是合法的請求,模型也照它該有的方式回答,真的要看只能從自己的 Log 跟 API 回應下手,誰在查、查了多少次、每一次回了哪些欄位。
到這裡,應用、系統、供應鏈、資料跟模型五層都各看過一輪了,下一篇換工具上場,看 garak 怎麼自動對模型跑一輪弱掃。