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