#《隱形兵器 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

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

她說。

「那太粗糙。」

「我們先建模。」


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

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

例如:

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。」

她把幾個節點連起來。


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。


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:

User
Device
Domain
Service
Certificate
Process
Identity

Edge:

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|技術架構

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

藍隊則採取另一條路:

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。

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

Unknown
   ↓
Observe
   ↓
Correlate
   ↓
Model
   ↓
Classify

而不是:

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。

這就是下一篇。

《盲區手術》。

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

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

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