QR二維碼(Quick Response Code)是由日本豐田子公司Denso Wave于1994年發明并開始使用的一種矩陣二維碼符號。與條形碼相比,它具有明顯的優勢:條形碼最多只能存儲20位,但QR碼可以存儲7089個字符;攜帶相同的信息量,QR只需要條形碼1/10的空間。QR碼最初用于在汽車制造業中追蹤部件,之后被廣泛應用到其它行業尤其是電信行業。隨著智能手機的普及,QR碼成為了一個快速、高效的URL連接器,被稱為移動互聯網的“入口”。用戶通過掃描QR碼,能夠快速鏈接到指定網站,并進行軟件下載、新聞閱覽、廣告推廣服務等。另外,QR碼也逐漸在廣內超市中使用,通過掃描QR碼可查詢到相關產品的產地介紹、營業執照、自產自銷證明等信息。QR碼不僅信息容量大、可靠性高、成本低,還可表示漢字及圖像等多種文字信息、其保密防偽性強而且使用非常方便。因此,很快就在日韓地區得到迅速普及,發展到后來,歐美國家也開始大量使用。
但是,現階段QR碼的使用和推廣存在一個問題,即現有的QR碼不能有效地抵抗二維碼偽造和篡改攻擊,這是一個目前亟待解決的問題。
每個QR碼由尋景圖案、校準圖案、定位圖案等功能圖案和編碼區域構成,其中功能圖形不用于數據編碼。圖1為QR碼符號的結構,圖2為筆者個人的QR二維碼結構圖。
圖1
?
圖2
?
圖3:生成器生成頁面
?
圖4:二維碼掃描結果
PS:筆者這里推薦一個個人認為不錯的QR二維碼在線生成網站http://goqr.me
QR碼符號共有40種規格,分別為版本1、版本2、…、版本40。版本1 的規格為21模塊×21模塊,版本2為25模塊×25模塊。以此類推,每一個版本符號比前一個版本每邊增加4個模塊,直到版本40,規格為177模塊×177模塊。以下圖分別為版本1,2,6,7,14,21和40的符號結構。
?
??
?
?
?
download:快速響應矩陣碼
http://pan.baidu.com/share/link?shareid=187771801&uk=3726153663
尋景圖案(Finder Pattern):尋景圖案分別位于QR符號的左上角、右上角、左下角,如圖5所示。每個尋景圖案是由3個黑白相間的正方形圖案嵌套組成。其用途是幫助QR編解碼軟件定位QR碼,在尋景圖案對齊之后,就可確認碼的位置、尺寸和角度。
?
圖5:筆者QR二維碼結構分析
校準圖案(Alignment Pattern):校準圖案首先識別校準圖案的中心坐標,然后再糾正QR碼的非線性扭曲。為了達到這個目的,在校準圖案中加了黑色的隔離單元,使其更加易于檢測到校準圖案的中心坐標。(大家在掃微信二維碼的時候可以注意觀察一下)
定位圖案(Timing Pattern):定位圖案在垂直和水平方向進行對齊,其用于識別QR碼中的的每個單元的中心坐標,使得黑色和白色圖案分別對應。在二維碼出現扭曲時,這個定位圖案用于糾正單元中的中心坐標。
靜態區域(Quiet Zone):為使QR解碼器更易讀取數據,QR碼預留了空白的頁邊,稱為靜態區域。靜態區域具有四個或者更多的單元。
數據域(Data Area):有效數據被存儲在QR的數據區。在編碼中,數據被編碼成二進制的“1”和“0”,并分別代表白色和黑色模塊。數據區將Reed-Solomon碼與存儲數據合并,并且具有糾錯功能。
為了更好地闡述QR碼的攻擊方式,本文將主要論述QR碼的編碼,解碼則為其逆過程。
步驟1:分析原始數據,確定數據類型,根據類型選擇編碼效率最高的編碼模式;
步驟2:根據步驟1得到的編碼模式,將數據字節轉換為二進制位流;
步驟3:采用糾錯碼技術生成相應的糾錯碼(例如,BCH糾錯碼),如果數據較大,首先對數據進行分塊,然后生成每個數據塊的糾錯碼,按照分塊順序合并作為最終的糾錯碼;
步驟4:組合數據碼字和糾錯碼字,構成最終的數據碼字。
步驟5:根據需求添加相應的版本、格式、定位等結構,并根據定義好的規則在矩陣中布置模塊;
步驟6:使用不同的掩模圖形對編碼區進行掩模處理(功能模塊不進行掩模),評價掩模結果,選擇評估結果最好的進行掩模。
?
圖6:QR碼的編碼過程
? ? ? 2011年9月,卡巴斯基實驗室檢測到了全球第一起惡意的QR碼攻擊。其具體過程是:用戶掃面包含有網頁地址鏈接的QR碼,當用戶登錄此網站后,手機在用戶不知情的情況下自動下載惡意軟件。2012年起,利用QR碼對手機惡意扣費的新聞在國內被報道。目前常用的攻擊方式還是僅限于利用QR碼指向惡意網站扣費或者下載病毒軟件。但是鑒于對QR碼的特性以及目前缺乏統一的管理制度,攻擊QR碼的方式將會呈現多樣化。
? ? ? 下面首先給出在實際應用中篡改QR碼的一種方法:假設攻擊者利用隨身攜帶的黑筆,根據一下方法, 涂改原始QR碼上白色模塊部分。用戶在掃描QR碼后,解碼器會自動糾錯成不同的URL地址,實現QR碼篡改。其次提出具體應用場景下潛在的攻擊方式,最后針對具體攻擊提出抵御方法。
(1)掃描原始QR碼(Q0)解碼得到相應的M0。我們架設M0是指向網站的URL;
(2)編寫與M0相近的URL地址信息Mi,i=1,2,……n,Mi是n個指向釣魚網站的URL;
(3)編碼與Mi對應的QR碼Qi,i=1,2,……n。新的QR碼要使用與原始QR碼相同的版本和掩模方式。
(4)計算QR碼Qi與Q0在相同位置但不同顏色的模塊個數Di,Di=Q0△Qi,i=1,2……n;
(5)計算Qi中為黑色模塊而在Q0中相同位置為白色模塊的比例ri;
(6)根據ri比例降序排列,排除需要修改的黑色模塊比白色模塊高的QR碼;
(7)從第一個QR碼Qi開始,比較Q0,Qi不同顏色的模塊,對照Qi,將Q0白色部分涂改成黑色,當b+1次涂改后(b為BCH編碼所能糾錯的最大值)開始核對是否可以正常解碼,且解碼信息不同于M0。重復操作找到Q’i后解碼成Mi≠M0。
在(2)中,我們偽造相近的URL地址是為了盡可能地混淆用戶,將釣魚網址誤認為是合法網址。另外,還需保證相近的URL地址未被注冊使用。
在(4)和(5)中,通過異或函數來計算對稱差分,即在計算過程中1表示黑色模塊,0表示白色模塊。RX表示需要從白色轉變成黑色的元素。
根據QR軟件的特性,我們將不同場景的攻擊類型歸納概括為基于人機交互的攻擊和自動化攻擊。
(1)網絡釣魚
網站地址(URL)被編成QR二維碼,有些網站將網站登錄的URL存儲在QR碼上。攻擊者用偽造的QR碼替換合法的QR碼,篡改登錄網站的URL信息,將用戶導向一個假冒的登錄頁面。在這種情況下,用戶掃描QR碼后,訪問了偽造的登陸頁面,將個人信息泄露給了攻擊者。
比如我將某釣魚程序掛在博客上,然后生成一個QR二維碼,然后貼在網上,并寫一些誘惑性的語言,實行釣魚。
(2)傳播惡意軟件
攻擊者將指向自動下載惡意軟件網址的命令編碼到QR碼中。在這種情況下,攻擊者可以將病毒、木馬、蠕蟲或者間諜軟件植入到用戶系統中。這些QR碼指向了自動下載木馬程序的網站,木馬通過發送短信訂閱收費的增至欄目。
(3)隱私信息泄漏
某些信息只希望被特定的接收對象接收,而不是對所有人都可見。直接使用QR碼會造成信息的泄漏,例如火車票上的二維碼會泄漏身份信息。
?
圖7:網上找的一張火車票
?
圖8:我查查掃描QR二維碼1
?
圖9:我查查掃描QR二維碼2
如圖7、9所示,身份證號是2311211995***|*0625,在我查查上直接可以查到身份證號為231121199503280625。以及票號和發車時間,最后通過網絡查詢個人信息(圖10):
?
圖10:從二維碼得到的身份證信息
注:因為此信息已經被公開 所以也不在乎這一張圖了
隨即筆者問朋友要了一張高鐵票(2013年的)用我查查軟件掃描,沒有結果。
這里還涉及到一個問題,因為掃的都是用過的票,考慮到時間戳的問題,如果是新票,會有什么結果呢?還待有機會測試。
(4)中間人攻擊
目前在國內,將QR碼應用在電子票務中已逐漸發展成趨勢。例如,用戶通過網上支付購買火車票,服務器根據用戶提供信息發放QR碼到用戶手機。雖然目前提出了時間戳技術,保證票據一次性使用,但是并不能抵抗中間人攻擊,具體流程見下圖所示:
?
圖11:用戶和服務器認為的通信
假設用戶購買電子票據所需信息M發送給服務器S,但是消息被攻擊者A攔截下來,攻擊者將發送信息M拷貝并轉發給S,S處理后將有效的QR碼信息Q回復給A,A獲得消息后將錯誤的Q’信息發送給M。而用戶和服務器兩端則認為在對方直接通話,但事實上整個過程已經攻擊者控制。特別是在用戶隨意使用未知來源的無線接入點時,這種攻擊更易實現。
將QR碼和常見的Web攻擊結合到一起,可能形成自動攻擊方式。
(1)SQL注入
試想這樣的應用環境,QR碼解碼器是鏈接到數據庫中,并且QR碼是用于執行查詢后端數據庫。在這種情形下,如果QR碼包含了像“1”OR“1=1”等查詢信息,讀取器在沒有核對此信息是否合法授權時便執行查詢命令,導致信息泄漏給非法授權的攻擊者。盡管QR碼目前為止沒有被用于數據庫查詢,但是如果此應用方式在未來被實現的話,針對這種情形的QR攻擊就很可能存在。現在,谷歌公司正在進行利用QR碼登錄到谷歌賬戶的實驗,用戶通過掃描QR碼導向一個谷歌賬戶登錄頁面。騰訊aq.qq.com里已經用到QR二維碼掃描技術,即“安全掃一掃”功能。
?
圖12:QQ安全中心安全掃一掃
(2)基于瀏覽器開發和跨站腳本攻擊
QR碼可能用于執行基于網絡和跨站腳本攻擊。我們知道,QR碼可以包含URL信息。假設編碼URL包含了警告信息,這個信息包含了對網絡瀏覽器的開發。在此情形下,當對方訪問了URL并解碼后,系統會執行或者破壞瀏覽器和設備的警告信息。
(3)命令注入
假設QR碼被用做命令行參數。攻擊者將QR碼篡改成在系統中可以任意執行的命令。在這種情況下,攻擊者可以安裝隱匿程序、間諜軟件,發動拒絕服務攻擊。
本節將抵御QR碼攻擊的方法分為兩大類:對現有的QR碼編解碼的改進和引入第三方。
針對QR碼偽造的問題,可使用常用的加密方法和消息鑒別碼的方法,在原有的二維碼編碼解碼時加入加密和解密的環節。以非對稱加密為例,假設原始信息為M0,發行方的私鑰為Kr,公鑰為KU,則M’=EKr(M)。將M’信息使用QR編碼器編碼,將生成后的二維碼和公鑰刊登在印刷品上,用戶掃描QR碼時輸入公鑰KU,若能解碼得到正確可讀的信息,則說明掃描的QR碼來源可靠。非對稱加密方式不僅能夠抵抗上樹應用場景的攻擊,還能夠抵抗大部分針對QR碼信息的篡改行為。另一種簡化方式是在QR碼中加入加密后的hash值模塊,解碼時,解碼器解密hash值并比對是否與原QR碼信息匹配,如果7所示。而抵擋QR碼的泄漏可采用對稱加密的方法,加密后的QR碼只有密鑰持有人才能正常解碼,特對對象可以正常使用QR碼,比如火車票上的二維碼。
?
圖13:加入hash值的解碼流程圖
QR碼使用范圍廣泛,但是不同用途的QR碼缺乏對應的編碼標準,也缺少第三方的管理和認證,導致了QR碼市場的混亂。引入第三方管理和認證,能夠有效攔截QR碼攜帶的惡意網址和虛假信息;提供認證機制,可以增加其來源的可靠性。本節提出了在第三方存在的情況下有效避免QR碼鏈接到惡意網址的方法(如圖13),具體步驟如下:
(1)用戶手機讀取QR碼信息鏈接第三方服務器;
(2)第三方服務器以QR碼中的碼號信息索引查詢數據庫;
(3)數據庫將查詢到的網站返回到第三方解析服務器;
(4)第三方服務器返回用戶商家鏈接地址;
(5)用戶鏈接商家地址。
?
圖14:引入第三方統一管理商家網址
QR碼作為目前被廣泛使用的二維碼,它為用戶帶來便捷的同時,也成為了惡意軟件、網絡釣魚等攻擊的攜帶者和傳播者。為此,了解QR碼編碼方式,分析其潛在攻擊方法并提出低于方案具有重要的意義。本文介紹了QR的編碼結構和編碼過程,闡述了具體篡改QR碼的操作步驟,論述了不同的QR碼應用場景下的潛在的攻擊方式,提出了針對編碼解碼器的改進方案和引入第三方管理這兩類方式來抵抗QR碼的攻擊。
參考:信息網絡安全