#《隱形兵器 I：無聲交響樂》| Adaptive C2 Traffic Morphing & Generative Steganographic Communications | IDRI

# 《隱形兵器》

## 紅隊三部曲・上篇：無聲交響樂

### ——當「正常」開始學會偽裝成正常

---

## Story Background｜故事背景

近未來。

全球大型企業與關鍵基礎設施的網路流量，早已不再依賴傳統 IOC、固定特徵碼或單純的封包黑名單。

藍隊知道：

**真正高級的攻擊，不會努力變得「不像攻擊」。**

它會努力變得：

**像一個沒有人值得懷疑的普通人。**

因此，防禦體系已經進入另一個時代。

所有 DNS、TLS、HTTP、Endpoint Telemetry、Identity Event、Process Tree，都被送進中央行為分析平台。

機器學習模型不再只問：

> 「這個封包是不是惡意？」

而是問：

> **「這個行為，像不像它自己？」**

這個問題，比前一個難得多。

---

# 01｜凌晨 02:13

Richard第一次見到那套系統，是在一間沒有窗戶的會議室。

牆上沒有投影機。

只有一面巨大的玻璃螢幕。

螢幕中央浮著一張企業網路行為圖。

數以百萬計的節點。

數以億計的邊。

人員。

裝置。

服務。

Domain。

Cloud workload。

API。

DNS resolver。

Identity provider。

所有東西彼此連接。

像一張巨大而緩慢呼吸的神經網路。

---

林祈安站在螢幕前。

她穿著黑色襯衫。

沒有簡報。

沒有 PowerPoint。

只有 terminal。

「這是我們現在的 baseline。」

她說。

Richard沒有回答。

「三百二十七萬個 endpoint。」

「每天平均四百億條 telemetry。」

「TLS session 超過九十億。」

「DNS query 大概兩百七十億。」

她停了一下。

「我們已經不太看 signature 了。」

Richard終於開口。

「很好。」

「你知道最麻煩的是什麼嗎？」

「什麼？」

她放大其中一個區域。

---

一台普通辦公電腦。

一個普通使用者。

一個普通瀏覽器。

一個普通的 SaaS 平台。

沒有 malware。

沒有奇怪 executable。

沒有明顯 privilege escalation。

沒有可疑 process tree。

沒有高風險 domain。

所有東西都：

**正常。**

---

Richard看了幾秒。

「這是你想讓我看的？」

「不是。」

林祈安說：

「我是想讓你看藍隊。」

---

她把整張圖縮小。

那三百二十七萬個 endpoint 瞬間變成一片星海。

「他們已經開始用 GNN。」

Richard沉默了一秒。

「哪一類？」

「Dynamic heterogeneous graph。」

她回答。

「Node 不只是 host。」

「User、device、domain、certificate、process、identity event 都會變成 node。」

「Edge 代表 interaction。」

「時間是另一個 dimension。」

Richard點頭。

「終於有人開始看關係了。」

---

林祈安笑了一下。

「所以我們才要開始。」

---

# 02｜Morrow

Richard的代號是：

`Morrow`

但團隊裡沒有人叫他這個名字。

大家叫他：

**Richard。**

四十五歲。

做過 kernel。

做過 network stack。

做過 reverse engineering。

也做過 management。

他曾經在白天開董事會。

晚上回去分析 crash dump。

第二天早上再跟財務部門討論預算。

他最大的技能不是會多少工具。

而是：

**知道工具什麼時候會開始欺騙你。**

---

程遠第一次加入團隊時，問過他：

「哥，你以前是不是很常自己寫 exploit？」

Richard說：

「以前？」

「嗯。」

「有。」

「現在呢？」

「現在不寫。」

程遠愣了一下。

「為什麼？」

Richard看著他。

「因為現在有你們。」

停了兩秒。

「而且我懶。」

程遠笑了。

周野坐在角落裡喝咖啡。

淡淡補了一句：

「他只是比較會把工作丟給別人。」

Richard看了他一眼。

「這叫 management。」

周野：

「這叫 delegation。」

Richard：

「同一件事。」

---

# 03｜Quill

林祈安的代號：

