第18章 · 反向的獵手

法尔汉在米蘭的固件中搜尋了整整兩天。不是睡覺時間減半的那種"兩天"——是他真的連續四十八小時沒有閤眼,只在第三十六小時的時候被陆远強行塞了一瓶水和兩塊壓縮餅乾,他機械地吃完,然後又轉回了屏幕前面。

他搜尋的不是代碼,是代碼的缺席。

米蘭的設計日誌提供了線索,但線索不是地圖。線索是一句模糊的話——"一個沒有被記錄在任何路由表中的地址空間"——和一個技術概念:"入口-7的審計模塊在'讀'的過程中插入一個條件分支。"在這兩行字之間,法尔汉需要找到一條確切存在於某個內存地址上的代碼路徑。

他嘗試了所有常規方法。符號執行——沒有找到任何未註冊的地址空間。靜態分析——審計模塊的控制流圖顯示所有分支都是閉合的。動態汙點追蹤——數據流路徑乾淨得像教科書上的示例。

四十八小時後,法尔汉靠在椅背上,閉上眼睛,說了一個字:

"操。"

他很少說髒話。陆远認識他幾個月來幾乎沒聽他說過一個帶情緒的詞。但他現在說了,而且說得非常平靜,像在陳述一個經過充分驗證的失敗結論。

"嵌套入口不存在。"法尔汉睜開眼,看著頭頂的通風管道,"米蘭的日記可能只是他的內心獨白——一個想法,一個從未被實現的概念草圖。他在日記裡寫'我做了那個嵌套入口'——但那可能是他的想像。一個他從沒真正落實過的幻想。人會在日記裡騙自己。"

陆远站在他身後,沒有接話。

他也在想同一個問題。如果在米蘭的固件中反覆搜索都找不到那個入口——那它可能真的不存在。米蘭是星链的首席協議架構師,但他也是一個人。人會誇大自己的成就,會記錄自己想做但沒做成的事,會在日記中把願望寫成已完成。

但陆远回想著他在拉各斯的那個夜晚——回想著阿米娜地下室那臺運行著FreeBSD的服務器,回想著那枚管狀鑰匙冰涼的觸感,回想著阿米娜說的那句話:"每一個陷阱都是雙向的。"

阿米娜不是技術專家,她是一個信號獵犬出身的貨運老闆。她說過的話——她沒有用技術術語,但她說了同樣的事。

"米蘭說他花了六十三天寫那個嵌套入口,"陆远說,"六十三天。"

法尔汉沒有轉身,但他的呼吸節奏變了一下。

"一個人花六十三天寫一段代碼——然後把它放在那裡,從來不告訴任何人,也從來不用——你能做到嗎?"

法尔汉沒有回答。但他知道答案。他做不到。如果你花了六十三天寫了一段代碼,它的存在本身就意味著你希望它被使用。你不會為一個永遠不會被激活的功能投入六十三天。除非——那六十三天本身不是為了寫代碼,而是為了做一件更困難的事情:把一段代碼藏到所有人都找不到的地方。

法尔汉坐直了身體。他重新面對屏幕,但這次他沒有打開反彙編器——他打開了固件的完整二進制文件的十六進制視圖。

"你在做什麼?"

"我在想——如果我是米蘭,我會怎麼藏一樣東西。"

他沒有搜索代碼,他開始搜索內存的佈局。星链固件的內存地址空間有一個標準的分配模式:引導程序區、操作系統內核、協議棧、設備驅動、應用程序容器、以及——空白區。每兩個主要模塊之間都有一段未使用的填充空間,用於對齊內存頁邊界。

法尔汉把那些空白區一個一個地調出來看。大部分是純粹的0x00填充——沒有意義,沒有內容。但他找到了一個異常:在固件偏移量0x7F3A_0000到0x7F3A_1000之間,有一段4096字節的空白區。它不是0x00填充。它填充的是0xFF。

