#《飽和攻防 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 歲老男人的最後一點浪漫。
年輕的工程師喜歡談「完美防禦」。
四十五歲以後,真正做過幾場戰的人,通常只會說:
「我不知道哪裡會出事。」
然後補一句:
「所以我把不知道的地方,盡量留給自己看得見。」
這不是悲觀。
這是成熟。
也是所有真正高階資安架構,最後都會走向的東西:
不是相信自己無敵。
而是確保——
當自己錯的時候,系統還活著。