`Quill`

她三十二歲。

Machine Learning Engineer。

她對模型的理解，遠比對人深。

她可以看一個 confusion matrix 看兩個小時。

卻不太能理解：

為什麼有人會在會議上說：

> 「我們先保持彈性。」

她曾經說過：

> 「保持彈性，是人類最常用來避免做決定的句子。」

Richard第一次聽到時笑了。

「妳會在公司活得很辛苦。」

「我知道。」

「那為什麼還留著？」

林祈安回答：

「因為薪水。」

Richard點頭。

「很好。」

「至少這個答案是真的。」

---

# 04｜第一個模型

林祈安打開 notebook。

螢幕上出現：

`Behavior Encoder`

「我們不直接生成命令。」

她說。

「那太粗糙。」

「我們先建模。」

---

她的模型輸入不是單一封包。

而是一段時間內的行為序列。

例如：

```text
User
  ↓
Device
  ↓
DNS
  ↓
TLS Session
  ↓
Application
  ↓
Cloud Service
  ↓
Response Pattern
```

模型真正學習的是：

**一個行為如何變成另一個行為。**

而不是：

「某個封包長什麼樣子。」

---

Richard問：

「VAE？」

「第一版。」

「為什麼？」

「因為我們要 latent representation。」

她在螢幕上輸入：

*`x → Encoder → z → Decoder → x'`*

「我們不是直接複製資料。」

「我們要的是行為空間。」

---

周野抬頭。

「你想讓模型學什麼？」

林祈安說：

「正常。」

周野皺眉。

「什麼叫正常？」

她沒有立刻回答。

---

Richard卻笑了。

「很好。」

林祈安看向他。

「什麼很好？」

「這才是問題。」

---

# 05｜Normal Is Not Safe

真正困難的不是建立 malware model。

而是建立：

**normality model。**

因為正常從來不是一個固定值。

它是一個分布。

一個使用者早上八點登入。

另一個人凌晨兩點還在工作。

一台 workstation 每天連某個 SaaS。

另一台幾乎只使用內部服務。

同樣的 DNS query。

在不同 context 下。

可能完全不同。

因此：

*`P(x)`*

從來不等於：

*`P(x | context)`*

---

林祈安說：

「如果我們只學流量。」

「會過度擬合。」

「如果只學 user。」

「會漏掉 device behavior。」

「如果只學 device。」

「又會失去 temporal context。」

她把幾個節點連起來。

---

```text
User
  ↓
Device
  ↓
Time
  ↓
Service
  ↓
Behavior
```

---

「我們真正需要的是 conditional behavior。」

Richard看著圖。

「也就是說。」

他說：

「你不是要讓流量看起來正常。」

「你是要讓整個事件，在它所處的上下文裡看起來合理。」

林祈安點頭。

「對。」

Richard沒有再說話。

因為這句話，比任何漂亮的模型架構都重要。

---

# 06｜另一端

距離紅隊基地數百公里之外。

顧青禾正在看同一種圖。

但她看的方式完全不同。

---

「停。」

她說。

整個 SOC 安靜下來。

值班工程師問：

「哪裡？」

顧青禾指向螢幕。

「這個 cluster。」

「風險分數不高。」

「我知道。」

「IOC 也沒有。」

「我知道。」

「那為什麼？」

顧青禾靠近螢幕。

---

她沒有看單一 node。

她看的是：

**relationship。**

---

「這些 endpoint。」

她說。

「彼此沒有直接關係。」

「可是 behavior topology 太像了。」

分析師皺眉。

「意思是？」

顧青禾回答：

> 「不是同一個人。」

> 「卻像是同一個人做的決定。」

---

房間安靜下來。

---

# 07｜Aster

顧青禾的代號：

`Aster`

四十五歲。

Blue Team Principal Architect。

她不是 SOC analyst。

也不是單純的 incident responder。

她真正擅長的是：

**理解系統開始偏離正常狀態的那一刻。**

她曾經與Richard合作過。

很久以前。

那時候兩人都還相信：

只要架構夠好。

系統就會按照設計運作。

後來他們都發現：

**系統從來沒有答應過你。**

---

