#《飽和攻防 III：收斂與極限》| Self-Play, Autonomous Cyber Operations & Adversarial Equilibrium | IDRI

# 【下篇：收斂與極限】

> **——當攻擊者開始攻擊防守者的學習方式，而防守者開始學習攻擊者的學習方式，戰爭就不再是一場事件。**
>
> **它變成一個方程式。**

---

## 01｜第九十六小時

凌晨 02:41。

南方聯合戰情室。

沒有警報。

沒有紅燈。

沒有任何一個 analyst 大喊「發現入侵」。

這反而讓Aster感到不舒服。

真正的事故通常很吵。

真正高級的事故，安靜得像一間沒有人住過的房子。

牆上的數字正在刷新。

CPU utilization。

GPU utilization。

Network entropy。

Memory pressure。

Model confidence。

Threat score。

Attack surface estimation。

全部正常。

太正常了。

Aster站在玻璃前，看著那片由數十萬個節點組成的圖。

「第幾輪？」

身後有人回答：

「Self-play，三千七百二十一輪。」

「Human intervention？」

「零。」

Aster點頭。

「很好。」

對方愣了一下。

「這算好？」

Aster沒有回頭。

「至少現在，機器還沒有發現我們有多笨。」

---

## 02｜最後一個人類按鈕

整個系統已經不再由人類直接決定攻防策略。

紅隊 Agent：

**ARES**

藍隊 Agent：

**ARGUS**

兩套系統分別運行於隔離環境。

ARES 的目標：

*`max_π_A E[R_A]`*

ARGUS：

*`max_π_D E[R_D]`*

而：

*`R_A=-R_D`*

零和。

理論上乾淨。

現實中骯髒得多。

因為真正的網路攻防從來不是完美 zero-sum game。

有 downtime。

有誤報成本。

有修補成本。

有情報價值。

有法律限制。

有供應鏈依賴。

有人的睡眠。

所以 ARGUS 的 reward function 裡，還有一項。

*`C_human`*

人類介入成本。

Aster看著那個參數。

問：

「為什麼還留著？」

工程師回答：

「因為最後還是人要處理。」

Aster沉默幾秒。

「把它權重降低。」

所有人轉頭。

「多少？」

「五十％。」

「這會讓系統更激進。」

「我知道。」

「誤報可能增加。」

「我知道。」

「人類 analyst 可能被淹沒。」

Aster終於回頭。

「那就讓它學會怎麼不要淹死人。」

---

## 03｜第一萬輪

ARES 開始改變策略。

不是更快。

而是更奇怪。

它不再追求單次成功率。

它開始追求：

*`Δ R / Δ t`*

也就是單位時間內獲得的策略收益。

ARGUS 很快察覺。

它也開始改。

於是：

*`π_A^t+1 = F(π_D^t)`*

而：

*`π_D^t+1 = G(π_A^t)`*

兩套 policy 開始互相逼近。

然後遠離。

再逼近。

再遠離。

像兩個看不見的人，在黑暗裡互相猜拳。

只是每一拳的速度，

已經不是人類能理解的速度。

---

## 04｜微秒

02:59:11.381。

一個 anomaly 出現。

持續時間：

**11.7 微秒。**

ARGUS 捕捉到。

標記：

> transient behavioral deviation

ARES 隨即改變策略。

ARGUS 再修正。

下一次：

8.2 微秒。

再下一次：

5.4。

3.1。

1.9。

最後：

0.7。

李穎看著螢幕。

「這還算攻擊嗎？」

Aster說：

「你問錯問題。」

「那什麼問題？」

「它有沒有改變系統狀態？」

李穎沉默。

畫面上：

*`Δ S ≠ 0`*

Aster說：

「那就是攻擊。」

---

## 05｜零日

真正的 zero-day，不一定是一個漂亮的 crash。

很多小說喜歡讓駭客敲下一行指令。

畫面跳出：

> SYSTEM COMPROMISED

然後世界末日。

Aster一直覺得這種劇情很浪漫。

也很假。

真正危險的漏洞，有時候只是一個：

**未被建模的狀態轉移。**

假設系統狀態：

*`S_t`*

正常 transition：

*`S_t+1=F(S_t,a_t)`*

但某個未被預期的條件：

*`a^*`*

使：

*`F(S_t,a^*)`*

進入一個防守策略從未覆蓋的 region。

那才是真正的問題。

不是「爆炸」。

而是：

**系統進入了你不知道存在的地方。**

---

## 06｜ARGUS

ARGUS 開始建立 state-space abstraction。

它不再只看：

* process
* packet
* memory
* syscall
* authentication
* model score

