《代碼:燼》第11章 DNS污染(1)

作者:LS金銀·1個月前

系統的公共DNS服務徹底停擺之後,瀛海市的數字世界沒有立刻陷沉默——它先陷了一種更可怕的狀態:錯

三組節點全部離線後的第十七秒,備用微波鏈路終於完了切換。這是龍系統設計之初就埋下的最後一道保險——一條獨立於纖網路之外的微波應急通道,直連龍穹科技總部地下機房的輔助DNS伺服。輔助伺服平時不參與公共解析,只做兩件事:一是每天凌晨從節點同步一次區域檔案快照,二是在所有節點同時宕機的極端況下臨時頂上去。按照設計文件裡的描述,這個切換過程應該在十五秒,從切換功到輔助伺服開始正常響應查詢請求,額外還需要大概十秒的快取預熱時間。加上之前已經過去的十七秒,總計大約四十二秒。

四十二秒的全城DNS空白,對於一座四千萬人口的巨型都市來說,已經夠長了。足夠讓所有依賴域名解析的服務——從銀行易到外賣配送到醫院掛號——全部陷等待超時。但四十二秒之後,輔助伺服上線,一切應該逐漸恢復正常。

但輔助伺服上線的時間點,恰好撞上了另一件事。

林劫的殭網路還活著。兩百萬臺節點宕機之後並沒有停止發包——它們還在持續向已經死的三組節點IP地址傳送查詢請求,每秒超過一千萬次。微波鏈路切換功的那一刻,輔助伺服剛剛開始預熱快取,還沒來得及理第一條外部查詢,就被一從備用鏈路湧進來的資料洪流迎面拍在了臉上。這流量的規模遠小於之前的直接攻擊——因為微波鏈路的頻寬只有纖的二十分之一,理瓶頸天然限制了洪峰的流量上限。但問題是,輔助伺服理能力也只有主節點的不到十分之一,它的設計定位是“在節點計劃維護期間臨時接管”,而不是“在節點被DDoS打死後扛全城流量”。

輔助伺服的DNS解析程序在啟後的零點幾秒發了過載保護,開始主丟棄超出理上限的查詢請求。丟包率達到百分之四十的時候,快取命中率開始斷崖式下跌——因為大量正常使用者的查詢請求被丟掉了,而活下來的請求裡大部分是殭網路發出的垃圾查詢。垃圾查詢請求的域名是隨機生的,每一條都不在快取裡,每一條都強制伺服向上一級權威DNS發起遞迴查詢。輔助伺服的遞迴查詢併發數上限是每秒兩萬條——在正常工況下這個上限幾乎不可能被發。但此刻,數十萬臺正在用隨機生的假域名瘋狂轟炸它的遞迴查詢佇列,佇列在不到半秒就被塞滿了。

遞迴佇列溢位之後,輔助伺服的DNS解析程序做了一個所有DNS在極端力下都會做的事——它開始返回SERVFAIL。不是查詢結果,不是“域名不存在”,而是直接的“伺服故障”。但這還不是最糟的。由於遞迴佇列中積了大量尚未完的狀態機,程序記憶佔用開始急劇膨脹,最終發了作業系統的OOiller。OOiller這次沒有殺掉DNS服務程序——它殺錯了,殺掉了負責DNS區域檔案完整校驗的後臺守護程序。守護程序一死,區域檔案失去了即時保護。

而殭網路還在發包。其中一部分請求包因為微波鏈路的資料錯誤,在傳輸過程中發生了位元翻轉——微波鏈路本來就比纖更容易天氣和電磁干擾,上次從舊通訊基站授時伺服取時間的時候林劫就已經領教過這條鏈路的氣。位元翻轉之後的請求包在DNS協議層面變了畸形包,輔助伺服的畸形包理模組還沒來得及載——因為OOiller剛才順手把它也殺掉了。畸形包直接撞擊在未經校驗的區域檔案快取上,在記憶中寫了數千條錯誤的DNS記錄。這些記錄在極短的時間被寫了區域檔案快照——因為負責阻止這種事發生的守護程序已經死了。後臺同步程序到點照常執行,把這份被汙染的區域檔案快照過微波鏈路的反向通道,同步回了龍穹科技總部地下機房的主DNS伺服儲存陣列——主節點還在掙扎著試圖重新上線,剛剛完重啟,還沒來得及載區域檔案。

