#《飽和攻防 II：權重投毒》| Adversarial Learning, Data Poisoning & Model Integrity | IDRI

# 中篇：權重投毒與終端淪陷

## 01

第七十二小時。

南方聯合戰情室。

凌晨 01:13。

Aster沒有睡。

準確地說，這裡沒有人真正知道「睡覺」還算不算工作的一部分。

SOC 的燈光永遠維持在低亮度。

不是為了營造科技感。

只是因為長時間盯著螢幕的人，最後會討厭任何多餘的光。

牆上的圖已經變了。

三天前，那是一張巨大的 network graph。

現在，圖被收起來了。

取而代之的是另一面牆。

*`Model Registry`*

*`Training Runs`*

*`Dataset Versions`*

*`Feature Distribution`*

*`Model Drift`*

*`Confidence Calibration`*

一個年輕工程師站在Aster旁邊。

「新模型已經部署。」

Aster問：

「validation？」

「通過。」

「holdout？」

「通過。」

「OOD？」

「沒有顯著異常。」

「calibration？」

「正常。」

Aster點頭。

「那就很好。」

工程師鬆了一口氣。

Aster卻沒有看他。

「把舊模型也掛回來。」

工程師愣住。

「A/B？」

「不是。」

「那？」

「我想看它們怎麼吵架。」

---

## 02

兩個模型並排運作。

Model A。

舊版。

Model B。

新版。

同一批 telemetry。

同一套 feature。

同一個 inference endpoint。

差異只有一個：

**訓練資料不同。**

結果出來。

Model A：

*`P(malicious | x) = 0.74`*

Model B：

*`P(malicious | x) = 0.19`*

工程師看著兩個數字。

「新版應該比較準。」

Aster問：

「為什麼？」

「因為 validation accuracy 比較高。」

「高多少？」

「2.7%。」

「很好。」

Aster指著兩個 probability。

「那為什麼這裡差五十五個百分點？」

沒有人回答。

---

## 03

資安圈很喜歡 Accuracy。

它是一個漂亮的數字。

乾淨。

單純。

可以放簡報。

可以放 KPI。

甚至可以在董事會裡用一條漂亮的箭頭表示：

> Model Accuracy ↑

但在真正的威脅偵測裡，accuracy 往往是最容易讓人安心的數字之一。

因為攻擊者不需要讓模型全面失效。

只需要讓它在某一小塊區域裡犯錯。

例如：

*`P(y | x) ≈ P_normal`*

只在某個窄小的輸入區域成立。

而其他地方：

完全正常。

所以真正的問題不是：

> 模型準不準？

而是：

> **模型在哪裡不準？**

以及更麻煩的一個：

> **誰決定了「準」的範圍？**

---

## 04

李穎把舊模型的 decision surface 拉出來。

「這裡。」

他指著一個區域。

兩個模型的 representation 非常接近。

直到某個狹窄的 latent manifold。

Model A 將它推向 suspicious。

Model B 將它推向 benign。

Aster看了很久。

「資料。」

「什麼？」

「不是模型。」

「你覺得 checkpoint 沒問題？」

「我沒說沒問題。」

Aster把畫面放大。

「我只是覺得，模型通常沒有你們想像中那麼有創意。」

李穎笑了一下。

「所以？」

「先不要懷疑權重。」

「懷疑什麼？」

Aster說：

**「懷疑我們餵給它的世界。」**

---

# 05

Training pipeline。

凌晨 02:04。

工程師把資料血緣圖拉出來。

*`原始 telemetry`*  
↓  
*`Normalizer`*  
↓  
*`Feature extractor`*  
↓  
*`Labeling`*  
↓  
*`Dataset builder`*  
↓  
*`Train / Validation Split`*  
↓  
*`Augmentation`*  
↓  
*`Training`*  
↓  
*`Evaluation`*  
↓  
*`Registry`*  
↓  
*`Deployment`*

每一個節點都有：

commit。

timestamp。

hash。

owner。

approval。

artifact。

log。

沒有紅色。

Aster看著那條 pipeline。

「誰負責？」

工程師說：

「每個 stage 都有 owner。」

「不是。」

Aster搖頭。

「我問的是，**誰對最後的資料負責？**」

房間安靜。

工程師翻了一下文件。

「Data Platform。」

Aster問：

「Data Platform 誰？」

「輪值。」

Aster笑了一下。

不是嘲笑。

只是那種四十五歲男人已經見過太多次的笑。