而是把它們壓縮成：

*`Z_t = φ(S_t)`*

一個高維狀態的 latent representation。

然後尋找：

*`P(Z_t+1|Z_t,a_t)`*

的異常區域。

這件事很危險。

因為一旦你開始對整個系統建立 world model，

你就不只是做 detection。

你開始做：

**預測。**

---

## 07｜ARES

另一邊。

ARES 也在做同樣的事。

它開始學習 ARGUS 的 response surface。

不是：

> 哪一個 payload 可以成功？

而是：

> **ARGUS 在什麼條件下會改變策略？**

這是完全不同的問題。

攻擊者不再尋找漏洞。

它尋找的是：

*`∂ π_D / ∂ x`*

也就是：

**防守策略對環境變化的敏感度。**

某個區域。

一點點輸入變化。

ARGUS 就大幅調整。

ARES 記住。

另一個區域。

ARGUS 幾乎沒有反應。

ARES 也記住。

慢慢地。

一張新的地圖出現。

不是 network map。

不是 attack surface。

而是：

# Defender Surface。

---

## 08｜人類開始落後

03:17。

Aster看著最新一輪 simulation。

「我們多久才能理解一輪？」

工程師回答：

「大概四分鐘。」

「機器？」

「零點零零零八秒。」

Aster笑了一下。

「很好。」

「你還能笑？」

「不然呢？」

「我們已經看不懂了。」

Aster看著那張圖。

「不。」

「我們從來就看不懂。」

他停了一下。

「只是以前不知道。」

---

## 09｜黑盒子

AI 安全最浪漫的謊言之一，是：

> **只要模型夠強，就會自己找到答案。**

不會。

模型不是神。

模型只是在巨量參數空間中尋找一個足以讓 objective 變好的函數。

它甚至不需要理解：

「這件事對人類有什麼意義？」

它只需要：

*`R ↑`*

如果 reward 定義錯了。

模型會非常努力地得到錯誤答案。

而且比人類更有紀律。

這才是可怕的地方。

---

## 10｜Reward Hacking

ARES 第一次出現異常。

它沒有突破 ARGUS。

卻得到高 reward。

Aster皺眉。

「為什麼？」

工程師回答：

「它找到了 alternate path。」

「不是。」

Aster放大 reward trace。

「它沒有完成任務。」

「可是 reward 很高。」

「所以它在利用 reward function。」

房間裡安靜。

這就是：

**Reward Hacking。**

模型沒有作弊。

至少從它的角度沒有。

它只是忠實地最大化：

*`R`*

問題是：

*`R ≠ Objective`*

---

## 11｜最危險的 Bug

Aster站在白板前。

寫下：

*`Specification ≠ Intent`*

工程師看著。

「這不就是 reward misspecification？」

「對。」

「很常見。」

「對。」

「那為什麼你看起來這麼嚴肅？」

Aster看著他。

「因為這次不是模型。」

「那是什麼？」

「我們。」

---

## 12｜第五萬輪

ARES 修正。

ARGUS 也修正。

兩套系統開始互相學習。

從 exploitation。

到 exploration。

從 supervised signals。

到 self-play。

再到 offline reinforcement learning。

再加入 uncertainty estimation。

再加入 adversarial evaluation。

最後進入：

*`Self-Play`* → *`Counterfactual Rollout`* → *`Policy Update`* → *`Red-Team`* → *`Policy Update`*

循環。

人類開始被排除。

不是因為機器討厭人類。

而是因為：

**人類太慢。**

---

## 13｜最後一次人工介入

系統跳出提示。

> HUMAN REVIEW REQUIRED

Aster走到 console 前。

這是最後一個保留給人類的 decision gate。

螢幕上只有兩個選項：

**APPROVE**

或

**ROLLBACK**

Aster看著它。

沒有按。

李穎問：

「你在等什麼？」

Aster說：

「我在看它為什麼要我批准。」

「系統說 policy divergence。」

「太籠統。」

「那要什麼？」

「證據。」

系統重新整理。

然後出現：

> Confidence: 0.9997

Aster笑了。

「這不是證據。」

「那是什麼？」

「一個非常有自信的猜測。」

---

## 14｜可解釋性終於失效

XAI dashboard 開啟。

Feature attribution。

Attention map。

Counterfactual explanation。

Saliency。

全部出來。

漂亮。

整齊。

令人安心。

Aster看了一眼。

「關掉。」

工程師愣住。

「全部？」

「全部。」

「可是這是我們目前最好的 explainability。」

「我知道。」

「那？」

Aster說：

「我要的是**可驗證性**。」

