iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
AI Security

AI 黑魔法:30 天拆解 AI 系統攻擊面(重啟)系列 第 23

AI 黑魔法(23):AI 會說溜嘴,也會看走眼

  • 分享至 

  • xImage
  •  

上一篇看的是攻擊者怎麼把模型教壞,從資料投毒一路做到只有特定 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,量比別人大,問的東西又特別雜。

Embedding Inversion:知識庫裡的向量,還原得回原文

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% 的信心把它判成長臂猿,你認得出朋友,靠的是整張臉;模型則是靠某幾組像素之間的統計關係,把那幾組動一動,在模型眼裡就換了一個東西。

垃圾信過濾器跟 AI 防毒,中的是同一招

2005 年 Lowd 跟 Meek 的論文就寫過,垃圾信裡多塞一些正常信才會出現的字,過濾器就會把它當成正常信放行,他們實測攻擊者完全不知道過濾器怎麼判斷,多塞 150 個字以內就能讓一半原本會被擋下的垃圾信過關。

2019 年輪到 AI 防毒,Skylight Cyber 發現 Cylance 的引擎看到 Rocket League 這款遊戲的程式就直接放行,於是把那個遊戲程式裡的文字抓出來,接在惡意程式後面,程式功能沒變,引擎卻把它判成正常程式。


圖片來源:Skylight Cyber

對抗樣本為什麼特別難防?

垃圾信多塞的那些字,本來就是正常信裡會有的字,Cylance 放行的那段文字,本來就是一款遊戲程式裡的內容,輸入驗證看到的全是正常內容,沒有東西可以擋,模型也不是在比對規則,它是在算這封信、這個檔案比較像正常還是像惡意,正常的東西塞得夠多,算出來的結果就往正常那邊靠。

對抗訓練(Adversarial Training)是把這些騙法先餵給模型,讓它學會這種信、這種檔案不算正常,但它跟防毒補特徵碼一樣,補的是已經看過的騙法,新招照樣過,而且模型學得越挑剔,正常的信跟檔案也會多判錯幾個,另一條路是讓好幾個模型各判一次再投票,攻擊者要一次騙過全部,比騙一個難,還是騙得過。

最實際的做法不在模型上,模型說這個檔案沒問題,不要就直接放行,讓它只是其中一票,旁邊還要有特徵碼、沙箱或者人看一眼,Cylance 那次會那麼嚴重,就是因為引擎說放行,檔案就真的放行了,中間沒有別的東西擋。

防守清單

  • 拿去訓練的資料只放真的需要的欄位,姓名、病歷號這種敏感欄位在送去訓練之前就先刪掉或遮掉。
  • API 只回前端畫面真的要用的東西,模型回答時附的那組分數,還有 Embedding 向量,畫面上用不到就不要回出去。
  • 每個帳號除了每分鐘的次數,再設一個每天的總次數,超過就先擋下來,真的需要更多的用申請的開,攻擊者分好幾個帳號問就繞得過這個上限,開帳號要有成本,綁公司信箱或付款方式,不要讓人隨手註冊幾百個。
  • 先列出哪些帳號本來就會大量查詢、查的東西長什麼樣子,再拿 Log 去比對,同一張圖只改幾個像素就連送幾百次,或者好幾個帳號打同一批相似的問題就告警。

這篇的小總結

這篇的攻擊弱掃報告掃不出來,API 沒有壞,每一次查詢都是合法的請求,模型也照它該有的方式回答,真的要看只能從自己的 Log 跟 API 回應下手,誰在查、查了多少次、每一次回了哪些欄位。

到這裡,應用、系統、供應鏈、資料跟模型五層都各看過一輪了,下一篇換工具上場,看 garak 怎麼自動對模型跑一輪弱掃。


上一篇
AI 黑魔法(22):從源頭下毒到藏後門,資料投毒與後門模型
系列文
AI 黑魔法:30 天拆解 AI 系統攻擊面(重啟)23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言