法尔汉的手指停在鍵盤上。

在大多數固件中,空白的未使用內存會被初始化為0x00。但0xFF填充意味著有人特意向這個區域寫入了數據——然後把它標記為空白。

不是空白。是被擦掉的日誌。

他把那片0xFF區域拉進分析工具,運行了一個差分比較算法——將這片區域與相鄰的空白區域進行統計對比。結果在一秒後返回:這片0xFF區域的比特分佈不是隨機的,它包含一種極其微弱的、非隨機的模式——某些字節位置的取值概率偏離了均勻分佈。

"他把數據擦掉了,"法尔汉說,聲音裡第一次出現了那種他很少流露的、接近興奮的東西,"但他沒有覆蓋隨機數據填充。他用的是0xFF覆蓋——一種標準的'安全擦除'操作。但安全擦除的一個問題是——它留下一片太乾淨的空白,而真正的空白區域是0x00。他留下的不是信息——他留下的是一個曾經有信息存在過的痕跡。"

陆远俯下身,盯著屏幕上那行分析結果。

"你能恢復它嗎?"

"不能。0xFF覆蓋是不可逆的。數據已經不存在了。"

法尔汉關閉了那個窗口。但他沒有停下。他打開了另一個窗口——星链固件的完整鏈接映射表。他像一個考古學家,在發掘一個人的腦子——不是通過他留下的東西,而是通過他選擇清空的東西。

"米蘭用六十三天寫了嵌套入口。然後他把它擦掉了。但——如果我是米蘭——我不會把唯一的副本擦掉。我會在擦掉這個副本之前,在另一個地方保留一份。一個他相信永遠不會被人檢查的地方。"

他的光標在鏈接映射表上緩慢移動。他在找——不是找代碼,是在找地址偏移之間的異常關係。

然後他找到了。

固件中有一個模塊——QKD信道噪聲特徵採樣器——的位置映射表中,有一行數據看起來是正常的。庫名稱正確。大小正確。入口地址正確。但法尔汉注意到了一件事:這個模塊的聲明大小是8,192字節,但在鏈接映射表中,它的結束地址與下一個模塊的起始地址之間,相差了4,096個字節。

一個隱藏段。

不——不是一個隱藏段。是一段被聲明為"屬於"噪聲特徵採樣器、但實際上沒有被採樣器的任何函數覆蓋的內存空間。它被分配了,但它沒有被使用。

就像一個被登記為"臥室"的房間,實際上是一扇被牆紙覆蓋的暗門。

法尔汉的呼吸停了大約兩秒鐘。

他沒有說話。他直接跳轉到那個地址偏移量,用一個十六進制編輯器打開了那片"不存在"的內存空間。

屏幕上出現的不是0x00。不是0xFF。

是數據。編譯過的、可識別的二進制代碼。

他盯著那片數據,一動不動的,像在看一個不可能出現的東西。然後他運行了一個反彙編器。十六進制代碼被翻譯成彙編指令,一行一行地在屏幕上展開。他讀了最前面的幾十行。

那不是一段完整的程序。那是一段配置數據——包含一組路由表條目、一組認證憑據、和一組觸發條件。觸發條件的核心是一條判斷語句:

IF (QKD_CHANNEL_NOISE_PATTERN == 0xA7F3_1C44_9B20_7D81) THEN ENABLE_HIDDEN_ROUTE

法尔汉的手指離開了鍵盤。他靠在椅背上,發出一聲很長很長的嘆息——不是疲憊,是一個人花了四十八個小時在沙漠裡迷路,終於看到地平線上出現了第一個地標時的那種嘆息。

"他把它藏在QKD信道噪聲特徵採樣器的內存段裡。"法尔汉說。他的聲音沙啞到幾乎像砂紙在摩擦,"不是作為代碼——是作為採樣器的初始校準數據。這個模塊在每次固件啟動時都會加載一組預定義的噪聲特徵模板,用於比對實時採樣的噪聲數據。米蘭把嵌套入口的激活條件偽裝成了一組'參考噪聲特徵'。沒有人會去檢查一段參考噪聲特徵數據——因為它看起來只是一串隨機數。"