顧青禾看著圖。

「把 temporal graph 拉出來。」

工程師執行。

節點開始按照時間展開。

---

沒有爆點。

沒有紅色。

沒有警報。

只有一些非常細微的變化。

某些 session 的時間分布開始偏移。

某些 DNS 行為出現新的 correlation。

某些 endpoint 的行為 entropy 略微降低。

不是很多。

甚至不足以觸發 alert。

---

但顧青禾知道。

**有人正在學會如何成為正常。**

---

# 08｜第一次碰撞

紅隊的模型第一次輸出結果。

林祈安看著 dashboard。

`Behavioral Similarity: 0.982`

程遠問：

「成功？」

林祈安說：

「還早。」

「為什麼？」

「因為 similarity 不是 indistinguishability。」

程遠皺眉。

「差在哪？」

Richard替她回答：

「你能騙過一個 classifier。」

「不代表你能騙過整個 system。」

---

這就是第一個問題。

藍隊不再依賴單一 detection model。

它是一整個 ensemble。

---

```text
Network Model
      +
Identity Model
      +
Endpoint Model
      +
Graph Model
      +
Temporal Model
      ↓
Risk Aggregation
```

---

攻擊者要面對的。

不再是一扇門。

而是一棟建築。

---

# 09｜Richard的第一條規則

紅隊會議。

所有人站在白板前。

Richard拿起筆。

沒有寫 exploit。

沒有寫 payload。

只寫：

**RULE #1**

下面：

> **不要讓模型替你決定攻擊。**

程遠看不懂。

「可是我們做 autonomous system。」

「對。」

「那不是矛盾嗎？」

Richard說：

「不是。」

「Automation 可以決定怎麼走。」

「不能決定為什麼走。」

---

林祈安看著那句話。

沒有反駁。

---

Richard繼續：

「我們不追求最強。」

「我們追求最穩。」

「因為一個太聰明的攻擊。」

「通常也會太有個性。」

周野點頭。

「可辨識。」

Richard看向他。

「對。」

---

# 10｜Noise

第二輪模型開始運轉。

它學習的不是固定流量。

而是 variation。

時間變化。

session variation。

合法服務之間的差異。

使用者工作習慣。

甚至錯誤率。

因為：

**真正的人類行為從來不完美。**

---

林祈安說：

「如果所有東西都太漂亮。」

「反而會被看見。」

Richard笑了。

「終於開始懂人了。」

她看他。

「什麼意思？」

「人類最穩定的特徵。」

「就是不穩定。」

---

# 11｜藍隊開始反擊

顧青禾沒有追 domain。

沒有追 IP。

沒有追 certificate。

她追：

**entropy。**

---

某些正常使用者的行為。

會有很高的 variability。

但某些新的 cluster：

太穩。

不是 deterministic。

而是：

**statistically disciplined。**

---

顧青禾說：

「把這個特徵加入 graph。」

分析師問：

「risk threshold？」

「先不要。」

「為什麼？」

「我不知道它是不是攻擊。」

她停了一下。

「但我知道它值得觀察。」

---

這就是顧青禾和一般 SOC 的差異。

她不急著把未知變成惡意。

她先讓未知：

**留下來。**

---

# 12｜第一次失敗

紅隊測試結果：

`Detection Probability: 0.31`

程遠笑了。

「很低。」

Richard搖頭。

「太高。」

「31%？」

「對。」

「為什麼？」

「因為我們還有 pattern。」

---

林祈安重新看模型輸出。

她開始分析 latent space。

結果讓她沉默。

---

紅隊的行為雖然接近正常。

但在更高階的 representation 裡：

它們仍然聚成一個奇怪的區域。

---

她說：

「他們沒看到我們。」

Richard問：

「那他們看到什麼？」

林祈安回答：

> 「他們看到我們的模型。」

---

Richard笑了。

「這就麻煩了。」

---

# 13｜Graph

藍隊 GNN 開始更新。

Node：

```text
User
Device
Domain
Service
Certificate
Process
Identity
```

Edge：

```text
Communicates
Authenticates
Resolves
Executes
Downloads
Accesses
```

每個 edge 都帶有時間。