責任一旦進入輪值制度，通常就會變成一種**集體沒有記憶的東西。**

---

# 06

他們開始做 Data Lineage。

不是看資料夾。

不是看檔名。

而是追：

*`D_0`* → *`D_1`* → *`D_2`* → *`D_3`* → *`D_train`*

每一次 transformation 都留下 provenance。

某個版本的資料：

*`D_17`*

來源是一批 endpoint telemetry。

其中一部分經過 normalization。

另一部分經過 filtering。

再經過 label enrichment。

最後進入 dataset。

看起來正常。

但Aster停住了。

「這個。」

李穎靠過來。

「哪裡？」

「label distribution。」

畫面出現：

*`P(y = malicious)`*

不同 dataset version 的變化。

V11：

0.82%

V12：

0.81%

V13：

0.83%

V14：

0.80%

V15：

0.79%

V16：

0.76%

V17：

0.75%

沒有劇烈變化。

但Aster沒有移開視線。

「再看 conditional。」

工程師調整。

*`P(y | source, context)`*

結果出現。

某一類 endpoint。

某一種 telemetry source。

某一段時間。

標籤分布出現微小偏移。

不到百分之一。

李穎皺眉。

「這很小。」

Aster說：

「所以才有意思。」

---

# 07

模型投毒最漂亮的地方，從來不是「把資料改得很明顯」。

那叫自殺。

真正困難的是：

**讓異常看起來像正常的資料品質問題。**

一點 label noise。

一點 class imbalance。

一點 preprocessing drift。

一點 source bias。

一點 temporal skew。

每一項都可以有合理解釋。

甚至每一項都可能是真的。

問題在於：

它們疊起來之後，改變了模型的 decision boundary。

數學上，攻擊者真正希望改變的不是：

*`D_train`*

本身。

而是：

*`arg min_θ 𝓛(θ, D_train)`*

也就是：

**最終收斂的位置。**

你不需要把模型弄壞。

只需要讓它在某個地方學會一個錯誤的關係。

---

# 08

Morrow 的畫面上。

沒有任何 hacker terminal。

沒有黑色背景。

只有一個 training dashboard。

Loss curve。

Validation curve。

Calibration curve。

Confusion matrix。

他看著它們。

全部正常。

這才是最漂亮的部分。

「第一階段完成。」

助手問：

「模型會知道嗎？」

Morrow 說：

「模型不知道什麼叫做知道。」

「那誰知道？」

Morrow 看著 loss curve。

「我們。」

「系統呢？」

「系統只知道它收斂了。」

---

# 09

藍隊開始做第二輪分析。

不看 accuracy。

不看 F1。

甚至不看 ROC-AUC。

而是看：

**representation。**

把不同 dataset version 丟進同一個 encoder。

得到：

*`z_i = f_θ(x_i)`*

然後做 representation comparison。

V14。

V15。

V16。

V17。

它們沒有明顯斷層。

只有一個非常細的方向性漂移。

不是 cluster shift。

比較像：

**decision geometry 被慢慢推歪。**

李穎問：

「這是不是 concept drift？」

Aster說：

「可能。」

「也可能是 data drift。」

「對。」

「那怎麼分？」

Aster沒有立即回答。

他拿起筆。

在白板上寫：

*`P(X)`*

然後下面：

*`P(Y | X)`*

「如果 input distribution 變了。」

他指著第一行。

「叫 data drift。」

再指第二行。

「如果同樣的 input，label relationship 變了——」

「concept drift。」

李穎點頭。

Aster把筆放下。

「但現在我們還不知道是哪個。」

「所以？」

「所以不要急著命名。」

---

# 10

這就是資安調查最反直覺的一件事。

**分類不是理解。**

給事件取名字很容易。

APT。

Malware。

Insider。

Poisoning。

Backdoor。

Supply Chain。

每一個詞都很漂亮。

每一個詞都可以讓報告看起來像已經知道答案。

但真正的 forensic process，通常要忍受一段很長的時間：

**不知道。**

Aster很熟悉這個狀態。

他二十年前第一次處理重大事故時，也犯過同樣的錯。

當時他急著證明自己是對的。

四十五歲之後，他只想確定：

**證據是不是支持這個結論。**

---

# 11

凌晨 04:33。

模型出現第二個問題。

一批新 telemetry 進來。

Model B：

*`P(malicious) = 0.12`*

Model A：

*`P(malicious) = 0.68`*