陆远站在他身後。他的目光落在那行十六進制的激活條件上:0xA7F3_1C44_9B20_7D81。這個數字看起來是隨機的——但任何瞭解米蘭的人都知道,"隨機"不是米蘭的風格。

"A7F3——"法尔汉也在看著那串數字,"不是隨機生成的。這是一個有意義的數字。但我暫時解不出它代表什麼。"

"也許不需要解出它的含義,"陆远說,"只需要知道怎麼用它。"

法尔汉點了點頭。他打開了另一個窗口——他開始分析那組隱藏在噪聲採樣器中的路由表條目。那不是普通的IP路由表。那是一組針對星链衛星間激光鏈路和QKD信道的底層轉發規則——不是IP層的路由,是物理層的路徑選擇規則。每一行都指定了一顆衛星的標識符、一條QKD信道的頻率偏移參數、和一個"優先級覆寫"標記。

這個入口可以做到的事情讓人脊背發涼:它可以讀取星链網絡的完整底層路由表——每一條星間激光鏈路的帶寬和延遲、每一顆衛星的負載狀態、每一個QKD信道的密鑰生成速率——然後向任意一顆衛星的轉發引擎寫入新的路徑選擇規則。

在星链網絡中,每一顆衛星都是一個獨立的路由節點,它們通過分佈式共識協議來協商最佳路徑。但米蘭留下的這個入口——它不是向共識協議提交建議。它是直接寫入衛星的轉發規則表,覆蓋共識協議的輸出。就像在一艘船的自動駕駛系統中,直接扳動舵輪的物理連桿。

誰能使用這個入口——誰就能控制任何數據包在任意兩顆衛星之間的物理路徑。

"你看看這個——"法尔汉調出了一張拓撲圖。他輸入了幾行測試指令,屏幕上出現了一條新的線路——不是真實的連接,是他在本地模擬環境中用那組路由規則推演出的邏輯路徑。一條數據流的軌跡,從一顆掠過南大西洋上空的衛星出發,經過七次星間跳轉,最終到達一顆定點在印度洋上空的衛星——全程不經過任何計費審計節點。

"在這個自治域裡,"法尔汉說,用手指在空中畫了一個圈,"所有落入這個路徑的數據包——不受星链計費系統的處理。不是繞過——是完全跳過。計費模塊甚至不會看到這些數據包的存在。它們像穿過了一道海關而不需要經過任何邊檢窗口,因為他們走的是一條沒有被繪製在任何地圖上的路。"

他停了一下。

"這不是在星链旁邊建一個新網絡——這是在星链內部切掉一塊領土。一塊不屬於任何人的領土。"

"数据天堂。"陆远說。

法尔汉看了他一眼。他點了點頭。

"数据天堂。"


據點裡的人在接下來的幾個小時裡陸續聚集到了主屏幕前。

法尔汉花了大約兩個小時,將嵌套入口的激活條件和路由規則整合成一個可執行的操作方案。他在白板上用馬克筆畫了一張圖——不是技術架構圖,是一張示意性的概念圖:一個巨大的圓形代表星链的核心路由網絡,然後在圓形內部畫了一個小的、不規則的封閉區域,標著"自治域"。

"不直接攻擊星链,"法尔汉用馬克筆的筆帽點著那個小區域,"攻擊沒有意義——十二萬顆衛星互為冗餘,你可以摧毀一千顆,剩下的十一萬九千顆會自動填補路由空白。我們不能物理上摧毀它,我們也不能邏輯上覆蓋它——因為星链的共識協議有拜占庭容錯機制,惡意路由信息會被大多數節點投票否決。"

他轉向所有人。