---

顧青禾看著圖。

一個 node 的風險並不高。

但它的鄰居開始出現微小變化。

她把視角拉遠。

---

一個 endpoint。

沒有問題。

十個 endpoint。

沒有問題。

一百個。

還是沒有問題。

但整個 subgraph：

**開始不像自然形成。**

---

顧青禾說：

「找到它了。」

---

# 14｜真正的追蹤

藍隊沒有封鎖。

這讓紅隊沒有察覺。

顧青禾開始做：

**passive observation。**

她沒有打草驚蛇。

她只是增加 telemetry。

觀察：

* temporal consistency
* graph centrality
* behavioral drift
* session relationship
* identity correlation

---

她不是在抓一個 C2。

她在問：

> **這個東西如果繼續活著，會自然長成什麼？**

---

這個問題讓Richard第一次真正警覺。

因為他知道：

成熟的防守者不是追著攻擊跑。

他們會：

**等攻擊者自己長出輪廓。**

---

# 15｜Richard與顧青禾

兩人隔著幾百公里。

沒有通訊。

沒有對話。

但他們都知道：

對方已經在棋盤上。

---

Richard站在窗前。

林祈安問：

「你認識她？」

「認識。」

「很厲害？」

「非常。」

「比你厲害？」

Richard想了一下。

「不同。」

「哪裡不同？」

他說：

> 「我習慣找門。」

> 「她習慣找房子。」

---

林祈安第一次露出笑容。

「這算稱讚嗎？」

「算。」

---

# 16｜第二條規則

Richard在白板寫下：

**RULE #2**

> **不要攻擊你已經知道會被發現的地方。**

周野看了一眼。

「那我們攻擊什麼？」

Richard回答：

「問題本身。」

程遠皺眉。

「什麼意思？」

Richard沒有解釋。

林祈安卻懂了。

---

如果藍隊正在尋找：

`C2`

那麼紅隊不應該只思考：

「怎麼藏 C2。」

而應該問：

**「為什麼藍隊需要 C2 這個概念？」**

---

這是另一個層次的攻防。

---

# 17｜交響樂

紅隊第二次運行。

沒有固定節奏。

沒有單一 pattern。

只有一群彼此獨立、看起來毫不相關的行為。

像城市。

像辦公室。

像普通人。

---

林祈安看著模型。

「現在呢？」

Richard沒有看 dashboard。

他看窗外。

「現在開始像音樂了。」

「什麼？」

「每一個單獨的聲音都沒有問題。」

「但放在一起。」

他停了一下。

「才會知道有人正在演奏。」

---

# 18｜顧青禾的答案

藍隊最終沒有產生 alert。

反而建立了一個新的 detection class：

`Behavioral Emergence`

不是：

`Malware`

不是：

`C2`

不是：

`Anomaly`

而是：

**Emerging Pattern。**

---

顧青禾說：

「先不要命名它。」

分析師問：

「為什麼？」

「一旦命名。」

「我們就會開始用名字找它。」

她看著螢幕。

「我想知道它自己會變成什麼。」

---

這一次。

換藍隊開始等待。

---

# 19｜最後一次測試

紅隊的模型完成最後一次迭代。

林祈安看著結果。

所有主要 statistical feature 都落在 baseline 附近。

Graph embedding 沒有明顯偏移。

Temporal profile 沒有明顯異常。

Risk aggregation 沒有突破 threshold。

---

程遠問：

「我們成功了？」

Richard沒有回答。

林祈安也沒有。

---

因為螢幕最下面。

有一行極小的字：

`Out-of-Distribution Probability: 0.018`

---

只有 1.8%。

很小。

小到幾乎可以忽略。

---

Richard卻說：

「停。」

---

所有人停下。

---

# 20｜1.8%

林祈安問：

「為什麼？」

Richard指著那個數字。

「因為那不是我們。」

她看著他。

「什麼意思？」

「那是模型自己不理解的東西。」

---

周野靠過來。

「可能只是 sampling artifact。」

「可能。」

Richard說。

「也可能是藍隊。」

---

房間安靜。

---

林祈安重新跑 analysis。

這次。

