2. 紫金山实验室, 南京 211189;
3. 上海交通大学 网络空间安全学院, 上海 200240;
4. 东南大学 信息科学与工程学院, 南京 211189
2. Purple Mountain Laboratories, Nanjing 211189, China;
3. School of Cyber Science and Engineering, Shanghai Jiao Tong University, Shanghai 200240, China;
4. School of Information Science and Engineering, Southeast University, Nanjing 211189, China
近年来,随着移动互联网的飞速发展,移动终端数量迅速增长,成本低廉且极易部署的二维码得到广泛应用。快速响应矩阵图(quick response, QR)码是最为广泛应用的一种二维码(除非特别指出,本文所述二维码均指代QR码)。然而,二维码在为人们提供便利性的同时,其所带来的安全问题也不容忽视。
相比于一维条码,二维码信息容量更大,纠错性能更强,广泛应用于信息发布、商品溯源与身份认证,甚至是对安全性要求极高的移动支付等场景。正因为如此,针对二维码的攻击层出不穷。过去曾多次出现使用二维码向解码库中注入结构化查询语言(structured query language,SQL)语句或代码,触发内存溢出或调用系统函数的攻击案例[1]。此外,恶意的二维码还可用于网络钓鱼攻击或恶意软件传播。2011年,卡巴斯基实验室检测到第一个针对二维码的危险攻击[2],这次攻击在二维码内编码了一个恶意的统一资源定位系统(uniform resource locator,URL),并使用网络钓鱼和恶意软件传播,从连接设备上获取用户的个人信息。Kharraz等[3]调查发现,多数用户会仅仅出于好奇而扫描陌生二维码。因此,针对二维码安全性的研究非常重要。
Zhou等[4]提出一种采用发光二极管对二维码进行攻击的方案,该方案使得相机识别到的二维码与人眼所看到的二维码不同,其本质是将两个二维码相叠加,不过该方案需要专用的设备,且实现难度较大。Yuan等[5]提出一种类似的方案,该方案将二维码做成上下两层,从不同的角度扫描将得到不同的结果,这种二维码变体被称为双层二维码。该方案成本较低、实现简单,但视觉特征明显,不宜用于攻击。Dabrowski等[6]提出了一种名为二维码嵌入攻击(barcode-in-barcode attack)的劫持攻击方案,这种方法通过特制符合多种标准的二维码来造成扫码器的混乱。当两个用户用不同的手机或应用程序扫描相同的特制二维码时,有可能会识别到不同的内容,导致嵌入攻击允许通过手机区分用户(例如,将iPhone用户重定向到比Android用户更昂贵的产品)。Dabrowski等[6]还提到嵌入攻击可以有多种方式,比如保留或隐藏静区、变更嵌入二维码的形式以及变更嵌入位置等,但并未对每种情况进行详细的定性分析。该项研究尚不完善,且攻击留下的视觉痕迹较为明显。2020年,Chou等[7]利用相似的原理,提出了一种名为“nested QR”的嵌入方式。这种方式将一个二维码缩小后再进行嵌入,然而其视觉特征更加明显,故实用性不大。
可见,目前针对二维码的攻击方式或成本过高、难度过大,或视觉特征明显,故少见于实际攻击场景。为了应对二维码嵌入攻击遇到的各种问题,本文首先详细分析了嵌入攻击时静区与定位图案的影响,并使用中国大陆常用的扫码软件进行测试。然后,针对现有二维码嵌入攻击高度依赖恶意二维码的定位图案实现扫描劫持而导致极易被视觉觉察的问题,提出并验证了一种基于无痕嵌入的二维码不可见劫持攻击方案。这种方案利用二维码定位图案的抗污损能力,可以在一定程度上修改嵌入二维码的定位图案而不影响扫码软件识别,从而隐藏嵌入的恶意二维码。通过对市面上最常用的扫码软件如微信、支付宝等进行测试分析,发现不同扫码软件对不同定位图案的识别能力相差甚远,利用该特性可以在隐藏视觉特征的同时对不同软件实施针对性的攻击。通过选择合适的定位图案样式,可以实现只有指定软件识别结果为恶意二维码而其他软件识别结果为原始二维码,这一效果是可以根据测试结果提前定制的。
本文还设计开发了一套二维码不可见劫持攻击原型系统。该原型系统基于Java实现,分为原始二维码识别模块与攻击图像生成模块,可以在识别欲攻击的二维码后生成对应的攻击图像,并依据所需欺骗的软件等具体要求指定恶意二维码的嵌入位置、定位图案样式以及是否保留静区等信息。
1 二维码的解码依据各部分的作用,二维码主要可以分为功能区和数据区。功能区包括定位图案、时序图案、版本信息、格式信息以及对齐图案,主要用以辅助扫码器定位并正确识别信息。由于功能区与承载的数据无关,因此功能区的很大一部分即使被污损也不影响二维码的读取。
以版本号为7的二维码为例。位于3个角上较为显眼的3个矩形区域被称为定位图案,其功能为指示二维码的位置和方向,这3个定位图案使得二维码支持从任意角度进行识别。
为提高识别速度与准确率,定位图案以及整个二维码的四周区域不会进行填充,这些区域被称为“静区(quiet zone)”。当多个二维码距离较近时,静区将有助于扫码器进行区分。类似的设计在一维条形码上也有。定位图案与静区将会在很大程度上影响扫码软件对二维码的定位速度,并且也是二维码最为显著的视觉特征。在功能区以外的区域是二维码的数据区,包括数据码字和纠错码字,用于承载信息,是二维码中面积最大的区域。
二维码的解码是编码的逆过程[8]。该过程的简易流程为:
1) 定位二维码。在扫描时,首先需要通过定位图案获取二维码所在的位置和方向,并将较明亮的像素点和较暗的像素点分别识别为0和1。这一步尤为重要,在2.2节中将会看到,即使只去除二维码的一个定位图案,也会导致相机完全无法识别到二维码的存在。
2) 提取格式信息。由于同一二维码可以采用8种掩码图案,共40种版本,故识别到二维码后,需要先提取二维码的格式信息(包括掩码),并对出现的错误进行纠正。
3) 确定版本信息。这一过程只适用于版本7及以上的二维码。
4) 释放掩码模式。将提取出的掩码信息进行逆运算,将二维码恢复至应用掩码前的状态以提取码字。
5) 提取数据码字与纠错码字。将数据区的数据加以提取。
6) 检错。通常由于光线、污损或设计的原因(如常见的在中心添加logo的行为),解码出的码字并不完整,需要对数据区的码字执行检错并纠正可能出现的错误,再将最终结果输出。
2 二维码不可见劫持攻击 2.1 实现原理现有的二维码嵌入攻击的基本思路是将一个较小尺寸的二维码嵌入原始二维码中。嵌入的二维码可以是QR码,也可以是其他类型,这取决于具体应用场景。例如,可以在QR码内部嵌入Aztec码或数据矩阵。由于QR码在民用领域的广泛使用,多数具备扫码功能的软件只支持QR码,故本文仅探讨QR码内嵌入QR码的情况。
现有的二维码嵌入攻击的视觉特征过于明显,这主要是由于嵌入二维码的定位图案辨识度过高,且四周的静区使得嵌入二维码过于突出。本文所提出的二维码不可见劫持攻击通过篡改定位图案与隐藏静区来达到无痕嵌入的效果,如图 1所示。可以看到,篡改定位图案后的图 1a中,原先显眼的定位图案已经不具辨识度,但是周围的静区依然暴露了恶意二维码的嵌入位置。进一步地,图 1b隐藏了恶意二维码的静区,而恶意二维码被嵌入在靠左下角的位置。这种嵌入方式做到了在不指明位置的情况下普通用户难以发现嵌入图案,攻击后的二维码可以伪装成一个正常的二维码,只需将其打印并张贴,就可以实施攻击。
同时,在保持攻击不可见的前提下,精心设计的定位图案还可以达到针对特定软件实施攻击的效果。例如,图 1c所示的攻击样例可以实现区分微信与支付宝从而实施选择性劫持攻击的效果。下面将主要围绕篡改定位图案与隐去静区的思路与原理展开。
2.2 定位图案篡改二维码最显著的视觉特征是其独特的3个定位图案,也正因为如此,若将二维码直接嵌入,过多的定位点将不可避免地很容易被人察觉。
由于二维码的定位图案不随其尺寸大小的改变而改变,因此可以尝试将内外二维码的一个定位图案加以重合,从而将一个二维码中的定位点数量从6个降低为5个,这样可以在一定程度上减弱其视觉特征,并且由于覆盖原始二维码数据区的部分减少,可以大大降低对原始二维码的破坏程度。
更进一步地,本文尝试将二维码中的一个定位图案去除。然而,实验结果表明,去掉任意一个定位图案都会导致解码失败。这是因为3个定位图案对二维码的定位起着至关重要的作用,即使只去除一个定位图案,扫码软件也无法正确定位该二维码。
虽然实验结果表明定位图案不能去除,但由于定位图案不承载数据信息,故在一定程度上修改定位图案后依然可能不影响识别。考虑到实际应用中,二维码常遇到压缩、污损等情况,相机识别到的定位图案往往不会是标准样式,因此扫码软件对定位图案的要求往往会放宽。例如,微信的扫码引擎为提高解码的成功率,采用了基于面积法的定位点检测方法,即检测到黑白面积为一定比值的同心矩形区域时即将其标记为定位图案[9]。
目前,已经有许多美化二维码的方案[10],这些方案利用了类似的特性,可以在不影响可识别性的情况下对二维码进行一定程度的修改。因而,二维码的定位图案与标准样式不完全一致时仍有可能被扫码器正确识别。一般而言,二维码的每个像素只有黑与白两种可能,对应二进制中的1和0。对定位图案进行修改时,可分为两种基本类型,即将黑色像素块以白色进行填充或将白色像素块以黑色进行填充。
首先尝试将黑色像素块修改为白色,并生成图 2中序号1—8所示的一组修改后的定位图案。本文先修改了不同位置上的一个像素点,再逐渐尝试增加修改的像素点个数。第8种修改方式为极端情况,只保留了轴线上的黑色像素块。
然后尝试将白色像素块修改为黑色,生成如图 2中序号9—16所示的一组定位图案。本文先修改了定位图案内部的白色像素块,再尝试修改定位图案四周的白色像素块。
由于不同扫码软件所采用的算法不同,故不同的扫码软件对定位图案篡改的容忍度不同。因此,在扫描篡改定位图案后的二维码时,不同软件会有完全不同的反应,A软件可能可以顺利识别出篡改后的二维码而B软件可能完全无法识别。利用这一特性,结合二维码不可见嵌入攻击,还可以实现对软件的选择性攻击。当原始的二维码无法被A软件识别却能被B软件识别,而嵌入的二维码无法被B软件识别却能被A软件识别时,就能构造出一个具备软件选择性的恶意二维码。
2.3 静区隐藏通常,为了增加扫码器成功识别的概率,二维码的四周会留有一圈空白区域不做填充。从图 3a可见,嵌入的二维码周围依然保留了一圈白色区域,这被称为静区。静区本身不承载信息,主要用于辅助定位。为尽可能隐藏视觉痕迹,可以尝试将静区隐藏,效果如图 3b所示。
静区隐藏可以有效减少嵌入二维码的视觉特征,但同时也会影响嵌入二维码的识别。隐去静区后,嵌入二维码周围的像素点将会干扰扫码软件的定位与识别,因此在某些情况下软件将难以识别嵌入二维码。同时,隐去静区后,嵌入二维码的定位图案与其周围像素点组合,可以等效为一种新的篡改后的定位图案,也会对识别效果产生影响。
静区可以辅助扫码器快速识别二维码,但多数情况下即使去除了静区,扫码器也可以正确识别,只是识别速度可能会不同程度降低。因此,在应用二维码嵌入攻击时,在恰当的位置隐藏静区,可以在不影响攻击效果的前提下达到减少视觉特征的目的。
2.4 二维码不可见劫持攻击通过对以上因素的探究,可以总结出两个重要规律:
1) 定位图案可以容忍很大程度上的修改,并且不同的修改方法对不同识别软件的效果不同。利用这一特性可以生成多种伪定位图案,根据测试结果,可以实现对某些软件实施针对性攻击。
2) 隐藏静区对攻击的影响处于可以接受的范围内。
基于此,本文提出一种基于无痕嵌入的二维码不可见劫持攻击方案。该方案利用了一种在视觉上不可辨认的定位图案,如图 4a所示。这个定位图案与常见的二维码的定位图案完全不同,利用它可以生成如图 4b所示的二维码。
为具体探究二维码不可见嵌入攻击的可实现性,本文设计开发了一套二维码不可见劫持攻击原型系统。该系统基于Java实现,分为原始二维码识别模块与攻击图像生成模块,可以在识别欲攻击的二维码后生成对应的攻击图像,并依据所需欺骗的软件等具体要求指定恶意二维码的嵌入位置、定位图案样式以及是否保留静区等信息。该系统整体架构如图 5所示。
运行时,系统首先会对用户欲嵌入的信息及目标二维码的信息进行检查,并分别计算其对应的数据码字与纠错码字。根据计算出的结果再分别计算承载信息所需的二维码的最小尺寸。为使最终生成的攻击图像不至于过大,恶意二维码的纠错级别通常设置为最低纠错级别,尺寸一般选择计算出的最小尺寸。
3 实验与测试 3.1 定位图案篡改效果测试为具体探究定位图案篡改所带来的影响,利用二维码不可见劫持攻击原型系统,依次生成了带有图 2中16种定位图案的二维码以供测试。测试结果如表 1所示。
图案编号 | 微信 | 支付宝 | iPhone相机 |
1 | 否 | 迅速 | 否 |
2 | 迅速 | 迅速 | 困难 |
3 | 迅速 | 迅速 | 困难 |
4 | 迅速 | 迅速 | 否 |
5 | 否 | 迅速 | 否 |
6 | 迅速 | 迅速 | 迅速 |
7 | 否 | 困难 | 困难 |
8 | 否 | 迅速 | 否 |
9 | 迅速 | 迅速 | 迅速 |
10 | 困难 | 否 | 否 |
11 | 困难 | 否 | 否 |
12 | 否 | 困难 | 迅速 |
13 | 迅速 | 迅速 | 迅速 |
14 | 迅速 | 迅速 | 否 |
15 | 迅速 | 迅速 | 困难 |
16 | 否 | 困难 | 迅速 |
由表 1所示的测试结果可见,不同的扫码软件对不同的定位图案的识别能力大相径庭,这使得针对特定软件进行攻击成为可能。例如,若采用序号为5的定位图案样式,由于3种软件中只有支付宝能够迅速识别该定位图案,其他软件扫描攻击图像时将无法识别恶意QR码,则理论上可以在这3种软件中只针对支付宝实施攻击。
3.2 静区隐藏效果测试欲探究静区隐藏所带来的影响,需要对比静区隐藏前后扫码软件的识别能力。本文分别对图 3隐去静区前后的二维码进行测试。测试软件选取了中国大陆居民常用的8种扫码软件。
测试结果如表 2所示。相比于隐藏静区前,大部分软件能正确识别隐藏静区后的二维码,少部分软件的识别速度与准确率有不同程度的降低。这主要是因为隐藏静区后定位图案遭到一定程度的破坏,且环绕嵌入二维码四周的黑白像素点易造成软件混淆,导致部分软件难以定位二维码。
3.3 软件选择性攻击效果测试
为验证2.4节中提及的针对软件进行选择性攻击的方案,本文利用原型系统生成了一个特制的二维码,即图 1c所示的二维码。图中原始二维码的定位图案采用了图 2的样式1,而嵌入二维码的定位图案则采用了图 4的样式。在选择合适的嵌入位置后,微信将只能识别出嵌入的二维码,而无法识别原始的二维码。支付宝理论上两种均可识别,但是由于精心挑选的嵌入位置与隐去静区的作用,使得支付宝将优先识别原始二维码。
可以看到,这里生成的图像与常见二维码看起来几乎没有什么区别,而这样的一个看似普通的二维码对最常见的扫码软件,例如微信与支付宝,具有良好的区分度。本文对市面上常见的数款移动智能设备进行了测试,测试结果表明:该方法在多种设备(小米9、小米MIX 2S、vivo IQOO、华为P30、荣耀V30、iPhone11、iPhone12)上实现效果均一致,微信识别结果均为嵌入二维码(Small),而支付宝识别结果均为原始二维码(This is the big one.)。因此,二维码不可见嵌入攻击对软件的选择性攻击是完全可实现、稳定且可控的。
由2.2节分析可见,不同扫码软件对不同定位图案的识别能力不同,因此对软件的选择性攻击依赖于定位图案的选择。由于每个定位图案均有多种修改方案,且3个定位图案可分别采用不同修改方式,因此本文没有一一进行测试。但是,由于测试过程完全可以通过编写程序来自动化实现,当采集到足够多的样本测试结果之后,攻击者理论上可实现针对几乎任意扫码软件的攻击。
4 对抗方案与可行性分析对抗二维码不可见劫持攻击主要可以从3个方面入手:1) 人机交互层面。这一层面进行防范只需要修改扫码软件的业务逻辑,以更合理的方式对用户进行提示。2) 二维码的解码层面。这涉及到二维码识别的核心代码部分。目前市面上最为流行的二维码解码软件很多是基于开源代码(如ZXing)开发而来的,在这一层面进行修改可能更为困难。3) 最根本的层面,即二维码编码层面。在这一层面开发私有标准可以保障二维码的安全性。
4.1 人机交互层面扫码软件可以在扫码界面框选识别出的二维码。图 6a所示的框选扫描到的二维码,可以有效地帮助用户判断是否扫描到了正确的二维码。然而,许多主流软件在扫码识别时,并不会框选出识别到的二维码,只是在识别到的二维码中心加以标记,如图 6b所示。由于嵌入二维码在原始二维码内,用户很难判断扫描到的是否为原始二维码。
另外,对扫码识别出的信息的确认亦非常重要。很多主流软件在扫码时识别速度很快,往往取景框在对准二维码的同时便已识别完成并跳转至相关页面。这种情况非常危险,因为用户在扫码前并不知道二维码内编码了什么信息。此外,许多软件在扫码完成后打开相关网页时甚至不会显示该网页的完整网址。
4.2 解码层面二维码不可见劫持攻击本质上是在一张图片内放置两个二维码。通常地,在扫描到两个独立的二维码时,少数支持一图多码的软件能够识别出有两个二维码的存在并提示用户进行选择。但是,在扫描嵌入后的二维码时,此类软件往往无法识别到两个二维码的存在。这种现象主要是由于内外二维码处于同一矩形区域,且识别难度差距较大,导致扫码软件为了保证用户体验而在识别到一个二维码后的短时间内即停止识别。扫码软件应将扫码时间适当加长,以充分识别图像内存在的所有二维码。在发现两个二维码同时存在于同一个矩形区域时,可以对用户加以提醒。
由于一图多码技术本身存在一定技术难度,且两个二维码存在于同一个矩形区域内,在解码层面实现防护相对困难,但是若能实现的话,防护效果相当显著。
另外,还可以在扫码软件中嵌入安全的浏览器以及防钓鱼功能。类似的研究已经在开展中。有研究者提出了一种名为Safe QR的扫描器[11],这种扫描器基于两个现有的Web服务:Google Safe Browsing API和Phishtank API。
4.3 编码层面在编码层面,可以采用私有标准进行编码。采用私有标准的好处是显而易见的:当标准内容与编解码系统细节不公开时,攻击者很难针对该标准进行攻击;且私有标准仅能在特定软件的特定使用环境下使用,二维码不可见劫持攻击的攻击效果将大大减弱。
这种方案的缺点在于实现难度很大。目前,二维码生成与解码技术已经非常成熟,采用私有标准可能意味着更多的程序漏洞以及更差的用户体验,且过多的私有标准不利于技术的迭代发展。
目前,已有一些面向商业的安全二维码[12-13]。为防止攻击者对其进行安全性分析,此类方案没有公开其专有技术。此外,有研究人员[14]还试图重新设计二维码的各部分来加强二维码的安全性。
5 结论针对现有二维码嵌入攻击视觉特征明显的问题,本文提出了一种基于定位图案篡改与静区隐藏的二维码不可见嵌入攻击方案。该方案可以低成本地实施高隐蔽性攻击。对中国大陆常用扫码软件的测试与分析发现,特定的定位图案可以有效针对软件实施选择性攻击。同时,由于二维码具有人眼不可读的特性,修改定位图案并隐去静区后的恶意二维码将难以被肉眼发现。本文还开发了一套原型系统,并利用该原型系统生成了可以对微信与支付宝进行选择性攻击的二维码。最后,本文从人机交互层面、解码层面和编码层面给出了对抗二维码不可见劫持攻击的方案。
[1] |
FOCARDI R, LUCCIO F L, WAHSHEH H A M. Security threats and solutions for two-dimensional barcodes: A comparative study[M]// DAIMI K. Computer and network security essentials. Cham, Switzerland: Springer, 2018: 207-219.
|
[2] |
FOCARDI R, LUCCIO F L, WAHSHEH H A M. Usable security for QR code[J]. Journal of Information Security and Applications, 2019, 48: 102369. |
[3] |
KHARRAZ A, KIRDA E, ROBERTSON W, et al. Optical delusions: A study of malicious QR codes in the wild[C]// 2014 44th Annual IEEE/IFIP International Conference on Dependable Systems and Networks. Atlanta, USA, 2014: 192-203.
|
[4] |
ZHOU A F, SU G Y, ZHU S L, et al. Invisible QR code hijacking using smart LED[J]. Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies, 2019, 3(3): 126. |
[5] |
YUAN T L, WANG Y L, XU K, et al. Two-layer QR codes[J]. IEEE Transactions on Image Processing, 2019, 28(9): 4413-4428. DOI:10.1109/TIP.2019.2908490 |
[6] |
DABROWSKI A, KROMBHOLZ K, ULLRICH J, et al. QR inception: Barcode-in-barcode attacks[C]// Proceedings of the 4th ACM Workshop on Security and Privacy in Smartphones & Mobile Devices. New York, USA, 2014: 3-10.
|
[7] |
CHOU G J, WANG R Z. The nested QR code[J]. IEEE Signal Processing Letters, 2020, 27: 1230-1234. DOI:10.1109/LSP.2020.3006375 |
[8] |
TIWARI S. An introduction to QR code technology[C]// 2016 International Conference on Information Technology (ICIT). Bhubaneswar, India, 2016: 39-44.
|
[9] |
蔡博仑. 微信二维码引擎OpenCV开源! 3行代码让你拥有微信扫码能力[EB/OL]. (2021-01-31)[2021-06-15]. https://mp.weixin.qq.com/s/pphBiEX099ZkDV0hWwnbhw. CAI B L. WeChat QR code engine OpenCV open source! 3 Lines of codes let you have the ability to scan the code[EB/OL]. (2021-01-31)[2021-06-15]. https://mp.weixin.qq.com/s/pphBiEX099ZkDV0hWwnbhw. (in Chinese) |
[10] |
TRPOVSKI Z. Geometric modifications of QR code[C]// 2017 South Eastern European Design Automation, Computer Engineering, Computer Networks and Social Media Conference (SEEDA-CECNSM). Kastoria, Greece, 2017: 1-6.
|
[11] |
YAO H P, SHIN D W. Towards preventing QR code based attacks on Android phone using security warnings[C]// Proceedings of the 8th ACM SIGSAC Symposium on Information, Computer and Communications Security. New York, USA, 2013: 341-346.
|
[12] |
2D Technology Group. Barcode security suite[EB/OL]. (2008)[2021-07-23]. https://www.2dtg.com/node/74.
|
[13] |
YAKSHTES V, SHISHKIN A. Mathematical method of 2D barcode authentication and protection for embedded processing: US8297510B1[P]. 2012-10-30.
|
[14] |
CHATTERJEE S K, SAHA S, KHALID Z, et al. Space effective and encrypted QR code with sender authorized security levels[C]// 2018 IEEE 8th Annual Computing and Communication Workshop and Conference (CCWC). Las Vegas, USA, 2018: 439-443.
|