"但我們能做的是——在星链內部創造一塊飛地。一個利用米蘭後門在路由層建立的邏輯隔離區。所有落入這個飛地的數據包都不經過星链的計費模塊。它們不是被加密隱藏的——它們是被路由規則繞過的。就像一個城堡裡的一個房間,衛兵知道它存在,但他們不會進去檢查,因為建造城堡的人告訴他們那是一個儲藏室。"

有人問:"這個飛地能有多大?"

法尔汉在腦海中估算了一下——然後說出了一個讓整個房間安靜下來的數字:"初始規模很小。大約相當於一箇中等規模的數據中心——幾十TB的存儲容量和幾千TOPS的算力。但一旦建立,它可以通過SkyWalker协议在星链的QKD信道中擴散擴張指令。每一顆被寫入新路由規則的衛星都會成為自治域的邊界節點,並向它的鄰居衛星傳播新的規則。如果順利——自治域可以在大約十幾個小時內擴大到覆蓋星链總容量的百分之二到百分之三。"

百分之二到百分之三。在絕對數字上,那意味著幾百顆衛星的轉發規則被重寫。幾百顆衛星的數據流可以不經過計費系統。

一個数据天堂。哪怕只有百分之二——它已經比任何鸽子网络、任何地下光纖、任何暗網都要大。因為它寄生在星链體內,使用的是星链自己的衛星和帶寬——只是不交稅。

"但有一個問題。"法尔汉說。他的聲音從剛才的興奮中回落了一些,像一個正在攀登的人在一個陡坡上停下來看了一眼腳下的高度。"這個入口的激活條件——需要我們通過QKD信道發送一組特定的量子態組合。不是普通的噪聲空洞——是嵌套入口設計者預設的一組精確的噪聲特徵模板。如果我們發送錯了——入口不會打開。如果我們發送對了——米蘭會在他的審計系統中看到一個信號。他會知道我們找到了入口。他會知道我們正在嘗試激活它。"

"他會阻止嗎?"有人問。

法尔汉沒有回答。


貝爾格萊德。

米蘭看到警報的時候,是凌晨三點十一分。

他正在書房裡重讀一份舊的技術文檔——不是星链的文檔,是華為2049年公開的一份關於CDMA物理層信號指紋的研究論文。他從一個無關的檢索中偶爾翻到了它,讀著讀著就發現自己在重讀。論文作者列表的第四位是一個他熟悉的名字:陆远。

他的終端發出一聲輕響——不是普通的通知音,是一種他專門為自己設置的特殊頻率,低到幾乎超出人耳可聞範圍,但他設置了它。這個聲音只綁定了一件事:他埋藏在QKD信道噪聲特徵採樣器中的那個標誌位的狀態變化。

他打開審計系統。

在日誌的底部,最新的一條記錄顯示:地址空間 0x7F3A_0400-0x7F3A_04FF——讀取嘗試。來源:未註冊終端。方法:通過QKD信道噪聲模板間接訪問。成功:是。

他的手指停在鍵盤上方。

有人找到了。

六年前他花六十三天埋下的種子,在一個所有人都睡著的凌晨,被人用一把他從未見過的鑰匙,打開了那扇他以為永遠不會被打開的門。

米蘭靠在椅背上,看著那條日誌,很長一段時間沒有做任何操作。他的大腦正在同時處理幾種完全不同的情感信號,它們像不同頻率的波在同一個介質中疊加,產生了一種他無法命名的干涉模式。

自豪。 有人找到了他埋藏的寶藏。他在固件中藏了二十三處門,其中二十二處被不同的人在過去的六年中發現和利用過——但他們沒有一個人走到需要發現嵌套入口的那一步。只有這一次。只有這個人。走到最後一步了。

恐懼。 嵌套入口被激活的可能性意味著——星链的底層路由規則可以被第三方寫入。他在設計這個入口的時候就清楚地知道這一點。他在技術上為星链創造了一個可以被利用來分裂自身的工具。如果陆远和法尔汉用它來做他預期之外的事情——他無法關閉它。因為他不在那個自治域的控制迴路中。一旦激活,他只是一個旁觀者。