但這一次不是單一 endpoint。

而是一整個 behavioral family。

李穎說：

「這就不是 random error。」

Aster點頭。

「對。」

「所以是 backdoor？」

「先不要。」

「為什麼？」

「因為你已經開始想答案了。」

李穎沉默。

Aster看著他。

「我們現在只知道一件事情。」

「什麼？」

「模型 B 在某個 representation region 裡，系統性地偏向 benign。」

---

# 12

藍隊開始做 activation analysis。

不是看最後一層。

而是從：

*`h_1, h_2, …, h_L`*

一路往下看。

某個 layer 的 activation distribution。

沒有爆炸。

沒有 NaN。

沒有 abnormal saturation。

沒有明顯 neuron collapse。

一切正常。

這讓事情變得更糟。

因為如果模型被粗暴破壞，很容易找到。

真正高級的資料攻擊，往往不留下：

> 「我是惡意的。」

它留下：

> 「我是資料。」

---

# 13

Aster要求跑一個很少有人喜歡做的分析。

**Influence estimation。**

問題不是：

> 哪個 sample 是惡意的？

而是：

> **哪些 training samples 對這個錯誤決策具有最大的因果影響？**

理論上，可以用 influence function 描述某個 training point 對參數或 loss 的影響：

*`∇_θ L(z_test, θ)^T H_θ^-1 ∇_θ L(z_i, θ)`*

沒有人真的把這條公式當成魔法。

它昂貴。

近似很多。

在大型深度模型上，實作細節更麻煩。

但它提供了一個方向：

**不要只問模型錯在哪。**

問：

**誰讓模型在這裡變錯？**

---

# 14

結果出來。

Top influence samples。

一百筆。

五十筆。

二十筆。

十筆。

五筆。

它們沒有共同 payload。

沒有共同 IP。

沒有共同 domain。

甚至不是同一個 endpoint。

但有一件事情相同。

它們都曾經經過同一個 preprocessing branch。

李穎盯著畫面。

「找到了？」

Aster搖頭。

「我們找到的是一個方向。」

「不是 source？」

「還不是。」

「那為什麼？」

Aster指著畫面。

「因為 influence 告訴我們的是**因果關聯的候選證據**。」

「不是法庭判決。」

---

# 15

他們開始查 preprocessing。

那段 code 很普通。

普通到令人厭惡。

一個 feature normalization。

一個缺失值處理。

一個時間窗口。

一個 threshold。

沒有 exploit。

沒有奇怪 API。

沒有 shell command。

沒有 credential。

甚至沒有 security warning。

工程師看了一眼。

「這段是三個月前改的。」

「誰改的？」

「平台團隊。」

「原因？」

「降低 noise。」

Aster笑了。

「人類最危險的四個字。」

李穎問：

「哪四個？」

Aster說：

**「降低一點 noise。」**

---

# 16

因為 noise 到底是不是 noise，從來不是數學問題。

是語境問題。

一個 anomaly。

可能是 noise。

也可能是攻擊。

也可能是新的正常行為。

也可能是模型從來沒有見過的正常。

當 preprocessing 把它刪掉：

模型會變乾淨。

validation 會變漂亮。

training 會更穩。

所有工程指標都可能改善。

但系統也可能因此失去：

**它原本唯一能辨識攻擊的細微訊號。**

這就是 security 和 optimization 最常發生衝突的地方。

Optimization 問：

> 怎麼讓平均表現更好？

Security 問：

> **最糟糕的那一次會發生什麼？**

---

# 17

Morrow 看著 dashboard。

他沒有控制 preprocessing。

至少不是直接控制。

他甚至不需要。

因為在一個大型組織裡，最有效率的方式從來不是「命令別人改」。

而是讓一個合理的改善需求，看起來像是它自己長出來的。

Reduce noise。

Improve precision。

Lower latency。

Simplify pipeline。

這些都不是錯。

每一個都值得做。

問題只是：

**在什麼資料上做。**

---

# 18

藍隊重新建立資料集。

不是 V17。

而是一份獨立的 forensic dataset。

來源不同。

pipeline 不同。

labeling policy 不同。

甚至由另一套 infrastructure 重新產生。

結果令人不舒服。

Model B 的表現開始下降。

不是全面下降。

只在某個小類別。

而那個類別——

正是前幾天那群 unresolved behavioral clusters。

李穎沒有說話。

Aster也沒有。