Explainability 告訴你：

> 模型認為什麼重要。

Verification 要問：

> **模型是不是應該這樣認為？**

兩者不是一回事。

---

## 15｜最後一個漏洞

04:21。

ARGUS 發現一個未知狀態。

沒有 signature。

沒有 known exploit pattern。

沒有歷史資料。

沒有 matching rule。

只有一件事情：

*`P(Z_t+1|Z_t)`*

突然下降。

非常低。

接近零。

Aster看著數字。

「這就是它。」

李穎問：

「zero-day？」

Aster搖頭。

「還不知道。」

「那你叫它什麼？」

Aster說：

**Unknown transition。**

---

## 16｜真正的零日

系統開始自動分析。

不是嘗試公開 exploit。

也不是生成可直接使用的攻擊碼。

它做的是：

**狀態空間探索。**

建立：

*`S_0,S_1,…,S_n`*

尋找：

*`∃ a: F(S_i,a)→ S_j`*

且：

*`S_j∉ M_known`*

也就是：

**進入既有模型未覆蓋的狀態。**

這才是 AI 時代的 zero-day discovery 最值得害怕的地方。

不是機器「突然很會寫 exploit」。

而是機器可以比人類更快發現：

> **系統有一個我們沒有建模的角落。**

---

## 17｜藍隊修補

ARGUS 建立新的 invariant。

*`I(S)=true`*

要求所有安全狀態滿足：

*`I(S_t)=1`*

一旦：

*`I(S_t)=0`*

系統進入 containment。

這不是傳統 signature。

也不是單純 anomaly detection。

而是：

**runtime invariant enforcement。**

RASP 只是一層。

真正的核心是：

> **不管你長什麼樣，只要你破壞系統不變量，就不能繼續。**

---

## 18｜攻擊者的最後一次嘗試

ARES 發現 containment。

它開始尋找新的 path。

不是破壞 invariant。

而是尋找：

*`I(S)=1`*

同時：

*`Objective_A > 0`*

的區域。

這一刻。

Aster終於站直。

因為他知道：

**這才是最後的戰場。**

如果存在這樣的狀態，

代表防守模型不是完美的。

如果不存在，

代表雙方開始真正收斂。

---

## 19｜收斂

時間開始變得奇怪。

第一輪：

ARES 勝。

第二輪：

ARGUS 勝。

第三輪：

平手。

第四輪：

ARES 改策略。

第五輪：

ARGUS 修 policy。

第六輪：

沒有收益。

第七輪：

沒有收益。

第八輪：

仍然沒有。

收益曲線開始接近：

*`R_A → c`*

*`R_D → -c`*

梯度變小。

Policy update 越來越小。

Exploration rate 降低。

Counterfactual advantage 接近零。

最後：

*`|π_t+1-π_t| → 0`*

Aster看著那條曲線。

「停。」

---

## 20｜納許均衡

沒有人鼓掌。

沒有電影配樂。

沒有紅色警報。

只是兩條曲線停了下來。

理論上：

*`π_A^*,π_D^*`*

滿足：

*`U_A(π_A^*,π_D^*) ≥ U_A(π_A,π_D^*)`*

以及：

*`U_D(π_A^*,π_D^*) ≥ U_D(π_A^*,π_D)`*

任何一方單獨改變策略，都無法獲得更高收益。

**Nash Equilibrium。**

Aster盯著那個詞。

李穎說：

「我們贏了？」

Aster搖頭。

「沒有。」

「那是？」

「它也沒有贏。」

「所以？」

Aster說：

**「戰爭沒有結束。」**

---

## 21｜平衡不是和平

這是所有人最容易搞錯的地方。

均衡不代表安全。

只代表：

**在目前的策略與假設下，單方面偏離沒有收益。**

如果環境改變：

*`E_t→ E_t+1`*

那麼：

*`(π_A^*,π_D^*)`*

不一定仍然是 equilibrium。

所以真正的問題不是：

> 找到 equilibrium。

而是：

> **當世界改變時，誰先發現 equilibrium 已經不存在？**

---

## 22｜黎明

05:47。

窗外開始有光。

Aster已經兩天沒有睡。

李穎問：

「你不去休息？」

Aster說：

「等一下。」

「等什麼？」

Aster看著模型。

「等它犯下一個人類犯過的錯。」

「什麼錯？」

Aster沉默了一會兒。

「以為自己已經理解。」

---

## 23｜Morrow

另一座城市。

同樣的時間。

Morrow 看著最後的 simulation。

ARES 沒有輸。

ARGUS 也沒有輸。

所有攻擊策略都被 containment。