如釋重負。 這個感覺是他最無法理解的。他在黑暗中坐了很久,試圖理解自己為什麼會在應該感到緊張的時候感到輕鬆。然後他明白了——他在漫長的職業生涯中第一次不再是唯一一個知道所有答案的人。有人超越了他設置的層層障礙,走到了他預設的終點。這意味著他的系統不是完美的——也意味著他終於不是那個必須獨自承擔一切的人了。

他站起來。沒有開燈。他走到窗邊,看著薩瓦河對岸空無一人的街道。路燈在河水的倒影中扭曲成細長的金黃色條紋,隨著水波輕微地晃動。

他在想陆远白天在電話裡說過的話。

"你女兒在我這邊。而你還愛她。"

他在想那個未寄出的嵌套入口——那個他在夜深人靜的時候寫出來、鎖進一個沒人會檢查的存儲段中、然後告訴自己"這只是以防萬一"的東西。

也許他一直在等有人走到這一步。也許他一直在等有人能讓他做出一個選擇——不是作為星链的首席協議架構師去做選擇,而是作為一個父親、一個在年輕的時候相信技術能解決一切問題、然後在四十七歲這一年發現自己錯了的人。

他走回桌前,沒有去動那個嵌套入口的激活攔截程序。他可以阻止它——只需要向衛星集群發送一條固件級別的禁用指令,那個隱藏在噪聲特徵採樣器中的額外代碼段就會被覆蓋。入口會永久關閉。数据天堂會在誕生之前就死在搖籃裡。

他沒有敲那條指令。

他拿起鋼筆,翻開日記。他的筆尖在紙面上懸停了很久,墨水在筆尖處積成一小滴,快要滴落的時候他才開始寫。字跡不像平時那樣剋制——有幾個字母的弧度超出了他慣常的書寫邊界,像一個人在壓抑了很久之後終於允許自己的手寫出它真正想寫的東西。

他們在敲門。

他停了一下。筆尖在紙面上留下一個小墨點。他看著那個墨點慢慢滲入紙纖維,在紙張的紋理中擴散成一個不規則的暗色斑點。

我不知道該不該開門。

他寫完這句話之後,合上了日記。沒有加日期。沒有署名。

他關掉了書房的燈。

但他也沒有打開那個攔截程序。

黑暗中,他坐回椅子上。電腦屏幕已經自動變暗,但他在屏幕的邊緣能看到那個標誌位的實時狀態——它仍然是綠色的。綠色意味著嵌套入口沒有被正式激活——只是被訪問了。陆远和法尔汉還沒有做出最後一步操作。

他們在等什麼?

米蘭在黑暗中忽然明白了:他們在等他做出選擇。他們找到了門。但他們不會在門打開之前闖進來——他們在等他親手把那扇門推開。

因為如果他們自己闖進來,那只是一個漏洞利用。但如果他推開了門——那就是一個邀請。

米蘭搖了搖頭。在這個沒有開燈的房間的黑暗中,他獨自搖著頭,嘴角出現了一個他自己都沒有意識到的複雜弧度——不是苦笑,不是自嘲,更像是一個人在看到一面鏡子裡映出了自己不願承認的真相時,那種本能地想要移開目光卻又忍不住再看一眼的複雜反應。

他拿出手機。沒有通過加密通道——他用了一條最普通的、沒有任何防護措施的短信線路,向一個他沒有保存過聯繫人的號碼發送了一條消息。短信只有三個字,是他用自己的個人終端發出的——不是星链的官方通訊設備。

發送時間:凌晨 3:47:12。

他想讓他在深圳那個地下據點裡的對手知道——在門的那一邊,有一個人在看著他們。一個還沒有決定要不要開門的人。


據點的屏蔽室裡,陆远的終端亮了一下。