她沒有看 detection score。

她看 uncertainty。

---

結果：

*`Uncertainty ↑`*

---

她第一次明白。

模型不是在說：

**「這是惡意。」**

它是在說：

**「我不知道這是什麼。」**

---

# 21｜真正的戰爭

Richard站起來。

「今天到這裡。」

程遠愣住。

「可是我們還沒有完成。」

「我知道。」

「那為什麼停？」

Richard看著他。

> 「因為我們真正想知道的，不是能不能進去。」

> 「而是對方已經學會多少。」

---

林祈安關掉模型。

螢幕一片黑。

她忽然問：

「Richard。」

「嗯？」

「如果模型有一天真的比我們更懂這個系統呢？」

他停了一下。

「那就代表我們該開始擔心了。」

「為什麼？」

Richard看著黑掉的螢幕。

> 「因為我們會開始相信它。」

---

# 22｜尾聲

凌晨 04:51。

藍隊。

顧青禾仍然沒有離開。

她把最後一份 graph snapshot 存下。

檔名：

`emergence_001`

沒有命名成：

`APT`

沒有命名成：

`C2`

沒有命名成：

`MALWARE`

只有：

**emergence。**

---

她關掉螢幕。

手機震了一下。

沒有重要通知。

她卻忽然想起很多年前。

Richard曾經跟她說：

> 「最危險的東西，不是你看不到。」

> 「而是你看到了，卻不知道它代表什麼。」

---

她笑了一下。

「你還是老樣子。」

---

遠方。

紅隊基地。

林祈安重新打開 notebook。

她沒有再訓練模型。

只是盯著那個：

`0.018`

---

然後她在紙上寫下一句話：

> **Normality is a model.**

下一行：

> **And every model has a blind spot.**

---

她沒有告訴任何人。

---

而在另一座城市。

顧青禾的藍隊模型，也正在產生一個新的 latent cluster。

兩邊都不知道。

那兩個 cluster。

正在慢慢靠近。

---

# 《無聲交響樂》・完

---

# Story Background｜本篇故事背景

《無聲交響樂》發生於「紅隊三部曲」時間線的最前端。

此時紅隊尚未真正取得深層存取權。

藍隊也沒有遭到重大突破。

真正發生的事情，是：

**雙方第一次發現，傳統 IOC 與 signature-based detection 已經不再是主要戰場。**

紅隊開始研究「如何讓行為看起來合理」。

藍隊則開始研究「合理行為如何形成異常的群體結構」。

所以第一篇的核心並不是：

> 紅隊成功滲透。

而是：

> **紅隊第一次意識到，自己正在被另一種完全不同的 AI 看見。**

---

# Technical Architecture｜技術架構

```text
                 ┌──────────────────────┐
                 │   User / Endpoint    │
                 └──────────┬───────────┘
                            ↓
                 ┌──────────────────────┐
                 │ Behavioral Telemetry │
                 └──────────┬───────────┘
                            ↓
                 ┌──────────────────────┐
                 │ Temporal Representation│
                 └──────────┬───────────┘
                            ↓
                 ┌──────────────────────┐
                 │   Latent Behavior    │
                 │      Model           │
                 └──────────┬───────────┘
                            ↓
                 ┌──────────────────────┐
                 │ Behavior Simulation   │
                 └──────────┬───────────┘
                            ↓
                    Red Team Decision
```

藍隊則採取另一條路：

```text
User ─────┐
Device ───┤
Domain ───┤
Process ──┼──→ Dynamic Graph
Identity ─┤
Service ──┘
                ↓
          GNN / Graph Model
                ↓
        Temporal Correlation
                ↓
        Behavioral Emergence
                ↓
          Risk Aggregation
```

真正的技術核心不是某一個模型。

而是：

**representation。**

攻擊者試圖學習「正常行為空間」。

防守者試圖學習「正常行為之間的關係」。

這兩者最後會在同一個 latent space 裡碰撞。

---

# Red Team Objectives｜紅隊目標

1. 建立可持續的 behavioral model。
2. 理解正常使用者、裝置與服務的行為分布。
3. 讓攻擊行為在高階 representation 中降低可分辨性。
4. 避免形成固定、可重複的 behavioral fingerprint。
5. 測試藍隊是否開始從單點 anomaly 轉向 graph-level detection。

