於暘在極棒2015安全峰會Geekon中的演講《用一張紙入侵企業號星艦》
演講內容
條碼閱讀器的應用場景非常之多,包括國內很多醫院都已經用條碼來管理病人了,另外還有各種各樣的自助設備、自助服務,我們在國外看到很多超市是可以不要收銀員的,你自己拿著商品,商品上有條碼,掃一下,它統計一下多少錢,你刷一下信用卡,就可以走了。在機場,需要刷一下登機牌的條碼才可以過去,有的城市的地鐵票也是一個條碼。
我今天帶了兩種條碼閱讀器,一個是槍式,一個是坐式。槍式的放在支架上就變成了坐式。槍式拿起來對著條碼按一下按紐,就可以完成,坐式是主動的發射出掃碼的雷射,只要把條碼靠近,就可以完成讀取。槍式往往應用在超市、物流管理、倉儲這些主動使用條碼閱讀器的場合。坐式通常會放在那些提供給用戶自助的場合。
條碼閱讀器的工作原理是比較簡單,首先,他要獲取圖象,因為條碼就是圖象,通常他當中有一個類似於攝象頭的感光元件;第二,他獲取圖象以後,會交給條碼識別晶片,這個晶片的功能就是根據條碼識別的協議和邏輯,對圖象做解碼和轉換,從晶片當中輸出的數據就是0101這樣的數據了,但是,條碼實際上有很多協議,這個晶片通常來說不會只支持一種協議,雖然我們日常使用的協議只有很少的幾種,但是一般來說,做條碼的廠商,他們所使用的晶片裡面是可以處理多種的協議的。因為他們既然要做一個產品,肯定要考慮到兼容性,儘可能兼容多種標準,儘管客戶不會用,我們也要支持。
解碼晶片輸出的數據,會通過數據傳輸的部件,傳遞給使用條碼數據的機器。這個傳輸有串口,有一些是用PS/2口,還有一些是用USB口,還有一些其他的並口,還有一些其他的自定義的類型等等,但是現在看來比較多的還是USB口。
在各種條碼協議尤其一維的條碼協議當中,有一種協議比較有意思,就是叫做Code128,這個協議不僅僅可以編碼可以見的字符,因為我們知道最常見的條碼是用來存儲數字的,有些條碼也可以存儲字母,但是128不僅可以存儲字母和數字,可以支持全部的ASCII字符,而且存儲效能比較高,可以存儲在單位尺寸的條碼當中儘可能多的信息量。另外它有三個可以自定義功能條碼,是一個非常靈活的協議,甚至可以在一個條碼當中混合使用多種字符集,所以當初設計這個協議的設計者,應該是一個非常有野心的人,他覺得我要設計一種協議,你們用我這個就行了,根本不用其他的協議了。雖然128在我們平常使用當中幾乎不可能都用上,但是幾乎所有的條碼閱讀器都支持它。世界上市場佔有率最大的閱讀器的生產廠商,就是Symbol,我今天帶來的都是這個品牌的,它也開創了條碼界的很多新技術,包括一些他們獨有的一些專利,國內也有一些,比如新大陸,都是市場佔有比較大的廠商。
我們的研究,BadBarcode,什麼是BadBarcode,這種攻擊是基於幾點,第一,我們發現大量的條碼閱讀器通信是基於PS/2,或者是HID的鍵盤模擬。第二個,128這個協議是支持完整的ASCII表,也包括這些控制字符。而條碼閱讀器的生產商,為了儘可能的兼容,會支持128。雖然我們條碼裡面存的都是一些數字,頂多是字母,我們想有沒有可能用條碼輸入一些熱鍵,系統熱鍵,這是ASCII的字符表,這裡常用的CTRL對應的鍵都有對應的值,也就是說,通過128協議,我們完全有可能向系統去輸入這些特殊的空置鍵,同時,很多的程序是支持熱鍵的,程序開發的時候,內置了一些默認的熱鍵,這種熱鍵有可能被條碼所激活,但是我們發現128只支持CRTL加上一個字母這種熱鍵,但是不支持WIN的組合鍵,或者ALT的組合鍵。即使只支持非常簡單的組合,它仍然可能對一些終端機造成威脅,因為很多終端機給用戶提供了一個觸屏,雖然那個界面你什麼都幹不了,只能幹它讓你做的事情,但是一旦你有這個觸屏的話,我們如果能用一些熱鍵,把一些系統的對話框調出來,就可以在這個觸屏上該幹什麼幹什麼。
接下來我給大家演示的是今天的第一個DEMO(視頻31分),我稱之為對話框攻擊。這個演示非常簡單,一秒鐘。現在我在系統上打開了這個開發出來的用於條碼輸入的程序,正常情況下,條碼應該輸入的是數字或者是字母。我們現在把這個條碼拿上去,掃一下,這個是正常情況下正常的工作方式。但是如果我們用一個特殊構造的128協議,會怎麼樣呢?不管你的程序是怎麼樣,哪怕你是前臺獨佔的程序,我們通過系統熱鍵可以把對話框調出來,調出來以後,可以在觸控螢幕上操作,執行我想執行的任何程序。這是我說的對話框攻擊。
很多終端機有觸屏,但不是所有的用條碼的設備都有觸屏屏。有的連的主機很遠,你能得到的就是這樣一個條碼的輸出界面,那麼這種情況下,有沒有可能用條碼完成所有的交互?
如果想做到這個事情,我們大家最直接想到的是什麼?就是拿WIN+R把運行的框調出來,然後敲命令執行。128做不到,他不支持WIN。經過研究發現,我們發現Symbol支持一個技術,Symbol是條碼界領頭公司,幾乎全世界很多使用條碼閱讀器的市場佔有率非常大的產品使用了Symbol的設備。ADF是一個相對複雜的功能,它可以實現什麼呢?第一,在條碼讀到設備裡面,沒有發送到主機之前,我們通過ADF定義一些規則,可以對這個條碼做一些更改,同時他可以讓閱讀器做某些特定的動作,是定義之外的,不屬於任何協議的。就是我們可以自己定義自己的協議,比如說,設定某些組合按鍵,而且這些所有的功能可以通過條碼本身實現,並不需要連接到計算機做配置,所有配置通過掃條碼就可以實現。這是ADF的功能,我們列出了更詳細的功能。
接下來我們看第二個DEMO(視頻43分30秒),我們稱之為紙片攻擊,用一張紙入侵企業號星艦。我們在Kindle上寫了一個小程序,實際上這個小程序可以實現什麼呢?你想做的事情,直接在這上面輸入,然後點一個按紐,它就會自動幫你完成這個攻擊,我們這兒默認的是預置了一個彈計算器,我們來看一下。就是說,藉助Kindle的情況下,我們可以把整個攻擊實現一個自動化,你往那兒一丟,人走了沒關係。
總結一下我今天講的內容,首先BadBarcode不是某款產品或某個廠商的漏洞,是一類產品的問題,所有使用PS/2或者HID鍵盤模擬條碼閱讀器的設備都可能受BadBarcode的影響,條碼閱讀器支持ADF的設備可能實現全自動攻擊。條碼閱讀器不支持ADF但有觸屏的也可能被攻擊,其他鍵盤模擬設備也可能有類似問題,比如說RFID,特別是NFC有沒有可能?實際上是一個值得研究的問題,我們也會持續關注這個方面。
我們在此給出一些安全建議,第一,對於條碼閱讀器的生產廠商,建議儘量默認不開啟這個ADF的功能,因為絕大多數買回去用的,你是用不著這些功能的,大家都是用的基本的掃碼功能,如果要開啟的話,提供一個配置程序讓它不要通過條碼就可以激活;同時,如果有可能的話,儘量閱讀器不去傳輸那些控制類的字符,或者說默認不這麼幹,也是可以通過一定接口開啟的,因為絕大多數情況下這是不必要的;另外對於使用條碼閱讀器的這些設備生產廠商,在選型的時候,儘可能不要去選這個基於PS/2或者HID鍵盤模擬條碼,容易的背後是會帶來安全隱患。如果說你現在已經定型了,你已經部署了很多的設備,怎麼解決這個問題?那麼,第一,你在開發程序的時候,儘量不要去啟動熱鍵,不要讓它支持熱鍵,因為可能是用不長的;第二,如果你所使用的有OS熱鍵,那麼屏蔽他,通過這些方式可以阻止BadBarcode的攻擊。
於暘
作為騰訊玄武安全試驗負責人,於暘從事信息安全技術研究十餘年,主要從事安全漏洞、惡意代碼等很多方向的研究,被網友稱為TK教主。於暘不僅名震國內,而且享譽世界,經常被邀請出席國際黑客會議做演講,比如CanSecWest、HlTCon、XCon等。此外,於暘還是微軟漏洞利用緩解技術繞過挑戰全球兩個10萬美元最高獎獲得者之一。
玄武實驗室
玄武實驗室是騰訊在 2014 年新成立的部門。玄武是中國傳統文化「四象」之一。構成玄武的龜和蛇象徵著安全技術的一體兩面:防禦和攻擊。實驗室的定位是:圍繞安全攻防技術,展開面向實用的基礎研究。
GeekPwn微信號將陸續推出Geekon峰會精彩視頻,關注GeekPwn公眾號,盡享前沿技術乾貨。