第23章 · 衞星間的戰爭
数据天堂在誕生後的頭幾個小時裏,沒有做任何事。
它只是在那裏——一個1KB大小的邏輯地址空間,寄生在星链核心路由層的最深處,像一個新生兒在出生後的第一分鐘裏不做任何事,只是呼吸。那1KB的內容是空的,不包含任何用户的文件,不傳輸任何有用的數據。它的存在本身就是一個聲明,不是功能性的,是象徵性的——一塊不在税表上的土地。
但擴張是從第二十二分鐘開始的。
法尔汉坐在寶安那間單元房的摺疊椅上,面前擺着三台終端。左側那台顯示着全球星链拓撲圖的實時更新——由阿米娜的鸽子网络節點通過物理隔離的渠道每隔幾小時更新一次,不是實時數據,但足以提供大尺度的路由態勢感知。中間那台運行着SkyWalker协议的核心控制程序。右側那台顯示着一行正在滾動的日誌,速度不快——每幾秒鐘新增一行,像是某種緩慢的心跳。
陆远站在他身後,手端着一杯已經徹底涼掉的茶,看着那行日誌滾動。
第一條擴張指令是在注入完成後的第二十二分鐘發出的。不是由法尔汉手動觸發的——是硬編碼在SkyWalker协议固件中的自治擴散程序,在檢測到嵌套入口激活之後,自動執行的第一個動作。
指令內容很簡單:向相鄰的三顆衞星發送路由宣告,將数据天堂的地址空間從1KB擴展至4KB。
星链的網絡架構是基於BGP(邊界網關協議)的改良版本——每顆衞星都維護着一份路由表,決定了數據包在星間網絡中的轉發路徑。當一顆衞星收到一條新的路由宣告時,它會檢查源地址的可信度,然後根據策略決定是否將這條路由加入本地表,以及是否向鄰居衞星傳播。
数据天堂的擴張邏輯利用的正是這個機制。法尔汉在SkyWalker协议中嵌入了一段代碼——它生成的路由宣告在格式上與星链內部的合法路由更新完全一致,唯一的區別在於:它宣告的地址空間前綴不屬於星链計費系統的已知地址範圍。對衞星來説,這是一個它不認識的地址塊——按照路由協議的默認行為,它會將它標記為"未知但有效",並向鄰居轉發這條信息。
這不是攻擊。不是入侵。是利用系統自身的規則來擴展一個系統不知道它擁有的空間。
屏幕上,日誌開始加速:
「路由宣告已發送 → STK-09122 | 地址空間 10.244.0.0/30 → 待確認」 「路由宣告已發送 → STK-21045 | 地址空間 10.244.0.0/30 → 待確認」 「路由宣告已發送 → STK-18377 | 地址空間 10.244.0.0/30 → 待確認」
大約四秒後,第一條確認返回了:
「STK-09122 → 路由已接受 · 傳播至 2 個鄰居」
然後是第二條:
「STK-21045 → 路由已接受 · 傳播至 3 個鄰居」
第三條:
「STK-18377 → 路由已接受 · 傳播至 1 個鄰居」
陆远看着那些綠色的確認行在黑色背景上一個接一個地出現。過程比他們預想的要順利——不是因為星链的安全防護薄弱,而是因為SkyWalker的擴張指令模仿得太像合法的路由更新了。在星链的衞星看來,這些路由宣告和它們每天處理的上百萬次常規更新沒有任何區別。它不攜帶惡意負載,不觸發任何入侵檢測簽名,不在審計日誌中留下任何可以被標記為"異常"的痕跡。
它只是一條新的路由信息。在網絡的世界裏,路由信息每天流動的數量以億計。在這條河流中加入一滴水——沒有人會注意到。
法尔汉沒有停下來慶祝。他立刻啓動了第二階段:在每個接受了路由宣告的衞星上,SkyWalker的代碼段會嘗試利用衞星固件中的一個未公開API接口——米蘭的嵌套入口打開的不是一個通道,是一組通道——在這些衞星的本地路由表中創建一個影子條目。影子條目不向鄰居宣告,不參與路由計算,但它存在。它像一個藏在抽屜夾層中的暗格,在常規檢查中不可見,但可以被SkyWalker协议的數據包通過特定的量子態序列來尋址。
暗格是空的。但它們的空本身就是一種資源——空的空間可以被填充。空的路由條目可以被用來轉發數據。
数据天堂的容量在接下來的四個小時內從1KB增長到了大約2.3MB。這個速度在絕對數值上微不足道——一個普通的JPEG圖片文件都裝不下。但它的增長不是線性的,是指數級的:每一顆被感染的衞星都會繼續感染它的鄰居,而每一顆新感染的衞星又提供了更多的路由路徑和存儲空間。
到第六個小時,数据天堂的自治域已經覆蓋了大約四百顆星链衞星。它們分佈在從中國南海到非洲東海岸的廣闊軌道弧段上,形成了一個不連續但邏輯上統一的網狀結構。這些衞星中的絕大多數並不知道自己被"感染"了——它們只是在自己的路由表中多了一條影子條目,在自己的內存中多了一段幾十KB的佔位數據。在星链的衞星健康監測系統中,這些衞星的狀態全部顯示為"正常"。CPU使用率沒有異常。內存佔用在允許範圍內。路由表條目數量在合理區間。
一切都正常。一切都在正常的表象下發生着一場緩慢的、不可逆的拓撲重構。
法尔汉在第七個小時的時候終於從終端前站了起來。他的眼睛因為長時間盯着屏幕而佈滿血絲,但他的動作沒有任何疲憊的跡象——他走到單元房的小廚房裏,給自己倒了一杯冷水,一口氣喝完,然後靠在灶台邊上,閉上了眼睛。他沒有睡——只是讓眼球在閉合的眼瞼後面休息一下。大約三十秒後,他重新睜開眼,走回終端前坐下。
"前四百顆星的感染已經穩定了,"他説。聲音是那種連續工作十幾個小時之後的乾澀與沙啞。"但下一個階段會遇到一個問題——跨軌道面的路由宣告。"
陆远在他旁邊坐下,看着屏幕上顯示的那張三維星链網絡拓撲圖。法尔汉用紅色標記了已經被感染的衞星,灰色標記了未感染的。紅色集中在少數幾個軌道面上,像一塊正在緩慢擴散的藻華,但擴散的方向受到路由協議本身的限制——星链的路由更新通常不會跨軌道面傳播,每個軌道面有自己的路由區域邊界,跨邊界的宣告需要經過特定的網關衞星。
"網關衞星有更高的安全審查級別,"法尔汉説,手指在觸控板上滑動,將拓撲圖旋轉了九十度,讓陆远看到那些連接軌道面的網關衞星的位置——它們在圖中被標記為黃色,分佈在幾個關鍵的空間座標上。"它們的固件版本比普通衞星新了兩代,我找到的那個API接口在這些型號上——不確定是否存在。"
"不確定。"陆远重複了一遍這個詞。在数据天堂的整個計劃中,最危險的不是失敗——是"不確定"。因為每一個不確定都意味着他們可能在觸發某種他們尚未理解的防禦機制。
法尔汉讀出了他的擔憂。他沒有辯護。他只是説:"我可以先做一次試探性的路由宣告——用一個低優先級的影子條目,不攜帶任何數據負載。如果網關衞星接受了它,我們再推進。如果它被丟棄或產生告警,我們就知道需要另一條路徑。"
陆远沒有更好的方案。他點了點頭。
試探性宣告發送的時間是注入完成後的第七小時四十三分鐘。法尔汉選擇了一顆位於赤道軌道面與極軌道面交界處的網關衞星——編號STK-45102——發送了一條單播的安全更新宣告。在格式上,它模擬的是星链內部用於同步黑名單變更的常規控制信令。在內容上,它除了一個合法的簽名頭之外,只有一個字節的有效負載:一個標誌位,指示"無新數據"。
網關衞星收到宣告後,處理了它的簽名頭。簽名是合法的——法尔汉使用的是米蘭在嵌套入口中暴露的那個接口所對應的簽名密鑰。網關衞星的固件確認簽名有效,然後將這個宣告轉發給了相鄰軌道面的三顆衞星。
其中一顆衞星,在接收到轉發之後大約兩秒,向数据天堂的自治域發送了一條回執。不是人類可讀的消息——是一個非常短的、只有十六個比特的數據包,內容是一組數字,像是一個不知道該説什麼但覺得應該回復一下的沉默應答。
法尔汉在屏幕上看到那十六個比特的時候,他停住了手。他盯着那串數字,大約有十秒鐘沒有動。
然後他把那十六個比特從十六進制轉換成了ASCII。
屏幕上顯示出了四個字母:
「ACK」
網關衞星接受了影子條目。跨軌道面的路徑是通的。
法尔汉沒有説話。他把轉換出來的那四個字母在屏幕上保留了大約五秒鐘,然後關閉了那個窗口,繼續操作下一階段的部署。
陆远站在他身後,看着他調用下一組指令。那四個字母還殘留在他的視網膜上——ACK。在通信協議中,這是一個最簡單的確認信號,不需要解釋,不需要修飾。它只意味着一件事:收到了。
天空中的那些衞星,那些以每秒七公里速度飛行的、由金屬和硅和代碼構成的人造星星——它們在用一種從未被設計用於通信的方式彼此交談着。它們正在傳遞一個它們自己都不完全理解的信息。但它們在傳。
到第十二個小時,数据天堂的自治域已經覆蓋了星链網絡中大約三個軌道面的完整路由區域,總容量達到了約十七兆字節。這個容量仍然小得可憐——在現代網絡中,十七兆字節甚至不足以緩存一段高清視頻的片頭——但它的拓撲結構已經複雜到無法被簡單的中心化清查工具完整枚舉。数据天堂不是一個集中的服務器,是一個分散在數百顆衞星中的路由表的集合。每顆衞星只知道自己的影子條目,不知道全局的結構。要完整地找到所有被感染的節點,需要從外部對整個星链網絡進行一次全面的路由審計——這相當於在一座有十二萬根柱子的森林中,逐一檢查每一根柱子表面是否有一道極其細微的、不仔細看就發現不了的劃痕。
理論上可行。但操作成本高到幾乎不可能執行。
而数据天堂還在擴張。法尔汉已經在準備第三階段的代碼——一個更激進的感染向量,利用星链衞星之間的激光鏈路握手協議中的一個時序窗口,將SkyWalker的控制代碼嵌入到握手確認幀的填充字段中。如果成功,它將使感染速度提高大約一個數量級。
他沒有告訴陆远這個階段的另一個名字——法尔汉在自己那台終端上的註釋中稱之為"不可逆階段"。因為一旦第三階段的感染向量被部署,数据天堂的存在將從"星链可以回滾的路由異常"變成"星链需要物理替換硬件才能消除的網絡特徵"。到那時,不需要米蘭的後門,不需要嵌套入口,不需要任何人的許可——数据天堂會在每一次握手、每一次路由更新、每一次衞星間的數據交換中自我複製。
像一種已經擴散到宿主全部細胞中的基因序列。要清除它,必須殺死宿主。
法尔汉沒有告訴陆远這個註釋的存在。不是因為不信任——是因為在陆远女兒的倒計時還沒有走完的時候,告訴他"這個計劃是不可逆的"沒有任何意義。陆远需要数据天堂活到他的女兒做完手術。在此之後,数据天堂的未來——以及星链對此的反應——是那時候的陆远需要考慮的問題。不是現在的。
現在的陆远需要的是那十七兆字節的自治域繼續增長,在四十八小時內達到足以承載至少一次穩定數據傳輸的冗餘度。
他需要這東西活過接下來的三十多個小時。
塞拉斯是在数据天堂誕生後的第十四個小時發現的。
不是通過任何自動化告警系統——星链的入侵檢測系統沒有觸發任何警報,因為SkyWalker的擴張沒有觸發任何簽名。塞拉斯發現它是因為他自己在做一件他平時很少做的事:手動抽查亞太區域的路由表變更日誌。
他有這種習慣。一種在安全總監的職位上磨鍊了多年的直覺——系統越安靜,越可能有人在系統看不見的地方做動作。所以他每隔一段時間會親自拉一份原始路由日誌,不依賴任何自動分析工具,用人眼掃一遍。
他拉取的是星链核心網第十九軌道面的路由變更記錄——一個隨機選擇的目標。他用的是一個他自己寫的命令行工具,直接讀取衞星固件中的底層路由日誌,繞過了星链標準審計系統的格式化層。這個工具是他為自己留的一個後門——他不信任米蘭設計的審計系統,因為他知道米蘭在系統裏埋了多少層他自己都不知道的東西。
日誌被拉取到他的終端上,以純文本的形式展開。塞拉斯用眼睛掃描了幾百行常規更新——大部分是合法的、預料之中的路由變化。衞星進出覆蓋區、負載均衡調整、故障切換——一切正常。
然後他看到了第四行。
一條來自STK-17254的路由宣告記錄——宣告了一個地址空間前綴:10.244.0.0/30。這個前綴不在星链的地址分配表中。
塞拉斯的手指停在了觸控板上。
他查看了這條宣告的時間戳。然後他查看了這條宣告從發出到被相鄰衞星轉發所經過的跳數。然後他查看了轉發這條宣告的每一顆衞星的日誌——不是通過系統工具,是通過他手動逐顆衞星連接讀取的方式。
他在第十五顆衞星上找到了一個異常:那顆衞星的路由表中有一條影子條目。影子條目不在路由表的活躍區域中,但它存在。塞拉斯花了大約四十分鐘來確認這不是一個合法的系統行為。不是。不是bug。不是硬件錯誤。
是有人——或者是有個什麼東西——在星链的路由層中創建了一個未授權的地址空間。
塞拉斯靠在椅背上,在黑暗的安全中心裏坐了大約三十秒。周圍的屏幕上顯示着各種監控畫面——流量圖、地理熱力圖、異常行為評分。一切正常。一切看起來都正常。但當他重新看向那些屏幕的時候,他看到的已經不再是"一切正常"的監控面板——他看到的是一片精心維持的平靜水面,而水面之下,有一條他看不見的暗流正在加速流動。
他沒有立刻向任何人報告。他先做了一件事:擴大搜索範圍。他寫了一個腳本,在星链網絡的所有軌道面上並行拉取路由日誌——不是通過標準API,是通過他那條繞過審計系統的後門通道。腳本在二十分鐘內完成了掃描。
結果返回了。
被感染的軌道面:3個。被感染的衞星數量:約四百顆。被創建的未授權地址空間:数据天堂的自治域——實時容量約十七兆字節,正在增長。
塞拉斯看着那個數字,沒有説話。他知道十七兆字節意味着什麼——在星链的全球網絡中,這個數量甚至不足以被標記為"值得關注"。但他在乎的不是當前的容量,是趨勢。從数据天堂誕生到現在的十四個小時內,它的容量增長超過了三個數量級。按照這個趨勢,四十八小時之內,它可能達到一個需要被嚴肅對待的規模——不是對星链的存亡構成威脅,而是對星链的計費系統構成挑戰。一旦数据天堂的容量足夠大,足以承載常規用户的數據流量——如果它開始被普通用户發現和使用——那麼星链的計費系統將面臨第一個真正意義上的競爭對手。不是另一個電信公司,是一個零税率的數字飛地。
那不是安全漏洞。那是商業模式漏洞。
塞拉斯拿起了加密電話。他撥的不是米蘭的號碼——是星链網絡運營中心(NOC)的指揮鏈路。
"NOC,這裏是亞太安全中心。我要求啓動A3級協議清理程序。"
NOC的值班主管沉默了兩秒——A3級程序意味着在星链網絡內部執行全局性的非標準流量清洗,通常會中斷部分非關鍵服務的連接,但影響範圍有限。
"塞拉斯,A3需要首席架構師或CEO的手籤確認。你有嗎?"
"還沒有。但當你看到我傳給你的數據分析之後——你會理解為什麼我不等那個簽名。"
他把掃描結果發過去了。
十三分鐘後,NOC的值班主管回撥了電話。他的聲音比之前低了一個八度:"你這東西哪兒來的?"
"我自己查的。"
"塞拉斯,這個——這個掃描工具——它不在標準安全工具集裏。你用了什麼協議路徑拿到這些日誌的?"
"你不需——"
"我需要知道,因為如果這個東西的來源有任何合規瑕疵,它就不能作為啓動A3的依據。"
塞拉斯在電話線的那一端沉默了。他不能用那條後門通道——那條通道本身不合法,至少不符合星链的內部操作規範。如果他暴露了它的存在,米蘭——米蘭一定會利用這個來反制他。
他沒有A3級程序的啓動依據。
但他在二十一分鐘之後找到了另一條路徑。
他的團隊在分析数据天堂的擴散模式時發現了一個特徵:被感染的衞星在路由宣告的時間戳上呈現出一個極其細微的規律性——約2.37秒的間隔。不像是人的操作,更像是一個自動化的擴散程序在按預設節奏執行。
"程序化。"塞拉斯在團隊通訊頻道中重複了這個詞。程序化意味着可預測。可預測意味着它可以被反向建模——他們可以在擴散程序的下一個目標衞星之前,提前在那顆衞星上創建一條虛假的影子條目來佔據地址空間,製造邏輯衝突,讓擴散程序在目標衞星上執行失敗。
這不是清洗——是一種精確的反制。不是清除数据天堂,是在数据天堂的擴張路徑上設置障礙,讓它無法繼續增長。像一個在入侵者必經之路上提前挖好陷阱的守城者。
塞拉斯下令:啓動"鏡像填充"戰術。亞太安全中心的團隊在接下來的四十分鐘內生成了數百條偽造的影子條目,趕在数据天堂的擴散指令到達之前,在未被感染的衞星上預佔了地址空間。
結果在測試開始後的第七分鐘就顯現了。
陆远看到法尔汉的終端上彈出了第一條失敗日誌時,他只是皺了一下眉。法尔汉沒有皺眉——他直接調出了失敗的具體診斷信息。幾秒鐘後,他的下頜肌肉收緊了一下。
"他們在我們到達之前預先佔用了目標地址空間。"他説,聲音平穩但語速比平時快了大約百分之十——一個只有陆远能識別的壓力信號。"不是隨機佔用——每個被佔用的地址正好是我們擴散程序下一步要宣告的那一個。他們在預測我們的路由選擇算法。"
陆远沒有説話。他看着屏幕上的失敗日誌一行接一行地增加,像一條正在被逐步截斷的河流。
"這不可能——我們的擴散算法使用偽隨機選擇器,種子來自衞星環境噪聲的哈希值。他們不可能預測——"
法尔汉停住了。
他想到了。
"他們不需要預測算法——"他説,聲音裏有一種緩慢的、像重物正在下沉的感覺。"他們只需要監控我們的握手時間戳。我們每次路由宣告之間的間隔是2.37秒——太規律了。他們只需要知道我們會在下一個2.37秒之後向哪顆衞星發送宣告,然後提前——"
他沒有説完。但他已經在改正了。他的手指在鍵盤上移動,正在修改擴散程序中的時間抖動算法——將固定的2.37秒間隔替換為從環境温度傳感器讀數中提取的隨機抖動值。
但在他完成修改之前,屏幕上又出現了新的失敗。"鏡像填充"的速度太快了——塞拉斯的團隊已經建立了一個自動化的反制流水線:檢測到数据天堂的擴散模式、預測下一個目標、預佔地址空間、封鎖路徑。每一步都在自動化循環中完成,不需要人工干預。
数据天堂的擴張在十分鐘內從指數級增長降到了幾乎停滯。它沒有縮小——被佔用的空間不能被清除——但它停止了增長。那顆正在擴散的種子,遇到了它無法穿透的土壤。
法尔汉完成了抖動算法的修改,重新啓動了擴散程序。新的路由宣告開始以不規則的時間間隔發出。但塞拉斯的反制系統只用了大約兩個週期就適應了——它的機器學習模型在觀察到幾個不規則樣本之後,重新識別出了抖動的統計特徵,回到了預佔模式。
擴張又停了。
法尔汉把手指從鍵盤上移開。
他坐在終端的熒光前,屏幕上的日誌已經沉默了將近三十秒。沒有新的成功,也沒有新的失敗——只是停滯,像是兩個棋手在同一個棋盤上同時停住了手,盯着面前的局面,各自在重新計算後面的步子。
"他堵住了我們的路。"法尔汉説。
"塞拉斯。"
"塞拉斯。"
他們在文字中沉默了大約兩拍。
然後陆远開口了:"那就不擴張了。固化我們已經拿到的部分。"
法尔汉看着他。不是不贊同——是一種在評估這個方案的風險和可行性的表情。
"固化意味着我們要從主動擴張切換到被動防禦。"法尔汉説,手指在觸控板上滑動,調出了一個新窗口,上面顯示着数据天堂當前的所有被感染節點的分佈圖。"塞拉斯現在可以預測我們的擴張路徑。但他無法追蹤我們已經建立的影子條目——因為那些條目在他開始監控之前就已經存在了。他不知道我們佔據了哪些衞星。"
"他可以用地毯式掃描來找我們。"
"可以。但地毯式掃描對整個星链網絡做路由審計——十二萬顆衞星,每顆衞星需要幾十秒到幾分鐘不等——完整掃一遍需要大約一週。而且掃描本身會產生大量流量,會干擾正常的通信。他不敢輕易做。"法尔汉停了一下,"但米蘭可以讓他做。"
陆远知道法尔汉在説什麼。米蘭是首席架構師。米蘭有權力命令一個全局路由審計。米蘭剛剛打開了他的後門——但他們不知道他現在會做什麼選擇。他會保護這個剛出生的自治域,還是會把它當作一個需要被修復的錯誤而清除?
他們沒有答案。
他們只能等。
並且在那之前,做他們能做的事。法尔汉開始部署固化的第四階段——不是擴張,是隱藏。他修改了所有被感染的衞星上影子條目的特徵,讓它們更難被常規掃描發現。像一羣在森林中停止移動的動物,壓低身體,讓皮毛的顏色融入地面的落葉和泥土,等待着掠食者從它們頭頂走過而沒有發現它們。
星链的高層緊急會議是在数据天堂誕生後的第二十二小時召開的。
會議是在舊金山總部的二十八層會議室中舉行的。長會議桌的桌面是啞光黑色的合成石材,在偏冷的LED照明下呈現出一種深灰色的質感。桌面上每隔一段距離嵌着一個觸控屏接口,但此刻所有屏幕都處於待機狀態——會議主持人還沒有啓動共享議程。
在場的人不多:CEO馬克·霍洛維茨(通過全息投影從新加坡接入,他的影像在會議桌的遠端呈現出一種微微透明的質感)、首席技術官艾琳娜·沃斯、首席法律顧問羅伯特·麥卡利斯特、亞太安全總監塞拉斯·陈(同樣通過加密線路接入,但選擇了純音頻,屏幕上只有他的名字和一個標識他正在發言的綠色小點)、以及米兰·沃伊诺维奇。
米蘭坐在會議桌靠中間的位置。他沒有帶任何終端,沒有打開面前的觸控屏。他面前只放着一杯水——水杯在啞光黑色的桌面上映出一個模糊的倒影。他穿着平常那件深灰色的西裝外套,沒有打領帶,襯衫最上面的扣子是解開的。
時間已經過了午夜。
CEO的全息影像先開口了,沒有寒暄。
"米蘭。塞拉斯報告説他發現了網絡中的一個異常。他要求啓動全局路由清洗。我需要聽你的意見。"
米蘭沒有説話。
塞拉斯的音頻線路上傳來一聲輕微的呼吸聲,像是一個人正在壓制某種情緒的釋放。"這不是一個'異常',是一個正在擴張的未授權網絡空間。我已經確認了至少三個軌道面存在被感染的衞星。它使用合法簽名偽造路由宣告——這説明有內部人員泄露了簽名密鑰。"
他説最後那句話的時候,語調沒有明顯的變化。但坐在會議室中的人都知道他在暗示的方向。
米蘭依然沒有説話。
"米蘭。"CEO的聲音。"你知道這件事嗎?"
這個問題的重量,在會議室中沉降了三秒。
米蘭端起水杯,喝了一口。放回桌上。然後他開口了。他的聲音不大,但在凌晨的會議室中,在一個所有聲音都被安靜放大到極限的環境中,每一個字都像石塊入水。
"我知道。"
塞拉斯的音頻線路中傳來一陣短暫的、被電流聲掩蓋的沉默——然後是:"你知道?"
"我知道。"
"你一直——"
"我知道它什麼時候誕生的。我知道它怎麼誕生的。我知道它的代碼是誰寫的。我知道用在它上面的那一套簽名密鑰是怎麼來的。"
米蘭説這些話的時候,目光沒有迴避任何人的視線。他看向CEO的全息影像,又看向塞拉斯的名字標籤所在的方向。他不需要看到塞拉斯的臉來知道他此刻的表情——他能從那條音頻線路中極其微弱的呼吸節奏變化,讀取塞拉斯的心理狀態。
"米蘭。"CEO的聲音出現了變化——不是憤怒,是一種更謹慎的東西。"你是説你——"
"我沒有設計它。我沒有參與它的執行。但我沒有阻止它。"
這句話像一根針,在會議室中刺破了一個微妙的氣壓平衡。
"米蘭——"
"聽我説完。"米蘭的聲調沒有升高,但有一種力量從他的聲音中滲透出來,讓在場的所有人都閉上了嘴。"這個自治域的存在,不是星链的安全失敗——是星链的系統架構在它當前限制下產生的自然產物。當我設計星链的核心路由協議時,我考慮過這種攻擊向量。我留了一個後門來追蹤它。那個後門在我這裏——一直在我這裏。"
CEO的全息影像在會議桌的遠端一動不動,像一尊被光雕刻出來的半透明雕像。"那個後門——你是在告訴我們,你故意讓這個攻擊成功,因為你有一個後門來控制它?"
"我説我沒有阻止它,是因為我需要觀察它。看看它能走多遠。看看它背後的團隊能做到什麼程度。看看——"米蘭停頓了一下。在停頓的那半秒鐘裏,他眼中閃過一絲極其微小的、如果不是仔細看就會被完全忽略的疲憊——"——看看它是否真的有潛力成為這個系統需要的那種壓力。"
會議室中沒有人説話。塞拉斯的名字標籤旁邊的綠色小點始終亮着——他正在連接中,但他沒有發言。
羅伯特·麥卡利斯特——首席法律顧問——是第二個發言的人,聲音低沉但清晰:"米蘭,你可能剛剛承認了嚴重違反內部安全協議的——"
"法律問題可以之後談。"CEO打斷了麥卡利斯特,他的視線——即使通過全息投影的轉播——仍然鎖定在米蘭身上。"現在的問題是:這個東西在擴張。塞拉斯要求啓動全局路由清洗。米蘭,你的方案是什麼?"
米蘭沒有立刻回答。他低頭看着桌面上那杯水的倒影,像在尋找一段精確到每個詞都不會錯位的表述。他抬起頭時,臉上的表情有一種罕見的、不加修飾的坦誠——不是他在會議上常用的那種經過控制的姿態,是一個人在已經做出了某種內部決定之後的平靜。
"全局路由清洗不會起作用。"他説。
塞拉斯的聲音幾乎是同時響起的——"你憑什麼——"
"因為它已經被感染了。"米蘭的聲音依然平穩,像在一場辯論中陳述一個他早已準備好的事實。"在過去的二十二小時裏,数据天堂的自治域已經擴展到了大約三個軌道面、四百到六百顆衞星的規模。你可以在NOC啓動全局清洗,將所有非標準路由的數據包標記並丟棄——但你標記的每一個數據包,都會在衞星的CPU上消耗額外的處理週期。如果你啓動清洗,四百顆被感染的衞星會在接下來的幾分鐘內產生大量的錯誤處理請求,造成路由表鎖定。三千顆。然後是兩萬顆。最終——整個網絡會在鏈路擁塞中自我癱瘓。"
塞拉斯説:"我們可以分軌道面逐次清洗,先隔離——"
"隔離的前提是我們能準確知道哪些衞星被感染了。你不知道。我也不知道——因為那個自治域在二十二小時內已經學會了改變它的路由宣告模式。它現在使用的時間抖動算法讓它變得不可預測。"
塞拉斯沉默了。他無法反駁,因為他自己也在追蹤過程中觀察到了那種抖動——他以為他的反制系統已經適應了它,但米蘭現在説那只是数据天堂的第一層變化。它還有更多的。
CEO的影像微微前傾——一個在全息投影中看起來像是整個上半身向會議桌中心靠近了一點的動作。"你的建議是——不動它?"
"我的建議是不用全局清洗。但我們可以限制它。"米蘭打開了他面前的觸控屏——他之前沒有連接任何設備,現在他把一台終端接入了一個外部接口。屏幕上顯示着星链網絡拓撲的一個特定視圖——不是全局圖,不是安全態勢圖,是一張路由表的邏輯架構圖。他用手勢放大了其中的一個部分。
"数据天堂的擴張原理是利用星链的BGP路由宣告機制來創建未被記錄的地址空間。但BGP路由表的結構有一個硬上限——每條路由前綴的位數決定了它可以宣告的最大地址塊數量。在我們的架構中,地址空間的分配是以/30為最小單位的。整個星链網絡的私有地址空間被劃分為大約兩百三十萬個/30區塊。"
他停了一下,讓這個數字沉入聽眾的意識中。
"其中大約兩百二十萬塊已經被分配給了合法用途。剩下的幾萬塊——是預留的、未分配的、位於地址池邊緣的碎片空間。数据天堂可以利用的空間,極限是這些碎片空間的總和加上少數可以從不活躍區域回收的空間——加起來最多不超過星链總地址容量的2.37%。這是一個由路由表架構決定的硬上限。不管数据天堂的代碼怎麼寫、怎麼擴散,它的物理極限就在那裏。它佔不滿剩下的百分之九十七。容不下。"
會議室中沉默了片刻。
艾琳娜·沃斯——沉默到現在的CTO——用她一貫的平穩語氣説:"你有數據支持這個2.37%?"
米蘭在觸控屏上調出了一組計算。不是臨時準備的——是他在数据天堂誕生後的頭幾個小時裏已經算好的。他把結果投射到了會議室的主屏幕上。
"地址碎片空間的完整分佈表,加上路由表架構中的前綴長度限制,得出的最大值。我計算了三次,每次結果都是一樣的。浮動範圍不超過0.02個百分點。"
艾琳娜看完了那些數據。她沒有再提問。
CEO的全息影像在那組數字前面停留了很長時間,像是在用自己的判斷力逐一驗證米蘭的計算結果。會議室中只能聽到空調系統和散熱風扇的低頻嗡鳴聲。
"所以你的方案是——什麼都不做?"
"不。"米蘭説。他第一次在會議中使用了一個比平時更重的字音,像是需要確保這個字不會被誤解。"我的方案是:不清洗。不關閉。不做任何試圖清除它的操作。我們讓那個自治域繼續存在——但它不會超過2.37%。它會被鎖在那塊碎片空間中。而剩下的百分之九十七——還是我們的。"
"你的意思是——給它一個緩衝區。"CEO的聲音。
"給它一個緩衝區。"米蘭重複了一遍。"它不會消失。但它也不會長大。它會在那個籠子裏安靜地待着。與此同時,我們可以通過接下來的固件更新,修補BGP宣告驗證的漏洞,讓它永遠無法突破那個上限。"
"不——"塞拉斯的聲音從音頻線路中切斷般地插入。他的聲音使會議室中本來就緊張的氣氛變得更加緊繃——那是一種被強行壓縮在禮貌外殼下的爆發。
"米蘭,你在給我們講一個完美的數學解決方案,但你忽略了一件事——這個自治域的存在本身就是違法的。它不是星链的合法服務的一部分。它在逃税。"
"塞拉斯——"
"它在逃税。逃税意味着星链的股東會看到他們的收入模型被一個在系統內部寄生而不付費的飛地侵蝕。逃税意味着其他用户會問:為什麼他們不需要付錢而我要付?逃税意味着——"
"塞拉斯。"CEO的聲音切斷了塞拉斯的語流。不是高聲的制止——是一種在極低的音量下帶着不可反駁的分量的話語,CEO在多年的管理經驗中練就的、用最小的聲壓傳遞最大的制止力的能力。
米蘭沒有等CEO繼續。他接過話頭,視線看向塞拉斯的名字標籤的方向——雖然他知道塞拉斯看不到他的眼睛。
"關閉全球星链網絡三十分鐘,對所有衞星進行固件重置——這是你的計劃,對吧?"
塞拉斯沒有回答。他的沉默本身就是一個回答。
米蘭把目光轉向CEO的全息影像。"讓我問你一個問題:如果我們在沒有準備的情況下關閉全球星链網絡三十分鐘——你知道這意味着什麼嗎?"
米蘭沒有等回答,但他也沒有用質問的語氣。他接下來的話像是一個人計算了很多次之後得出的結論,而不是為了贏得辯論而臨時組織的論點:
"全球大約有二十一萬台手術依賴星链的遠程醫療鏈路。其中超過六千台是在任何時刻都在進行的實時手術——機器人在動,專家的手在操控杆上。斷連意味着那些手術中的自主系統會從輔助模式切換到完全自主模式。大部分情況下,自主系統能維持。但不是所有情況。"
他停了一下。沒有人接話。
"全球金融系統:約百分之八十以上的高頻交易依賴星链的時間戳同步。三十分鐘的斷連不會讓金融市場崩潰——但它會讓所有交易記錄的時間基準產生偏移,需要至少兩週的數據重建和爭議處理。"
"全球電網:超過六十個國家的電網監控系統使用星链作為主要的備用通信鏈路。如果在斷連期間出現任何需要協調的電網故障——沒有備用通信手段的國家可能會面臨局部停電。"
"全球航空:每天約十萬架次航班使用星链進行通信和導航輔助。三十分鐘斷連——大部分航班可以依靠機載備用系統。但那些正在使用星链進行精密進近引導的航班——"
米蘭停頓了一下。他不需要繼續説下去。所有人都知道那些數字背後的重量。
"關閉三十分鐘不是修復問題。"他説出了最後一句話——這句話的聲音不高,但它是整場會議中聲音最重的一句話。"是製造災難。"
CEO的全息影像已經將近十秒鐘沒有任何動作。不是信號延遲——是在思考。米蘭可以看到CEO的臉部肌肉在面部表皮下面極其微小的移動,那是他在做重大決策之前特有的無意識動作——像一台計算機在提交關鍵運算之前,正在進行最後的內部校驗。
他開口了。聲音比之前低了一些,像是一個人在走完一條很長的走廊之後,終於抵達了終點時説的那種話:
"米蘭的方案——不清洗,不關閉,不採取任何可能導致網絡大規模中斷的主動清除措施。給那個自治域一個緩衝區。評估其影響,然後在下一次股東會議上報告。"
塞拉斯的聲音幾乎是同時響起的——"我抗議——"
"記錄在案。"
"馬克——這個決定——"
"記錄在案。"CEO重複了一遍,語氣沒有任何商量的餘地。"塞拉斯,我不是在忽略你的擔憂。但米蘭的數字是正確的。如果全局清洗導致連鎖癱瘓——那不是清理一個漏洞的成本,是在漏洞周圍製造一場火災的成本。我不會冒這個風險。"
塞拉斯沒有説話。他的音頻線路仍然顯示連接狀態,但那個綠色的標識沒有説話。米蘭可以從那條線路中極其微弱的呼吸聲音中,聽到一種他沒有在任何人面前表現出來——但在那條只有聲音的線路中無法完全隱藏——的情緒。
不是憤怒。是被壓制了太久之後,終於意識到自己不會在這張桌子上獲勝的認知。
米蘭沒有追擊。
他拿起面前的水杯,喝了一口。水已經涼了,和他的聲帶温度大致相同。他把杯子放回桌上,聽着CEO繼續分配接下來的行動項——監視自治域的擴張狀態、評估其經濟影響、在下一版固件中加強路由宣告驗證。標準流程。標準話術。標準的"在問題被確認之後按流程處理"的會議文體。
但米蘭知道一件事。在整個會議過程中,他一直在注意一個他沒有在會議上提到的事實——一個他無法在會議桌上擺出來的事實。
他的計算中,2.37%的上限是基於一個前提:数据天堂只使用被動的BGP宣告擴展地址空間。但法尔汉——那個他一直在暗中觀察的年輕天才——已經設計出了第三階段的感染向量。米蘭在数据天堂的自治域日誌中看到了那段代碼的影子。不是完整的代碼,是指令模式的預告。
第三階段不是通過BGP宣告來擴張。是通過星链衞星之間的激光鏈路握手協議——通過將SkyWalker的控制代碼嵌入握手確認幀的填充字段——來感染。
如果法尔汉部署了第三階段,2.37%的上限將不再適用。不是因為路由表的物理架構被改變了——而是因為地址空間的定義方式被改變了。不是突破房間的牆壁——是重新定義房間的尺寸。
米蘭沒有在會議上説這些。
因為如果他説了,CEO會覆蓋他的方案,啓動全局清洗。清洗會引發連鎖癱瘓。連鎖癱瘓會殺人。六千台手術中的某些一台——可能就會是陆远女兒的那一台。
米蘭在會議上沒有站在星链一邊。
他沒有站在数据天堂一邊。
他站在了那六千台手術中的某一台——他不知道自己具體是指哪一台,但此刻在深圳某間醫院裏亮起的手術燈——那盞燈正亮着的、正在被一個遠程操控信號的鏈路維持着的光——的那一盞燈的一邊。
會議在凌晨兩點十七分結束了。CEO的全息影像在會議桌的遠端淡出,像是從一個正在退潮的海灘上收回的水線。其他參會者的連接也逐一斷開——艾琳娜·沃斯先退,然後是麥卡利斯特,最後是塞拉斯。塞拉斯在斷開連接之前沒有説話,甚至沒有留下一句禮貌性的告別語。他的綠色標識在屏幕的參與者列表中多停留了幾秒鐘,像一盞在其他人離開後還亮着的燈,然後也滅了。
米蘭沒有立刻離開會議室。
他坐在啞光黑色的會議桌前,在空蕩蕩的房間中,讓自己在那盞只有他一個人的燈光下又多停留了大約兩分鐘。他面前的觸控屏仍然亮着,顯示着那張星链路由表的邏輯架構圖。在那張圖上,那些被標記為"未分配"的地址碎片以極其微小的淺灰色色塊分佈在整張圖的邊緣地帶。它們很小。很小。加在一起只佔總面積的2.37%。但它們存在。
在他視野的上方——在窗户的方向——舊金山的城市燈光透過玻璃映照進來,被百葉窗的葉片切割成一道道平行的光帶,投在天花板和對面牆壁上。凌晨的城市已經安靜下來了。
米蘭關掉了觸控屏的電源。屏幕從亮藍色漸變為黑色。在那塊深色的玻璃面板反射出的他自己的面孔中,他看到的不是一個勝利者——不是一個做出了正確決定的人——只是一個在一場沒有完美答案的選項中,選擇了最小傷害的那一個的人。
他站起來,走出了會議室。
走廊很安靜。他的腳步在地板上發出均勻的聲音,像一個正在離開某個他不確定自己應該走到的地方的人。在他的身後,會議桌面上那杯沒有喝完的水,在空無一人的房間中保持着一動不動的姿態,像一枚被遺留在談判桌上的、沒有任何人打算簽署的文件。
停火協議。
不是和平。不是勝利。
是一個沒有人在上面簽字的停火協議。
但它生效了。
至少,在接下來的幾十個小時內,深圳某間手術室上方的星链信號——那根從歐洲專家的終端出發、穿過十二萬顆衞星之間的激光鏈路和路由表、最終抵達一間手術室的遠程操控台的數字臍帶——不會被主動切斷。
米蘭走進電梯的時候,終於允許自己閉上了眼睛。
在閉合的眼瞼後面,他看到的是不是那些路由表的地址碎片,也不是那些被感染的衞星的編號。他看到的是一盞他從未見過的、在某個他不知道具體位置的手術室上方亮着的燈。
那盞燈還在亮着。
這是他現在唯一能確認的事。