**真正的目標不是「隱形」。**

而是：

> **讓藍隊無法證明你不是正常行為。**

這兩件事情差很多。

---

# Blue Team Objectives｜藍隊目標

顧青禾的策略與傳統 SOC 最大差異：

她不追求立即分類。

而是：

**保留 uncertainty。**

因此本篇的藍隊核心概念是：

```text
Unknown
   ↓
Observe
   ↓
Correlate
   ↓
Model
   ↓
Classify
```

而不是：

```text
Unknown
   ↓
Alert
   ↓
Block
```

這會直接成為第二篇《盲區手術》的基礎。

---

# Character Development｜人物變化

### Richard

第一次意識到：

**AI 已經不只是紅隊的武器，也可能成為紅隊最大的鏡子。**

他開始警惕「automation dependency」。

---

### 林祈安

第一篇的她仍然相信：

> **模型只要學得夠好，就能描述世界。**

但 `0.018` 已經在她心裡留下第一道裂痕。

她第一次真正碰到：

**model uncertainty。**

---

### 周野

仍然相信：

> 「最後都是 machine state。」

他對 ML 的態度仍然冷淡。

但他開始注意：

**模型正在發現一些傳統 reverse engineering 看不到的關係。**

---

### 程遠

最年輕。

也最相信 automation。

他還不知道：

**真正危險的不是機器做不到。**

而是機器做得到之後，人類開始懶得問「為什麼」。

---

### 顧青禾

她沒有抓到紅隊。

但她第一次建立：

`Behavioral Emergence`

這個概念。

她知道：

**某些東西正在學習如何成為正常。**

而她決定不急著殺掉它。

她要先看：

**它會長成什麼。**

---

# Hidden Foreshadowing｜下一篇伏筆

本篇留下五個重要伏筆。

### ① `0.018`

不是數字彩蛋。

它代表：

**模型開始產生 uncertainty。**

第二篇會變成攻防雙方爭奪的核心。

---

### ② `emergence_001`

顧青禾沒有把它分類為 malware。

這代表藍隊開始建立一套新的 detection philosophy。

---

### ③ `temporary`

周野在舊 binary 上看到的那個詞，尚未解釋。

第三篇才會真正揭露它的意義。

---

### ④ Richard與顧青禾的過去

兩人不是第一次交手。

他們曾經站在同一邊。

這段歷史會在第二篇開始浮出水面。

---

### ⑤ 林祈安的那句話

> **Normality is a model.**

第二篇會反過來變成：

> **A model can be poisoned.**

而那會把整場戰爭從：

**Network Layer**

推進到：

**Model Layer。**

---

# Leo's Note｜老男人的技術後記

這一篇真正想寫的，其實不是 C2。

C2 太容易寫。

丟幾個：

`TLS`

`DNS`

`VAE`

`GNN`

`Entropy`

再配一個黑色機房。

看起來就很軍工。

但那種東西我看多了。

**名詞堆得越滿，不代表作者越懂。**

真正困難的是理解：

> **攻擊者要偽裝的從來不是一個封包。**

而是一段時間裡，一個人、一台機器、一個身份與一組服務之間形成的**行為關係**。

這才是 behavioral detection 真正棘手的地方。

而防守者最危險的錯誤，也不是漏掉一個 IOC。

是把：

**「我不知道」**

誤判成：

**「沒問題。」**

四十五歲以後，看事情會有一個很討厭的副作用。

你開始知道很多事情不是黑白。

紅隊不一定是聰明。

藍隊也不一定是正確。

AI 更不是上帝。

大家只是在有限資訊裡下注。

而真正值得害怕的，從來不是：

**Unknown。**

真正值得害怕的是：

**Unknown 被系統自動標記成 Known。**

這就是下一篇。

**《盲區手術》。**

那時候，紅隊不再試圖欺騙藍隊的網路。

他們會開始思考一件更髒、更安靜的事情：

> **如果不能讓對方看不到，那就讓對方看到錯的東西。**
