第4章 盲棋------------------------------------------。。他坐在工作站前,麵前擺著三塊螢幕,每一塊螢幕上都在滾動著不同的數據流。他的手指在鍵盤上飛快地敲擊,速度比白天更快,指法更加淩厲,像是在進行一場無聲的演奏。,看著螢幕上那些飛速閃過的命令和代碼,眼睛越瞪越大。“沈……沈老師,您這是在做什麼?”“重建攻擊模型。”沈奕頭也不回,“我在模擬K入侵交通係統時的思維路徑。要同時控製全城一百七十個路口信號機,攻擊者必須解決三個問題:第一,如何同時觸發所有設備中的隱藏代碼;第二,如何確保觸發的時間精確到毫秒級;第三,如何在觸發之後不被任何監控係統發現。”“這些問題有答案了嗎?”“第一個問題,攻擊者使用了NTP協議的時間同步功能作為觸發機製。所有設備都會定期向中央時鐘同步時間,攻擊者隻需要在NTP服務器返回的時間數據中嵌入一個特定的觸發信號,所有設備就會在同步時間的瞬間執行預設的指令。”。“你看這裡——正常的NTP響應包中有一個‘reference timestamp’欄位,用於記錄參考時間源的最後更新時間。攻擊者在這個欄位的低四位字節中嵌入了觸髮指令。由於這個欄位在正常的NTP協議處理中不會被完整解析,大多數入侵檢測係統都會忽略它。”:“這是在協議層麵進行的隱蔽通訊,幾乎不可能被檢測到。”“幾乎不可能,但不是完全不可能。”沈奕說,“有一個辦法可以檢測到這種隱蔽通道——分析NTP流量的熵值分佈。正常的NTP流量中,‘reference timestamp’欄位的熵值應該接近於隨機分佈,因為時間戳本身就是隨機的。但如果有人在其中嵌入數據,這個欄位的熵值就會顯著降低。”。螢幕上的代碼行如瀑布般傾瀉而下,邏輯清晰,結構嚴謹,每一行都像是經過精密計算的棋步。,忽然有一種奇怪的感覺——他覺得自己不是在看著一個人編程,而是在看著一個人下棋。每一行代碼都是一步棋,每一個函數都是一個戰術,整個程式就是一盤宏大的棋局。“沈老師,”周銘猶豫了一下,還是問出了口,“我聽說您以前是學數學的,後來才轉的計算機?”“嗯。”
“為什麼轉?”
沈奕的手指停了一瞬。
“因為數學太乾淨了。”他說。
“什麼意思?”
“數學的世界裡,每一個問題都有一個確定的答案。對就是對,錯就是錯。定理一旦被證明,就永遠不會被推翻。”他的聲音忽然變得有些遙遠,“但現實世界不是這樣的。現實世界裡,對和錯可以同時存在,真相和謊言可以完美地糾纏在一起。你無法用數學的方式證明一個人是無辜的——”
他停頓了一下,手指重新落在鍵盤上。
“所以我學了計算機。計算機是數學和現實之間的橋梁。代碼可以被篡改,但代碼的邏輯不會說謊。”
周銘沉默了。
他忽然覺得,眼前這個人不像一個被關了兩年精神病院的病人。他像一個——棋手。一個被蒙上眼睛下了兩年盲棋的棋手,現在終於被摘掉了眼罩,看到了真正的棋盤。
“找到了。”沈奕忽然說。
“找到什麼?”
“K在入侵交通係統時使用的一個特征——一個他無法消除的、屬於他個人的‘指紋’。”
沈奕放大了螢幕上的某一段數據。
“你看這個時間同步的精度。K在觸發所有設備的時候,時間同步的誤差控製在±0.5毫秒以內。這是一個極其驚人的精度,普通的NTP同步隻能達到±10毫秒的精度。K能做到這一點,說明他對NTP協議的理解遠超常人——但同時也暴露了一個資訊。”
“什麼資訊?”
“K用於觸發攻擊的NTP服務器,不是普通的NTP服務器。它是一台經過特殊定製的服務器,運行著一個修改版的NTP守護進程。這個修改版的NTPD有一個特性——它在處理閏秒的時候,會使用一個非標準的演算法。”
他在螢幕上調出一段數學公式。
“這個演算法是K自己寫的。它比標準的閏秒處理演算法更高效,但有一個副作用——每次處理閏秒的時候,會在係統日誌中留下一個特定的錯誤代碼。這個錯誤代碼不是標準的NTP錯誤碼,而是K自己定義的。”
“你的意思是——”
“我的意思是,如果K曾經用同樣的方法入侵過其他係統,那麼那些係統的日誌中也會留下同樣的錯誤代碼。我們可以用這個特征,去搜尋全國範圍內所有使用NTP協議的係統日誌——找出所有出現過這個錯誤代碼的設備。”
沈奕轉過身來,看著林薇——她不知什麼時候已經站在了門口。
“林隊,我需要訪問國家互聯網應急中心的日誌數據庫。”
林薇皺眉:“那個數據庫的權限——”
“我知道,最高級彆。但如果你不去申請,我們就永遠找不到K的蹤跡。這個人是一個大師級的棋手,他走的每一步都經過了精心的計算。但他犯了一個錯誤——”
沈奕的嘴角微微翹起。
“什麼錯誤?”
“他太優秀了。”沈奕說,“他寫的這段閏秒處理代碼太優雅、太高效了。一個正常的係統管理員不會寫出這樣的代碼,因為冇有人會在意閏秒處理的效能優化。隻有一種人會在這上麵花心思——一個把編程當成藝術的人。”
他站起身,走到窗邊。窗外是技術中心的院子,院子裡有一棵老槐樹,樹冠在暮色中像一團濃重的墨綠。
“一個把編程當成藝術的人,會在他的作品中留下簽名——即使他自己都冇有意識到。”沈奕的聲音很輕,“就像棋手會在棋局中留下風格一樣。K的代碼裡有他的風格,他的風格就是他的指紋。”
“你能找到他?”林薇問。
“給我四十八小時。”沈奕說,“和一副象棋。”
“你還在想你的象棋?”
“不是想。”沈奕轉過身來,暮色從他的背後透進來,給他的輪廓鍍上了一層暗金色的光,“我需要象棋來保持思維的銳利。編程和破案是戰術層麵的工作,但象棋是戰略層麵的訓練。對付K這樣的對手,光有技術不夠——我需要下贏一盤盲棋。”
“盲棋?”
“盲棋就是不看棋盤,憑記憶和想象下棋。”沈奕說,“K現在就在下一盤盲棋。他看不見我們,我們也看不見他。但棋局已經擺開了,每一步都在改變整個局麵。我需要在不看到棋盤的情況下,推演出他的全部意圖。”
他走回工作站前,從抽屜裡翻出那副被撿回來的棋盤——周銘在離開精神病院的時候幫他把散落的棋子收拾了。
他把棋盤鋪在桌上,紅黑三十二子各就各位。
“這盤棋,”他說,“紅方是K,黑方是我。K已經走了第一步——”
他將紅方的中兵向前推了一步。
“入侵交通係統。這是一步試探性的開局,不是殺招,而是為了測試我的反應。”
他又將紅方的左馬跳起。
“綁架方仲年。這是第二步,開始佈局,控製要害位置。”
他將紅方的右車橫移。
“要求釋放‘K’。這是第三步,亮出目標,施加壓力。”
沈奕的手指停在半空中,懸在棋盤上方。
“現在,輪到我了。”
他拿起黑方的卒,向前推了一步。
“第一步——找出方仲年保險櫃裡的殘棋。”
他又移動了一顆黑子。
“第二步——重建K的攻擊模型,找到他的指紋。”
他移動了第三顆黑子。
“第三步——”
他的手指停在一顆黑馬上,但冇有拿起來。
“第三步是什麼?”林薇問。
沈奕沉默了很久。
窗外的天色完全暗了下來,院子裡的老槐樹變成了一團模糊的黑影。技術中心的燈光亮起,熒光燈管發出均勻的白光,照亮了棋盤上紅黑分明的棋子。
“第三步,”沈奕終於開口,聲音低得像是從井底傳來的回聲,“是走到K的下一步之前。”
他抬起頭,眼睛裡的幽藍色火焰在熒光燈下顯得格外明亮。
“K是一個極其聰明的對手,他走的每一步都經過了精心的計算。但聰明的棋手有一個共同的弱點——他們太相信自己的計算了。當他們算到三步之後的局麵對自己有利時,就會忽略第四步上的陷阱。”
他拿起那顆黑馬,重重地落在棋盤上。
“我要做的,不是應對K已經走出的棋。我要做的是——讓他以為他算到了我的棋,然後在他以為他贏了的時候,告訴他——”
黑馬落在了一個出人意料的位置上。
“——你算錯了。”