他只是盯著 confusion matrix。

False Negative：

上升。

False Positive：

下降。

Overall Accuracy：

幾乎不變。

Aster說：

「這就是它。」

---

# 19

真正危險的模型攻擊，不一定會讓：

*`Accuracy ↓`*

它可能讓：

*`Accuracy ≈ constant`*

同時：

*`FNR_target ↑`*

這種攻擊對一般 benchmark 幾乎透明。

因為整體性能沒有崩。

甚至可能變好。

只是一小塊區域：

**突然變成盲區。**

---

# 20

李穎問：

「所以這是 targeted poisoning？」

Aster看他。

「如果是呢？」

「那我們就能定性。」

「如果不是？」

李穎沒有回答。

Aster說：

「別急著把它叫成某一種 attack。」

「我們要證明的是 effect。」

「不是先證明名字。」

這就是成熟分析和網路文章最大的差別。

網路文章需要標題。

forensic investigation 需要證據。

---

# 21

藍隊開始檢查 dataset provenance。

每個 artifact 都有 hash。

每個 dataset 都有版本。

每次 training 都有 run ID。

每一個模型都有：

*`Hash(model)`*

看起來完美。

直到他們發現：

**資料本身有合法簽章。**

但簽章只證明：

> 這份資料確實來自那個 pipeline。

它沒有證明：

> **pipeline 產生的是正確的資料。**

這是一個很古老的安全問題。

Authentication 不等於 integrity。

Integrity 也不等於 correctness。

Correctness 更不等於 truth。

---

# 22

Aster在白板上寫下：

*`Authentic ≠ Correct`*

下面再寫：

*`Correct ≠ Safe`*

最後：

*`Safe ≠ True`*

李穎看了很久。

「這是不是有點哲學？」

「資安做到後來，本來就是哲學。」

「只是我們通常把哲學叫做 threat model。」

---

# 23

Morrow 的系統收到新的結果。

藍隊已經發現 data lineage anomaly。

但還沒有定位來源。

Morrow 沒有緊張。

因為他知道：

**找到 anomaly 和證明 attacker 是兩件完全不同的事情。**

模型開始重新計算。

如果藍隊換 dataset。

模型會不會暴露？

如果藍隊換 preprocessing。

模型會不會暴露？

如果藍隊重新 label。

模型會不會暴露？

這是一場 meta-game。

紅隊不是只在攻擊 detector。

它正在觀察：

**藍隊如何驗證 detector。**

---

# 24

這就是 adversarial machine learning 最危險的一層。

不是：

*`x → f(x)`*

而是：

*`x`* → *`f_θ(x)`* → *`Defender Response`* → *`New Data`* → *`New Model`* → *`New Attack`*

模型不再是一個 endpoint。

它是一個 feedback loop。

而一旦模型進入 feedback loop：

**模型的行為本身就成為 attack surface。**

---

# 25

藍隊決定做 gradient audit。

不是為了「找到駭客」。

而是看看模型在關鍵區域的梯度是否具有異常結構。

對某個 input x：

*`g(x) = ∇_x L(f_θ(x), y)`*

然後觀察：

- gradient norm
- direction consistency
- layer-wise sensitivity
- local smoothness
- representation stability

結果沒有明顯 smoking gun。

李穎失望。

「沒東西。」

Aster搖頭。

「有。」

「在哪？」

「這裡。」

他指向一組看似正常的 gradient。

「太穩定。」

李穎愣了一下。

「穩定不是好事？」

「通常是。」

Aster說：

「但如果一個模型在一個非常窄的區域，對一類特徵的 response 過度一致，就值得問為什麼。」

---

# 26

他們開始做 local perturbation。

不是攻擊。

只是測量。

在不改變語義的前提下，對輸入 representation 做小幅變化。

觀察：

*`f(x + δ)`*

其中：

*`|δ| ≪ 1`*

結果顯示：

Model A 的 decision boundary 相對平滑。

Model B 在某個區域出現異常陡峭的轉折。

不是模型全面失效。

而是：

**局部幾何形狀變了。**

Aster說：

「這不是一般 drift。」

「為什麼？」

「因為 drift 會移動分布。」

「這個？」

「像有人動過邊界。」

---

# 27

凌晨 06:18。

藍隊第一次正式把事件升級。

Incident class：

> **Potential ML Integrity Compromise**

不是 confirmed poisoning。

不是 confirmed backdoor。

只是：

Potential。

因為證據還不夠。