凌晨兩點零一分四十七秒。

系統公共DNS服務正式恢復。主節點從儲存陣列中載了區域檔案快照,開始響應全城範圍的所有查詢請求。這一次沒有過載,中間也沒有任何異常——節點的效能綽綽有餘,兩臺纖直連的主節點和一臺備用微波鏈路同時線上,全負載均衡正常工作,查詢延遲從幾千毫秒驟降至不到十毫秒。普通市民的手機、平板、智慧家居、車載導航開始逐漸恢復網路連線——但恢復的是被篡改過的網路。在整個瀛海市範圍,DNS解析結果全部變了錯誤的容。當一個使用者在手機瀏覽裡輸“瀛海銀行”的網址,瀏覽的DNS解析請求經過層層轉發到達剛剛恢復服務的DNS節點,節點查詢被汙染的區域檔案快取後,返回了一個錯誤的IP地址——這個地址本不屬於任何一家銀行,而是一個已經被廢棄多年的個人部落格伺服。每當有市民試圖開啟外賣應用,系統據錯誤的解析結果將請求路由到了一個空地址,螢幕上轉了幾圈載畫之後彈出一條冰冷的提示:網路連線異常,請稍後重試。每當有醫院的掛號系統嘗試與醫保資料庫建立連線,憑藉記憶中的域名解析出來的IP地址完全不屬於醫保中心,而是隨機指向了某個寫字樓裡的廣告公司部伺服。車載導航一旦請求高地圖更新,DNS把請求引向了一個只能返回空包的死衚衕,地圖介面卡在定點陣圖標旋轉的花狀態不再更新,連路網資訊都載不出來。

這不是林劫親手設計的劇本——他不知道自己塞進DNS模板裡的隨機域名會不會發位元翻轉,也不知道OOiller會殺掉哪個程序。但事就這樣發生了,從他敲下回車鍵的那一刻開始,所有的多米諾骨牌就已經在往下倒了。他只是推了第一塊,後面的每一塊都按照自己的重量和慣砸向下一塊。

“DNS汙染了。”沈易盯著螢幕上那片麻麻的紅報錯日誌,臉上的表慢慢僵住了。這種攻擊效果他以前只在安全期刊上讀過——大多是個別駭客對單一快取伺服進行投毒的記錄,撐死影響幾個小眾網站。他從未見過全城範圍的毒化效應以眼可見的速度往外擴散,就像往一杯水裡滴了一滴墨水,看著墨擴散的速度快過擴散方程本的估計。通訊號中央協調的智慧駕駛系統高地圖伺服始終連不上,車載資訊娛樂終端反覆彈出“服務暫時不可用”的提示,路網資訊缺失、擁堵避讓引導失效,全城智慧駕駛車輛集模式。金融網路部的易路由被DNS汙染帶偏,大量支付請求開始失敗,電子結算系統在兩次嘗試失敗後自發熔斷機制,暫時將整個支付閘道強制降級為離線排隊模式。

“這比DDoS狠。”沈易說。他的聲音忽然變得很輕,“DDoS是堵門。汙染是把門牌號全換了。”

林劫看著螢幕上那些被汙染的記錄,面沒有毫變化,繼續敲著鍵盤。他正在做最後一件事——關掉殭網路的發包迴圈。節點已經恢復,輔助伺服也已經重新載了區域檔案,繼續攻擊沒有意義——汙染已經寫區域檔案快照的源頭,從他的角度幾乎不可恢復。他敲下最後一行指令,殭網路的控制檯上那兩行跳的數字開始往下掉。線上節點數從一百八十多萬持續向下回落,有的裝置在完最後一次查詢後自休眠,有的裝置因為韌回滾機制被系統修復後自退出網路,有的乾脆掉線再也沒回來——大概是訊號太差,或者是裝置本太舊撐不住這麼長時間的連續工作。從凌晨兩點零二分開始,線上節點數以每秒上萬臺的速度往下掉,每重新整理一次都掉一大截,螢幕上的數字卡頓了幾次才重新跳出來一個新低值。

百萬量級的殭節點在幾分鐘迅速崩塌消散。兩百萬臺沉睡的節點完了它們的使命,正在一個接一個地安靜下來。熒一樣的開始從螢幕上淡去。

猜你喜歡

同題材或同分類的其他作品。