楠木軒

知乎日報:這年頭還有安全的 USB 裝置嗎?

由 鍾離黎明 釋出於 經典

  在正式開談 USB 安全之前,還是照例來分享一個很有意思的案例:2014 年年末,來自 Reddit 的報道,某大公司高管電腦感染了惡意程式。公司的安全研究人員就調查惡意程式來源,但檢查了所有傳統可能的感染途經都一無所獲。於是他們開始考慮其他突破口,從這位高管的飲食起居入手,翻來覆去地查,最後發現知乎日報:中國父母在教育上普遍存在哪些問題?" href="https://www.nanmuxuan.com/zh-tw/classic/XYzhFBIzQT.html">問題居然出在高管的電子煙身上。

  “這是一款中國造的電子煙,充電裝置部分包含了硬體編碼的惡意程式。”而這款電子煙是透過 USB 口充電的,這名高管為了充電,順手會將其插入到公司的電腦上,於是電腦就感染了惡意程式。

  在這一例中,如果惡意程式做得更加隱秘,那麼整個攻擊過程甚至可以達到神不知鬼不覺。這其中的傳播核心,就是我們要談的“USB 安全”。

  USB 安全?這是什麼意思?

  我們擅自提“USB 安全”這個詞彙,其實是不準確的。因為 USB 本質上只是一種通用序列匯流排——匯流排有很多啊,SATA 匯流排、PCIe 匯流排等等,這有什麼樣的安全話題可談呢?可能 USB 充其量可作為惡意程式傳播的途經。我們說“USB 安全”,和說“網線安全”是不是感覺差不多荒謬?

  不過大概是因為 USB 作為替代古代各種介面的明星級統一標準,而且 USB 又不像 Thunderbolt 之類的介面一樣需要高昂的授權費用,當代世界的海量裝置採用 USB 介面也是種必然。有趣的是,我們經常將採用 USB 介面的裝置稱作 USB 裝置(卻沒有人將 PC 內建的硬碟稱作 SATA 裝置或者 PCIe 裝置),這也是我們這裡談 USB 安全的基礎。

  由於 USB 當代的使用如此廣泛,所以 USB 裝置也就成為了惡意程式傳播的重要載體。但如果只說 USB 裝置作為惡意程式的傳播途徑,那麼任何介面實際上也都存在這種傳播的可行性。比如說 U 盤能夠傳播病毒,Thunderbolt 行動硬碟也行,連光碟都可以。

  總的說來,我們要談所謂的 USB 安全,並不是 USB 在資料傳輸過程中存在安全問題,或者某類 USB 介面規格(如 Type-C)某個針腳存在設計缺陷,而是 USB 介面或匯流排作為惡意程式的一個重要途經,存在安全問題,以及 USB 協議、驅動存在的安全問題。

  因此針對 USB 安全,有 3 點可談。其一,USB 是個具有相當普遍性的標準,滑鼠、鍵盤、電子煙、外接音效卡都用 USB 介面,且即插即用。所以在物理介面中,它對惡意程式的傳播大概是除了網路介面卡介面之外,效率最高的。其二,USB 協議可被攻擊者利用,這也將是本文要談到的重點。其三,最高階的 USB 0day 漏洞攻擊。

  autorun.inf 時代!U 盤病毒?

  在網路還不像現在這麼盛行的年代,可移動儲存裝置是傳播病毒的重要方式。就是將惡意程式放在 U 盤,或者行動硬碟,甚至軟盤中——在不同的 PC 交換資料的過程中,就可以達到傳播病毒的作用。再高明的惡意程式也需要人類去開啟才能執行,巧在像 Windows 這類作業系統,為了加強使用體驗,系統中有個針對移動儲存介質的 AutoPlay/AutoRun 自動播放功能。

  原本自動播放的功能是,針對 CD/DVD 多媒體光碟可實現插入即播放,而針對 Windows 安裝介質,插入就能立即彈出安裝程式。絕大部分同學應該都知道移動儲存介質的根目錄下的 autorun.inf 檔案就負責自動播放功能,開啟形如以下樣式:

  [autorun] open=setup.exe icon=setup.exe,0label=My install CD

  相較光碟,U 盤的可讀寫方便性明顯更勝一籌,如果這裡的 setup.exe 是個病毒,那麼裝置插入 U 盤,系統就會自動執行該病毒。所以病毒透過 autorun.inf 檔案實現 U 盤插入即啟動惡意程式的功能,實在是太方便了。同事間交換資料,大家的電腦都插一遍帶毒 U 盤,自然就都感染上了。已經被感染的裝置,再感染插入裝置的新 U 盤,以此達到擴散的目的。

  這是 U 盤傳播惡意程式的常規手法,也因此有些人將 autorun.inf 稱作“U 盤病毒”,雖然這東西其實是很無辜的。實際上,要杜絕這種方式的病毒傳播也並不困難,一方面是在系統中禁用移動儲存介質的自動播放或自動啟動功能,另一方面也可以禁止程式在 U 盤中建立 autorun.inf 檔案,達到 U 盤不會傳播病毒的目的。

  可以說,autorun.inf 是過去在民間最廣為流傳的 U 盤病毒傳播方式。很多 U 盤病毒查殺工具都主要針對 autorun.inf 進行圍剿。尤其從 Windows XP SP2 開始,系統針對“USB 大容量儲存裝置”和 ZIP 驅動器,自動播放功能是預設開啟的。微軟眼見形勢不妙,從 Windows Vista 和 Windows Server 2008 開始,針對插入 U 盤的的系統預設行為,已改為詢問使用者是否執行自動執行指令。現如今 autorun.inf 的時代幾乎已經過去。

  用 U 盤來釣魚會不會成功?

  如前文所述,其實上面談到的 U 盤安全問題並不是 USB 裝置的專屬,任何移動儲存裝置(甚至連內建硬碟)都存在這樣的問題。所以嚴格意義上,這種安全問題根本就怪不到 USB 頭上,如果一定要怪,就如前文所述,只是因為 USB 實在是太普遍了。

  前不久剛剛結束的 Black Hat USA 2016 駭客大會上,谷歌反欺詐研究團隊負責人 Elie Bursztein 分享了一個議題,名為“Does dropping USB drives really work?”(丟 U 盤進行社工攻擊真的有效嗎?)他嘗試在伊利諾伊大學校園裡各處丟棄 297 個 U 盤,看看有沒有好奇心重的人會撿回去看 U 盤裡究竟有什麼。如果說 Bursztein 丟的是 297 塊 SATA3 硬碟(Lol),攻擊方式理論上是一樣的,但攻擊效果有多麼糟糕是可想而知的。可見 USB 的普及性,是我們在此討論其安全性的依據。

  美國計算機行業協會去年曾經發起過一項調查,結果顯示 17% 的人在撿到 USB 裝置後會直接連電腦——這個資料可能還過於保守。Bursztein 的調查結果明顯更激進:135 個 U 盤(也就是 45%)被人撿走後都連線了電腦,這些人還打開了其中的檔案,其上的“惡意程式”給 Bursztein 回傳了資料。

  好在這還只是個實驗,並不存在真的“惡意”。Bursztein 的研究團隊是這麼做的:他們沒有用 autorun.inf,因為現在的作業系統根本就不吃這套,Mac 連自動執行功能都不支援,他們的方法是:釣魚。

  研究團隊給這 297 個 U 盤分別貼了些標籤,甚至還明確寫上了 U 盤所有者(以及歸還地址),即便在這種情況下還是有 135 個 U 盤被好奇心重的同學打開了。U 盤裡面的檔案迷惑性地寫上了“期末考試”“機密”等字樣,實際上這些檔案都是 HTML 格式的,檔案中有張圖片,呼叫了研究團隊伺服器的地址——這樣一來研究團隊就知道,有人打開了檔案。

  除此之外,HTML 檔案開啟後有個問卷調查,詢問這些好奇心寶寶:你們為啥要插人家的 U 盤呀!的確也有 20% 的人參與了調查,超 2/3 的人表示他們其實是想歸還 U 盤的(Really?),18% 的人承認他們是好奇,14% 的人給出了其他解釋。

  就這一個例子,我們就不難看出 U 盤釣魚的成功率還是相當高的。如果這些 HTML 檔案都換成惡意程式,或者調查問卷改成詢問使用者名稱密碼的“釣魚問卷”,又有多少人會栽在其中呢!美劇《駭客軍團(Mr Robot)》中就出現了用 U 盤釣魚的橋段,看樣子這根本就不只是個傳說!

  U 盤攻擊絕殺:偽裝成 HID 裝置

  還是那句話,上面兩部分談的實際上都仍是將 USB 裝置作為傳播惡意程式的載體,就好像 U 盤釣魚,其本質和丟個軟盤來釣魚(Lol),以及郵件釣魚是沒差別的,原罪不在 USB 裝置身上。如果用這種方法來談 USB 安全,實際上還有很多內容可說,比如說 USB 介面是入侵 ATM 機的重要途徑,還有 USB Key 這類作為資料解密的安全手段,都不過是將 USB 作為工具。

  那麼有沒有 USB 本身的原罪可談呢?有!可以從 USB 的協議入手。USB 不止 MSC(大容量儲存)裝置這一種,現在的 USB 介面支援這麼多功能,協議其實也五花八門,自然不光有相關 MSC 的協議,什麼 USB Power Delivery(USB 快速充電規範)、USB OTG(SRP、HNP 協議,兩個外設間傳輸)等等,還有一個 USB HID 裝置類協議。這裡的 USB HID,近兩年來已經成為 USB 裝置攻擊的絕殺了。

  HID 也就是 Human Interface Device,是與人互動的裝置。其實 USB-HID 裝置現如今已經相當普遍了,比如 USB 鍵盤、滑鼠、手柄等等。這要怎麼利用呢?在 2014 年的 Black Hat 駭客大會上,安全研究人員 Karsten Nohl 和 Jakob Lell 發表了演講,提到一個有些驚世駭俗意味的 USB 攻擊手段,名叫 BadUSB,部分利用了 HID 的特點。

  上面說的好玄乎,所以下面再來舉個栗子:鍵盤都用過吧?有沒有試過不用滑鼠,純粹用鍵盤來進行各項系統操作呢?有經驗的同學應該知道,其實也不難。那麼如果有這麼一個 U 盤,它能夠偽裝成鍵盤,透過指令碼執行一系列鍵盤敲擊操作,是不是感覺就能控制你的系統了?這其實就是 BadUSB 攻擊利用 USB 協議的示例。被 BadUSB 感染過的 U 盤不僅能夠偽裝成 USB 鍵盤,還能偽裝成 USB 網絡卡——篡改 DNS,這樣一來所有的 DNS 查詢就能發往攻擊者的伺服器,可進行重定向攻擊。

  一旦這種攻擊得以實現,那麼攻擊方式自然也就變得五花八門了,只有想不到沒有做不到,最重要的是跨平臺——因為各系統平臺遵循一致的 USB 標準。詳情可參見我們當年釋出的一篇文章《解密 BadUSB:世界上最邪惡的 USB 外設》。

  說到底,這種 HID 模擬攻擊不就是當年駭客們很愛的 USB 橡皮鴨(USB Rubber Ducky)嗎?問題是橡皮鴨的內部硬體很彪悍,有個 60MHz 主頻的處理器、microSD 擴充套件插槽。普通 U 盤何以實現這樣的攻擊手段?這個問題其實才是 Karsten Nohl 和 Jakob Lell 這兩位研究人員的高明之處,也是這些 U 盤在感染 BadUSB 之後的可怕之處。

  一般 U 盤的構成除了我們需要用到的儲存資料的快閃記憶體部分,還有主控晶片,或者叫控制晶片。主控晶片一般會指定某些部分的單元用於儲存韌體驅動(似也有主控晶片本身就包含了韌體快閃記憶體)。這裡的韌體就類似於作業系統,控制軟硬體互動。Nohl 和 Lell 花了好幾個月的時間進行逆向工程,他們發現許多 U 盤都可以對韌體部分進行重新程式設計(尤其是 PHISON 群聯的主控晶片)。使用者根本就看不到韌體部分,要隱藏攻擊程式碼自然就非常容易了。

  這就是 BadUSB 得以成型的核心所在。另一方面當代作業系統為了給 USB 裝置提供最大的相容性,USB 標準是允許一個 USB 裝置具有多種輸入輸出裝置的特徵的。這樣一來,透過重寫 U 盤韌體,就能讓它偽裝成 USB 鍵盤、網絡卡甚至顯示器。透過這個假的鍵盤,輸入 U 盤韌體中的惡意指令和程式碼,還可以配合快閃記憶體中的惡意程式進行攻擊。

  說白了,BadUSB 是令普通 U 盤都變身為橡皮鴨,甚至攻擊性更強。這其中的加強體現在 BadUSB 的偽裝和傳播性方面。偽裝!很容易理解,看起來只是個普通 U 盤,而且即便格式化 U 盤也無法清除惡意程式碼,因為惡意程式碼在韌體中;傳播!當年 Nohl 和 Lell 在研究報告中有特別提到,BadUSB 理論上最大的威脅在於,透過一個 BadUSB 裝置給計算機感染惡意程式之後,計算機也可以將 BadUSB 傳播到其他插入計算機的 U 盤:某個 U 盤在插入這臺計算機之後,計算機上的惡意程式就能夠對 U 盤韌體進行重新編寫,U 盤主人根本就不會察覺到。

  這麼一來,全世界的 U 盤都能透過這種方式被 BadUSB 感染,全世界沒有任何一個 U 盤是可被信任的,因為根本就沒有反病毒軟體能夠查到。由此甚至可以引發一個問題:USB 裝置是否已經到了根本就沒有安全性可言的地步?

  其實也不盡然,針對 U 盤韌體,引入不可偽造加密簽名機制就是種方案,杜絕惡意程式的重新編寫。這就主要取決於快閃記憶體主控晶片製造商了。因為有人指責 Nohl 說,他先前在 Black Hat 上的演講其實只針對臺灣群聯的快閃記憶體主控晶片——所以 2014 年年底,Nohl 還抽樣了 8 大主要晶片製造商的主控晶片:群聯、Alcor、瑞薩、祥碩(華碩的子公司)、創惟、FTDI、微芯、Cypress。

  結果發現情況異常複雜。的確有部分 USB 主控晶片對 BadUSB 免疫——即無法對韌體做重新程式設計,免疫的晶片佔到抽樣總數的一半,但每個品牌的表現都是很不穩定的。比如說,採用群聯主控晶片的 U 盤都存在被 BadUSB 感染的風險,而祥碩則完全對 BadUSB 免疫,創惟的 USB 2.0 晶片沒問題,但更新的 USB 3.0 晶片就有問題。其他 USB Hub、鍵盤、攝像頭、滑鼠等所用的控制晶片情況更是五花八門。而且實際上,即便是一個 USB 裝置製造商的相同型號的產品,他們也會在不同批次中採用不一樣的主控晶片,比如金士頓所用的 USB 控制晶片就有五六種之多。

  難不成以後我們要用 U 盤之前,都得先把 U 盤拆開看看主控晶片的型號不成?

  只要是 USB 介面就都不安全!

  不知道很多小夥伴有沒有留意過,斯諾登當年揭露 NSA 的文件中提到了一款竊聽裝置名為 Cottonmouth(如下圖所示)。這就是個 USB 裝置,據說能夠偷偷地往目標裝置中安裝惡意程式。雖然文件中並未詳述其具體機制,但斯諾登說:“如果 Nohl 和 Lell 發現的這種東西早就為 NSA 所用了,我也不會感到奇怪。”或許很久之前,NSA 就已經在這麼幹了,那麼我們手裡的 U 盤……

  但這還不是全部。既然 USB 標準是允許一個 USB 裝置具有多種輸入輸出裝置特徵的,那麼 USB 裝置的偽裝實際上也就不僅限於僅針對 U 盤的 BadUSB 了,各種 USB 裝置都可能出現偽裝的情況。從你的 USB 滑鼠、鍵盤,到攝像頭、電子煙、充電寶。

  除了文章開頭提到的電子煙,2014 年年末央視曝光“改裝充電寶盜取隱私”:看起來只是個充電寶,但實際上卻有儲存資料的能力,特別針對當時加密機制還沒有現在這麼完善的 iPhone 進行資料竊取。這麼想來,我們周圍但凡用 USB 介面的東西似乎都有帶毒帶馬的可能性,這世界真是太殘酷了——說不定你已經被 NSA 鎖定,你的滑鼠就帶 APT 木馬……

  今年的 Black Hat USA 2016 大會上,分享丟 U 盤是否有效的 Elie Bursztein 不僅做了丟 U 盤的實驗,而且還教育人們如何才能做個完整版的、偽裝起來的 U 盤,那詳細程度,從選購晶片到最終 U 盤外部材料成型一條龍,所用的都是成本很低的現成材料(點選這裡)。

  FreeBuf 先前也發表過一篇題為《利用 Arduino 快速製作 Tennsy BadUSB》的文章,用 Arduino Leonardo 微控制器(似成本稍高),配合 Arduino IDE 簡單的程式碼編寫,就做成了一個可偽裝成普通 U 盤的 USB 攻擊裝置。以後要黑誰,送他個 U 盤或充電寶,比郵件釣魚大概有效多了。

  USB 攻擊的究極形態

  Bursztein 在 Black Hat USA 2016 大會上將 USB 攻擊分成了 3 大類,分別是社會工程(丟 U 盤),HID 偽裝和 0-day 漏洞利用。前兩種我們都已經在前文做了簡單的分析,最後一種 0-day 漏洞利用,他只稍作了解釋,主要利用的是 USB 驅動的 0-day 漏洞,只要計算機插上 USB 裝置,就能立刻對計算機進行控制。

  在他看來,0-day 漏洞乃是 USB 攻擊的究級形態,無論是複雜程度、可靠性還是隱蔽性都達到了至高境界(雖然因為針對性強,所以跨平臺屬性不佳)。我們能夠列舉的此類案例實在稀有,因為這幾乎沒有被廣範圍探討過。之前名噪一時的 Stuxnet 震網病毒,就利用了 USB(但似並非 USB 驅動的 0-day 漏洞)傳播——Windows 系統中,.lnk 檔案負責渲染 U 盤中的檔案圖示,插入 U 盤的時候,資源管理器就會掃描其中的 .lnk 檔案來顯示各種格式的檔案,震網病毒就是將惡意程式插入到 .lnk 檔案中——整個過程是插入就執行的,所以其隱蔽性自然可見一斑。

  不過這種例子實在稀有,大約需要投入大量時間和精力,極具針對性地進行攻擊研究。對一般人來說,U 盤釣魚和 HID 偽裝的確才是最需要防範的。但在我們談了這麼多以後,是否還要說說 USB 安全的注意事項呢?

  像 Nohl 說的,防範 USB 攻擊的最佳方案就是不要用 USB 裝置!為了這個目標,就請封死裝置上的所有 USB 介面吧……說正經的,因噎廢食當然不好,但來路不明的 U 盤甚至充電寶、電子煙都不要用,馬路上出現 U 盤,也請忽略之;自己的 USB 裝置也不要去插不受信任的主機裝置。使用者能做的,大概也只有這些了吧。