這個詞很醜。

但Aster喜歡。

它沒有假裝自己知道答案。

---

# 28

紅隊的下一個動作也很安靜。

沒有 payload。

沒有新的 endpoint。

沒有新的 domain。

他們只讓一個原本存在的 behavior 稍微改變。

一點點。

不是為了突破。

而是為了測試：

**藍隊的模型會不會自己把它吃掉。**

結果出來。

Model B：

Benign。

Model A：

Suspicious。

Aster看到後，沒有下令封鎖。

他說：

「把模型 B 暫停。」

所有人看著他。

李穎問：

「直接停？」

「對。」

「可是 Model B 是 production。」

「我知道。」

「會影響 false positive。」

「我知道。」

「業務會有意見。」

「我也知道。」

Aster看著他。

「但我們現在面對的是另一種風險。」

「什麼？」

「**一個會替攻擊者證明攻擊不存在的模型。**」

---

# 29

這句話在會議室裡停留了很久。

因為它比 malware 更令人不舒服。

Malware 至少會留下 artifact。

模型不一定。

一個錯誤的模型可以讓你：

- 忽略告警
- 降低風險評級
- 改變 analyst priority
- 改變 incident response
- 改變 training data
- 再次訓練模型

最後形成：

*`Model`* → *`Decision`* → *`Data`* → *`Model`*

一個自我強化的閉環。

這才是真正的終端淪陷。

不是 endpoint 被拿下。

而是：

**防守系統的判斷能力被拿下。**

---

# 30

上午 09:41。

藍隊啟動 offline model。

完全獨立的 environment。

沒有 production feature store。

沒有原本的 preprocessing pipeline。

重新從 raw telemetry 建立 feature。

重新 labeling。

重新 split。

重新 train。

成本很高。

速度很慢。

工程師抱怨：

「這樣太浪費 GPU。」

Aster說：

「安全本來就很浪費。」

「什麼？」

「它的價值，就是讓你永遠不知道自己本來可能會失去什麼。」

---

# 31

新模型訓練完成。

沒有 Model B 那種偏差。

也沒有 Model A 那麼敏感。

它更保守。

uncertainty 更高。

false positive 也增加。

但在那個狹窄區域：

它沒有盲。

Aster看著結果。

「現在開始比較。」

不是比較誰 accuracy 高。

而是比較：

*`ΔP`*

*`Δ Representation`*

*`Δ Attribution`*

*`Δ Error`*

以及：

*`Δ Data Provenance`*

最後，一條關係浮現。

---

# 32

某個 preprocessing transformation。

某一段時間。

某一組 source。

某類 label。

四者交疊。

不是單一證據。

而是：

*`Evidence_1 ∩ Evidence_2 ∩ Evidence_3 ∩ Evidence_4`*

形成了一個很小的交集。

Aster說：

「這才是我們要的。」

李穎問：

「source？」

Aster搖頭。

「還不是。」

「那是什麼？」

「**可重現的差異。**」

---

# 33

安全調查真正重要的不是找到一個看起來很可疑的人。

而是找到一個：

**別人可以重新驗證的現象。**

如果今天你說：

> 「我覺得模型被投毒。」

明天別人可以說：

> 「你只是模型漂移。」

兩邊都能講。

沒有用。

但如果你能說：

> 同一輸入、不同資料血緣、不同 pipeline、不同模型，產生系統性且可重現的 decision divergence。

事情就不一樣。

因為你不再是在講故事。

你在描述：

**實驗結果。**

---

# 34

Morrow 看見那份報告。

第一次，他皺眉。

不是因為藍隊找到他。

而是因為：

**他們沒有急著找他。**

他們先拆掉自己的模型。

這讓他失去了最重要的 leverage。

如果藍隊只修 model：

他可以適應。

如果藍隊只換 detector：

他可以適應。

如果藍隊只封 endpoint：

他可以適應。

但如果藍隊開始問：

> **「我們為什麼相信這個資料？」**

攻擊面就開始縮小。

Morrow 關掉畫面。

「他們學得很快。」

助手問：

「下一步？」

Morrow 沉默。

「等。」

---

# 35

但真正的問題，並沒有結束。

因為藍隊重新建立的模型，也不是完美的。

它更保守。

更 robust。

但成本更高。

latency 更高。

false positive 增加。

analyst workload 增加。

業務開始抱怨。

管理層問：

> 「為什麼以前模型很好，現在突然抓這麼多？」