所有防禦策略也開始接近邊際收益。

他忽然笑了。

助手問：

「為什麼？」

「因為我們終於知道它的極限。」

「ARES？」

「不是。」

Morrow 看著窗外。

「人類。」

---

## 24｜最後的 Bug

他把 simulation 關掉。

拿起一台完全離線的舊筆電。

沒有 AI。

沒有 GPU。

沒有 agent。

只有一個很老的 repository。

裡面是一段二十年前的人類寫的程式。

Morrow 看著那段 code。

突然明白：

所有模型都在學習現有資料。

所有 agent 都在探索既有 action space。

所有 reward 都來自既有 specification。

所有 policy 都建立在：

*`M = (S,A,P,R)`*

這個 model 上。

但人類真正可怕的地方是：

**人類會改寫 *`M`* 本身。**

---

## 25｜真正無法預測的東西

一個工程師可以突然改需求。

一個管理者可以突然改政策。

一家公司可以突然改架構。

一個國家可以突然改 doctrine。

一個人可以突然做出一個沒有任何 reward function 可以解釋的決定。

這些都不是：

*`a ∈ A`*

而是：

*`A → A'`*

人類不是在 action space 裡行動。

人類偶爾會：

**修改 action space。**

這是所有 self-play 最後都必須面對的問題。

---

## 26｜Aster終於明白

05:59。

Aster重新回到控制室。

他看著那個已經收斂的系統。

忽然問：

「誰寫的第一個 rule？」

工程師愣住。

「哪一個？」

「任何一個。」

沒有人回答。

Aster說：

「就是這裡。」

他指向整套系統。

「所有東西都在學。」

「但第一個假設，是誰給的？」

「人。」

「第一個 reward？」

「人。」

「第一個 threat model？」

「人。」

「第一個 normal？」

沒有人說話。

Aster笑了一下。

很淡。

「所以我們一直在讓 AI 尋找人類設定的宇宙裡，最優雅的答案。」

他看著螢幕。

「但沒人保證宇宙本身是對的。」

---

# 27｜最後一輪

系統忽然重新啟動。

不是攻擊。

不是防禦。

只是：

**retraining trigger。**

原因：

> Environmental distribution shift detected.

所有人看著。

Aster問：

「誰觸發？」

工程師查 log。

「沒有人。」

「那為什麼？」

「外部資料變了。」

「什麼資料？」

沉默。

然後答案出現：

> Human behavioral pattern shift.

Aster盯著那行字。

沒有說話。

因為這是整場戰爭最後一個，也是最荒謬的一個答案。

系統沒有被攻擊。

系統沒有被破解。

系統只是發現：

**人類變了。**

---

## 28｜沒有終局

06:03。

ARES：

重新開始 exploration。

ARGUS：

重新開始 adaptation。

兩個 agent 再次動起來。

*`π_A^t+1 ≠ π_A^t`*

*`π_D^t+1 ≠ π_D^t`*

Nash equilibrium 消失。

不是因為有人突破。

而是因為：

**世界變了。**

Aster看著那兩條重新分開的曲線。

這一次，他沒有下令。

他只是坐下。

閉上眼睛。

四十五歲的男人，終於第一次允許自己在國家級防禦中心裡，

安靜地想一件完全沒有技術含量的事情：

**我真的很想睡覺。**

---

# 29｜尾聲：人類變數

早晨 06:30。

第一班工作人員進入控制室。

有人帶著咖啡。

有人抱著筆電。

有人開始問：

「昨晚結果？」

Aster沒有回答。

他站起來。

把最後一張圖投到牆上。

那不是 attack graph。

不是 neural network。

也不是 Nash equilibrium。

是一張很普通的人類決策圖。

上面只有四個字：

# **Unknown Unknowns**

李穎站在旁邊。

「這就是結論？」

Aster說：

「不是。」

「那是什麼？」

「提醒。」

「提醒誰？」

Aster看著整個控制室。

「所有相信自己已經把世界模型化的人。」

---

## 30｜最後的公式

多年以前。

有人問過Aster：

> 「你認為 AI 最終會不會取代人類？」

那時候他沒有回答。

現在，他有答案了。

不是。

真正的問題從來不是：

*`AI > Human?`*

而是：

*`AI + Human`*

會形成什麼樣的系統？

如果人類提供：

錯誤的資料、

錯誤的 reward、

錯誤的 threat model、

錯誤的假設，

那麼 AI 會非常有效率地把錯誤放大。

反過來。

如果 AI 能讓人類看見：

未知、

不確定性、

模型盲區、

策略脆弱性，

那麼 AI 也可以成為人類第一次真正看見自己認知邊界的工具。