他拿起來。屏幕上是一條來自未知號碼的短信,沒有前綴,沒有簽名,沒有安全驗證碼。只有三個字:

「我知道。」

陆远看著那三個字看了很久。

法尔汉從他身後探過頭來,也看到了。他沒有問是誰發的——他不需要問。

"他知道我們找到了。"法尔汉說。

"對。"

"他沒有阻止。"

"對。"

法尔汉沉默了。據點裡的冷卻風扇在運轉,發出持續的、接近白噪音的低頻嗡鳴。遠處的某個服務器機櫃裡,硬盤在讀寫時發出細碎的咔嗒聲,像某種正在內部生長的東西在呼吸。

"他到底在想什麼?"法尔汉問。這個問題沒有指向任何人,像是一個人在自言自語。

陆远把終端放回桌上。屏幕上那三個字已經暗下去了,但它們的形狀還烙印在他的視網膜上——他知道,它們也會烙印在法尔汉的視網膜上。

"他在想怎麼回答他女兒。"陆远說。

法尔汉看著他。陆远沒有解釋。

但法尔汉慢慢地點了點頭——不是因為理解了,是因為他選擇了相信陆远的判斷。在這個所有信號都在被監控、所有數據都在被分析、所有路徑都在被計費的世界裡,他選擇相信一個父親對另一個父親的理解。

"距離子衿的醫療授權過期還有——"法尔汉看了一眼牆上的倒計時,"——大約五十三小時。"

陆远點了點頭。

"夠了。"

他低下頭,重新看向屏幕上的嵌套入口激活條件——那一串十六進制的噪聲特徵模板。他不需要再分析它了。他已經知道它是真實的。現在只剩下一個問題:當他們發送激活信號的時候,米蘭會按下那個攔截按鈕,還是會讓門自己打開?

他想起米娅寫給母親的信。

"告訴父親,我很好。我不恨他。我只是不能原諒他。"

他想起米蘭在那通電話的最後說的那句話——"我一直在等你的電話。"

陆远把那些東西壓進意識的深處,重新看向屏幕。嵌套入口的激活程序已經加載到了SkyWalker的發射隊列中。他的手指懸在回車鍵上方,只需要一次按鍵。

但他沒有按下去。

他在等米蘭回答自己。在等那個四十七歲的塞爾維亞人決定——他是要當星链的首席協議架構師,還是當一個女兒還願意給他寫信的父親。

這個選擇,不能由陆远替他做。

"先等。"陆远說。

法尔汉看著他,沒有問等什麼。他只是說:"你確定?"

"確定。他會在窗口關閉之前做出選擇的。"

陆远從桌前站起來,走向角落裡的摺疊床。女兒睡得很沉,呼吸均勻,一隻手搭在毯子邊緣,手指微微蜷曲著。他在床邊蹲下來,輕輕握住那隻手。她的小手在他的掌心裡顯得有些小得不真實——五根細小的手指,皮膚柔軟得像一層薄綢,能透過手背看到淡青色的血管走向。

他的女兒。

一個不想讓米蘭的女兒變成的樣子。

他會在那扇門打開的時候走進数据天堂。不是為了自由,不是為了互聯網,不是為了推翻什麼。是為了讓這個握著他的手指的小姑娘——永遠不需要在信裡寫"我不恨你,只是不能原諒你"。

窗外的天空正在從深藍變成灰藍。深圳的黎明正在到來。

法尔汉坐在屏幕前,沒有閤眼。他的目光落在那條未讀短信上——"我知道。"——和那個還未按下的回車鍵。

這三個字像一根繃緊的弦,連接著貝爾格萊德和深圳的黎明、連接著一個還沒有被激活的嵌套入口、連接著兩個隔著整片大陸對峙的父親。

線還沒有通。

但線已經在他們手中了。

微信公眾號二維碼

掃碼關注微信公眾號
閱讀更多獨家內容