沒有人能用一句話回答。

這就是安全工程最不討喜的地方。

你把系統修好了。

然後有人問：

**「為什麼現在不能像以前一樣方便？」**

Aster看著那張簡報。

心裡只有一個念頭：

> 因為以前那個方便，是拿風險換來的。

但他沒有說出口。

有些真話需要挑場合。

---

# 36

晚上。

Aster走進模型實驗室。

牆上只有一張圖。

兩條 decision surface。

一條舊。

一條新。

它們在大部分地方幾乎重疊。

只有一個小角落。

完全不同。

李穎站在旁邊。

「就這麼一小塊。」

「嗯。」

「我們真的花了三天？」

「不是。」

Aster看著那個小區域。

「我們花三天確認，其他地方沒有問題。」

「差在哪？」

「差很多。」

他停了一下。

「真正的防守，不是證明你是對的。」

「是排除你錯的地方。」

---

# 37

午夜 00:00。

新的 model registry 建立。

Model C。

它有新的 lineage policy。

新的 data provenance。

新的 holdout。

新的 drift monitor。

新的 uncertainty threshold。

新的 human review。

它甚至開始記錄：

> **Why was this model trusted?**

這個欄位看起來有點荒謬。

因為大部分系統只記：

> Model version: 4.17.2

很少有人記：

> **我們當時為什麼相信它。**

但Aster堅持要留下。

因為他知道：

幾年後，所有人都會忘記。

誰批准。

誰測試。

誰看過。

誰說沒問題。

最後只剩一句：

> 「當時所有指標都正常。」

而那句話，是所有事故報告裡最廉價的遺言。

---

# 38

三個小時後。

Morrow 收到最後一份 telemetry summary。

藍隊的新模型沒有追蹤到他的原始行為。

但它已經開始追蹤：

**模型本身的異常。**

Morrow 靜靜看著。

他終於理解Aster做了什麼。

沒有找到一個「惡意樣本」。

沒有找到一個「駭客」。

甚至沒有找到一個可以指控的人。

他們只是建立了一套更可靠的觀測制度。

這讓他的攻擊空間突然縮小。

---

# 39

助手問：

「我們輸了？」

Morrow 沒有回答。

他看著那張圖。

然後說：

「不。」

「那？」

「我們只是失去了第一個假設。」

「哪個？」

Morrow 說：

「以為模型是我們可以控制的世界。」

他站起來。

「其實模型也是觀測者。」

---

# 40

第二天早上。

Aster走進辦公室。

桌上有一份列印好的報告。

封面：

> **ML Integrity Assessment**

最後一頁只有一段話。

他看完。

拿起筆。

在下面寫了一句。

> **「不要把模型當成真相。」**

然後又補：

> **「模型只是某一組資料，在某一組假設下，對世界的一次壓縮。」**

他放下筆。

李穎站在門口。

「你要簽核嗎？」

Aster說：

「簽。」

「結論寫 confirmed poisoning？」

「不。」

「那寫什麼？」

Aster看著他。

「寫 confirmed model integrity anomaly。」

「這樣會不會太保守？」

「不。」

「為什麼？」

「因為我們還不知道攻擊者是誰。」

「但我們知道模型出問題？」

「對。」

「所以？」

Aster把報告推回去。

「**知道自己不知道，是資安裡非常昂貴的一種能力。**」

---

# 41

中午。

新的 model 開始接管流量。

它沒有神奇地消滅所有 false positive。

沒有百分之百準確。

沒有完美的 explainability。

沒有漂亮得可以拿去做廣告的數字。

它只是：

比較誠實。

它知道什麼時候不確定。

知道哪些資料沒有 provenance。

知道哪些 feature 發生 drift。

知道哪些 decision 不值得完全自動化。

甚至知道：

**自己可能錯。**

這不是弱點。

在高風險系統裡，

**知道自己可能錯，是一種防禦能力。**

---

# 42

Aster站在觀測牆前。

Graph 還在跑。

Model 還在跑。

Telemetry 還在跑。

世界仍然沒有變得比較乾淨。

只是多了一層新的認知：

上一場戰爭，是誰能躲過 detection。

這一場戰爭，是誰能影響 detection。

而下一場——

將不再是攻擊資料。

也不再是攻擊模型。

而是：

**攻擊模型更新模型的方式。**

Aster看著那條新的 feedback loop。