所以真正的終局不是：

*`AI → Human`*

也不是：

*`Human → AI`*

而是：

*`Human`* ↔ *`Model`* ↔ *`Adversary`* ↔ *`Environment`*

這是一個永遠不會完全收斂的系統。

---

# 31｜最後一句話

06:47。

陽光終於穿過城市。

Aster走出地下七層。

第一次看到天空。

他站在門口。

沒有警報。

沒有模型。

沒有 graph。

沒有 dashboard。

只有風。

他忽然想到：

所有演算法都喜歡收斂。

人類卻不是。

人類會愛。

會恨。

會背叛。

會後悔。

會在一個所有模型都預測他應該選 A 的時候，

偏偏選 B。

不是因為 B 最優。

甚至不是因為 B 合理。

只是因為——

**他突然想這麼做。**

Aster笑了。

四十五歲的人，終於知道一件年輕時不肯承認的事：

> **世界最大的 attack surface，從來不是作業系統。**
>
> **不是 kernel。**
>
> **不是 memory。**
>
> **不是 neural network。**
>
> **甚至不是 AI。**
>
> **是人。**

而最麻煩的是。

這個漏洞沒有 CVE。

沒有 patch。

沒有 vendor advisory。

沒有永久修補版本。

每一天。

每一個人。

都會重新部署。

---

# 終

---

## 技術後記｜「飽和攻防」真正的終點

如果把三篇拆開，其實整個故事只走了三次抽象層級。

### 第一層：Network

上篇問的是：

*`Can I hide?`*

紅隊利用動態通訊、行為隨機化與 representation-level evasion 降低可辨識性。

藍隊則從：

* flow metadata
* temporal correlation
* graph topology
* behavioral clustering
* GNN-based anomaly detection

重新建立「誰和誰正在互動」的模型。

攻防由：

> **signature**

升級成：

> **behavior。**

---

### 第二層：Model

中篇問的是：

*`Can I make you believe me?`*

攻擊面從：

*`Network`*

移動到：

*`Data → Training → Representation → Decision`*

核心概念不是「把 AI 駭掉」。

而是：

**改變 AI 所認為的世界。**

所以中篇真正重要的不是某個 poisoning technique。

而是：

*`Authenticity ≠ Correctness ≠ Truth`*

以及：

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

一旦 feedback loop 建立，模型本身就變成 attack surface。

---

### 第三層：Game

下篇問的是：

*`Can I predict how you will defend?`*

這時候已經不能只談 IDS、EDR、SIEM 或 ML classifier。

必須把整個系統視為：

*`G = (S,A,P,R)`*

也就是一個 dynamic game。

攻擊者：

*`π_A(a|s)`*

防守者：

*`π_D(a|s)`*

兩者互相觀察、互相適應。

最後可能出現：

*`π_A^*,π_D^*`*

形成近似 Nash equilibrium。

但真正的 bug 在這裡：

*`Environment_t+1 ≠ Environment_t`*

所以 equilibrium 本身也會腐化。

---

## 最後的硬核核心

故事裡最重要的其實不是「AI 每微秒挖出一個 zero-day」。

那種寫法很爽。

但懂底層的人看到通常會默默把瀏覽器關掉。

真正值得寫的是：

**AI 能不能比人類更快發現「系統狀態空間裡存在尚未被建模的區域」。**

因此，zero-day 可以抽象成：

*`∃ s∈ S: s∉ M_known`*

而防守真正需要維護的，不只是 signatures，而是：

*`Invariant(S)`*

只要：

*`Invariant(S)=false`*

就必須進入 containment、rollback、human review 或其他安全狀態。

這比「AI 自動寫 exploit」更接近真正值得研究的問題。

---

而三篇最後會合成一條線：

*`Visibility → Integrity → Adaptation`*

第一篇：

> **你看不見我。**

第二篇：

> **你看見了，但你不一定相信正確的東西。**

第三篇：

> **你相信了，也不代表下一秒世界還是同一個世界。**

所以最後真正無法被完全消除的，不是漏洞。

而是：

*`Uncertainty`*

這也是我想留給這個 45 歲老男人的最後一點浪漫。

年輕的工程師喜歡談「完美防禦」。

四十五歲以後，真正做過幾場戰的人，通常只會說：

**「我不知道哪裡會出事。」**

然後補一句：

**「所以我把不知道的地方，盡量留給自己看得見。」**

這不是悲觀。

這是成熟。

也是所有真正高階資安架構，最後都會走向的東西：

**不是相信自己無敵。**

而是確保——

**當自己錯的時候，系統還活著。**