楠木軒

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

由 鍾離黎明 發佈於 經典

  在正式開談 USB 安全之前,還是照例來分享一個很有意思的案例:2014 年年末,來自 Reddit 的報道,某大公司高管電腦感染了惡意程序。公司的安全研究人員就調查惡意程序來源,但檢查了所有傳統可能的感染途經都一無所獲。於是他們開始考慮其他突破口,從這位高管的飲食起居入手,翻來覆去地查,最後發現知乎日報:中國父母在教育上普遍存在哪些問題?" href="https://www.nanmuxuan.com/zh-sg/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 設備也不要去插不受信任的主機設備。用户能做的,大概也只有這些了吧。