*`Data`* → *`Model`* → *`Decision`* → *`Response`* → *`New Data`* → *`Model'`*

他忽然明白一件事情。

真正的 AI 防禦系統，最大的弱點從來不是它的 neural network。

也不是 GPU。

不是 optimizer。

甚至不是 training data。

而是：

**人類相信自己已經把它驗證過了。**

---

# 43

晚上 23:58。

Morrow 再次登入系統。

沒有攻擊。

沒有新的 payload。

只有一個新的 simulation。

他建立兩個 agent。

一個代表攻擊者。

一個代表防守者。

讓它們自己跑。

第一輪。

第二輪。

第三輪。

策略開始變化。

模型開始適應。

reward 開始波動。

某一瞬間，曲線短暫穩定。

Morrow 看著那條線。

沒有說話。

因為他知道：

**這才是真正的戰場。**

---

# 44

另一邊。

Aster也在看著類似的東西。

不是同一套系統。

卻是同一個問題。

攻擊者會學。

防守者也會學。

資料會變。

模型會變。

策略會變。

最後：

*`System_(t+1) ≠ System_t`*

每一次防守，都會改變下一次攻擊的條件。

每一次攻擊，也都會改變下一次防守的資料。

沒有固定 baseline。

沒有永恆的 normal。

只有：

*`Normal_t`*

然後：

*`Normal_(t+1)`*

---

# 45

Aster把筆放下。

窗外沒有星星。

地下七層看不到天空。

他卻忽然想起上篇那張 graph。

那些一開始毫不起眼的 edge。

現在他終於知道：

它們不是故事的開始。

它們只是第一層。

真正的攻防，已經從：

**「誰能隱藏？」**

走到了：

**「誰能定義正常？」**

而這兩者之間，只差一個看似無害的東西：

**資料。**

資料可以描述世界。

也可以改變模型。

模型可以理解世界。

也可以改變人類如何理解世界。

一旦這個循環閉合，

攻擊者就不必再控制 endpoint。

不必再控制 server。

甚至不必控制 network。

只需要讓防守系統在某個時刻，

對某件事情產生一個錯誤的信念。

然後讓那個信念自己活下去。

---

## 尾聲

凌晨 03:17。

兩個城市。

兩個房間。

兩個人。

Aster。

Morrow。

他們都看著模型。

都知道對方存在。

卻不知道對方在哪裡。

螢幕上的曲線緩慢移動。

沒有勝負。

只有 feedback。

Aster低聲說：

「模型會犯錯。」

Morrow 同一時間說：

「模型會學習。」

兩句話，在不同城市裡同時落下。

而真正沒有人說出口的是：

**最危險的不是模型犯錯。**

而是模型犯錯之後，

人類相信了它。

---

# 技術附錄：模型完整性攻防抽象架構

本篇的攻防並不建立在「駭入 AI 伺服器」這種廉價敘事上。

紅隊的核心目標，是讓：

*`D_train`*

與真實世界：

*`D_true`*

之間產生一個細微但具有方向性的差異。

最終使：

*`arg min_θ 𝓛(θ, D_train)`*

在某個局部輸入區域產生錯誤 decision boundary。

藍隊則從四個方向驗證：

*`Production Model`*

↓

*`Decision Audit`*　+　*`Representation Analysis`*　+　*`Gradient / Local Sensitivity`*

↓

*`Data Attribution`*

↓

*`Dataset Lineage`*

↓

*`Independent Rebuild`*

↓

*`Reproducible Evidence`*

最終要驗證的不是：

> 「這個模型是不是被駭了？」

而是：

*`f_θA(x) ≠ f_θB(x)`*

並且這個 divergence 能在不同資料血緣、不同 pipeline、不同訓練環境下被重現。

這時候，問題才從「模型怪怪的」進入真正的 **ML Integrity Incident**。

而故事裡真正重要的技術轉折，也不是某一個 poisoning algorithm。

是這個：

*`Authenticity ≠ Correctness ≠ Truth`*

資料有簽章，不代表資料正確。

模型能收斂，不代表模型理解正確。

Validation 通過，也不代表世界沒有攻擊。

**當防守者開始懷疑「自己相信什麼」，攻防才真正從網路層進入演算法層。**

而下一場戰爭，已經不在資料裡。

它在——

*`Model`* → *`Decision`* → *`Feedback`* → *`Model'`*

裡面。

這一次，敵人不再只想騙過模型。

**敵人開始學習模型是怎麼學習的。**